From a070797529c920b582667a76e8665e5f27f1dd3c Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Fri, 30 Apr 2021 11:54:10 +0200 Subject: [PATCH 1/4] repo-sqale: all transformers merged into Q*Mapping classes Mapping returned new transformer every time, but in the end transformer was stateless too (most of the state is in other context objects). Transformer support is now accessible statically to make this easier. While some "abstract" mappers like QObjectMapping got bigger, it is much easier to have just one concept instead of two. Audit (non-sqale) part is not part of this commit. --- .../repo/sqale/SqaleTransformerSupport.java | 7 + .../sqale/operations/AddObjectOperation.java | 22 +- .../qmodel/ObjectTemplateSqlTransformer.java | 34 --- .../sqale/qmodel/QObjectTemplateMapping.java | 16 +- .../repo/sqale/qmodel/QOwnedByMapping.java | 4 +- .../repo/sqale/qmodel/SqaleTableMapping.java | 186 +++++++++++++- .../sqale/qmodel/SqaleTransformerBase.java | 220 ---------------- .../sqale/qmodel/TransformerForOwnedBy.java | 1 - ...CertificationDefinitionSqlTransformer.java | 45 ---- ...QAccessCertificationDefinitionMapping.java | 27 +- .../assignment/AssignmentSqlTransformer.java | 106 -------- .../qmodel/assignment/QAssignmentMapping.java | 88 ++++++- .../repo/sqale/qmodel/cases/QCaseMapping.java | 11 +- .../qmodel/common/QContainerMapping.java | 23 +- .../ConnectorHostSqlTransformer.java | 34 --- .../connector/ConnectorSqlTransformer.java | 43 ---- .../connector/QConnectorHostMapping.java | 18 +- .../qmodel/connector/QConnectorMapping.java | 27 +- .../qmodel/focus/FocusSqlTransformer.java | 88 ------- .../focus/GenericObjectSqlTransformer.java | 32 --- .../sqale/qmodel/focus/QFocusMapping.java | 68 ++++- .../qmodel/focus/QGenericObjectMapping.java | 18 +- .../repo/sqale/qmodel/focus/QUserMapping.java | 34 ++- .../qmodel/focus/UserSqlTransformer.java | 48 ---- .../LookupTableRowSqlTransformer.java | 36 --- .../LookupTableSqlTransformer.java | 41 --- .../lookuptable/QLookupTableMapping.java | 24 +- .../lookuptable/QLookupTableRowMapping.java | 22 +- .../sqale/qmodel/node/NodeSqlTransformer.java | 31 --- .../repo/sqale/qmodel/node/QNodeMapping.java | 16 +- .../object/ContainerSqlTransformer.java | 56 ----- .../qmodel/object/ObjectSqlTransformer.java | 236 ------------------ .../OperationExecutionSqlTransformer.java | 42 ---- .../sqale/qmodel/object/QObjectMapping.java | 204 ++++++++++++++- .../object/QOperationExecutionMapping.java | 30 ++- .../sqale/qmodel/object/QTriggerMapping.java | 19 +- .../qmodel/object/TriggerSqlTransformer.java | 32 --- .../sqale/qmodel/other/QDashboardMapping.java | 9 - .../repo/sqale/qmodel/other/QFormMapping.java | 9 - .../qmodel/other/QFunctionLibraryMapping.java | 9 - .../other/QObjectCollectionMapping.java | 9 - .../sqale/qmodel/other/QSequenceMapping.java | 9 - .../sqale/qmodel/ref/QReferenceMapping.java | 24 +- .../qmodel/ref/ReferenceSqlTransformer.java | 55 ---- .../qmodel/report/QReportDataMapping.java | 20 +- .../sqale/qmodel/report/QReportMapping.java | 21 +- .../report/ReportDataSqlTransformer.java | 36 --- .../qmodel/report/ReportSqlTransformer.java | 38 --- .../qmodel/resource/QResourceMapping.java | 44 +++- .../resource/ResourceSqlTransformer.java | 63 ----- .../role/AbstractRoleSqlTransformer.java | 64 ----- .../qmodel/role/QAbstractRoleMapping.java | 33 ++- .../sqale/qmodel/role/QArchetypeMapping.java | 8 - .../repo/sqale/qmodel/role/QRoleMapping.java | 17 +- .../sqale/qmodel/role/QServiceMapping.java | 17 +- .../sqale/qmodel/role/RoleSqlTransformer.java | 32 --- .../qmodel/role/ServiceSqlTransformer.java | 32 --- .../sqale/qmodel/shadow/QShadowMapping.java | 35 ++- .../qmodel/shadow/ShadowSqlTransformer.java | 51 ---- .../qmodel/system/QSecurityPolicyMapping.java | 9 - .../system/QSystemConfigurationMapping.java | 9 - .../qmodel/system/QValuePolicyMapping.java | 9 - .../repo/sqale/qmodel/task/QTaskMapping.java | 41 ++- .../sqale/qmodel/task/TaskSqlTransformer.java | 55 ---- .../repo/sqale/update/RootUpdateContext.java | 9 +- .../repo/sqale/update/SqaleUpdateContext.java | 5 +- .../repo/sqlbase/SqlTransformerSupport.java | 7 + .../sqlbase/mapping/QueryTableMapping.java | 1 + 68 files changed, 995 insertions(+), 1774 deletions(-) delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ObjectTemplateSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTransformerBase.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/AccessCertificationDefinitionSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/AssignmentSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorHostSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/FocusSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/GenericObjectSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/UserSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableRowSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/NodeSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ContainerSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ObjectSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/OperationExecutionSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/TriggerSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/ReferenceSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportDataSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/ResourceSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/AbstractRoleSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/RoleSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/ServiceSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/ShadowSqlTransformer.java delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/TaskSqlTransformer.java diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java index 0bf18204c9b..7674440d99c 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java @@ -20,8 +20,15 @@ */ public class SqaleTransformerSupport extends SqlTransformerSupport { + private static SqaleTransformerSupport instance; + public SqaleTransformerSupport(SchemaService schemaService, SqaleRepoContext sqaleRepoContext) { super(schemaService, sqaleRepoContext); + instance = this; + } + + public static SqaleTransformerSupport getInstance() { + return instance; } private SqaleRepoContext sqaleRepoContext() { diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java index 4e07ff7847e..fff4d6ecdf3 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java @@ -19,11 +19,10 @@ import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.sqale.ContainerValueIdGenerator; import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; -import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; +import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; import com.evolveum.midpoint.schema.result.OperationResult; @@ -49,7 +48,7 @@ public class AddObjectOperation, R ex private SqlRepoContext sqlRepoContext; private Q root; - private ObjectSqlTransformer transformer; + private QObjectMapping rootMapping; private MObjectType objectType; public AddObjectOperation(@NotNull PrismObject object, @@ -67,11 +66,8 @@ public String execute(SqaleTransformerSupport transformerSupport) sqlRepoContext = transformerSupport.sqlRepoContext(); Class schemaObjectClass = object.getCompileTimeClass(); objectType = MObjectType.fromSchemaType(schemaObjectClass); - SqaleTableMapping rootMapping = - sqlRepoContext.getMappingBySchemaType(schemaObjectClass); + rootMapping = sqlRepoContext.getMappingBySchemaType(schemaObjectClass); root = rootMapping.defaultAlias(); - transformer = (ObjectSqlTransformer) - rootMapping.createTransformer(transformerSupport); // we don't want CID generation here, because overwrite works different then normal add @@ -100,9 +96,9 @@ private String addObjectWithOid() throws SchemaException { long lastCid = new ContainerValueIdGenerator().generateForNewObject(object); try (JdbcSession jdbcSession = sqlRepoContext.newJdbcSession().startTransaction()) { S schemaObject = object.asObjectable(); - R row = transformer.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + R row = rootMapping.toRowObjectWithoutFullObject(schemaObject, jdbcSession); row.containerIdSeq = lastCid + 1; - transformer.setFullObject(row, schemaObject); + rootMapping.setFullObject(row, schemaObject); UUID oid = jdbcSession.newInsert(root) // default populate mapper ignores null, that's good, especially for objectType @@ -110,7 +106,7 @@ private String addObjectWithOid() throws SchemaException { .executeWithKey(root.oid); row.objectType = objectType; // sub-entities can use it, now it's safe to set it - transformer.storeRelatedEntities(row, schemaObject, jdbcSession); + rootMapping.storeRelatedEntities(row, schemaObject, jdbcSession); jdbcSession.commit(); return Objects.requireNonNull(oid, "OID of inserted object can't be null") @@ -121,7 +117,7 @@ private String addObjectWithOid() throws SchemaException { private String addObjectWithoutOid() throws SchemaException { try (JdbcSession jdbcSession = sqlRepoContext.newJdbcSession().startTransaction()) { S schemaObject = object.asObjectable(); - R row = transformer.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + R row = rootMapping.toRowObjectWithoutFullObject(schemaObject, jdbcSession); // first insert without full object, because we don't know the OID yet UUID oid = jdbcSession.newInsert(root) @@ -136,7 +132,7 @@ private String addObjectWithoutOid() throws SchemaException { long lastCid = new ContainerValueIdGenerator().generateForNewObject(object); // now to update full object with known OID - transformer.setFullObject(row, schemaObject); + rootMapping.setFullObject(row, schemaObject); jdbcSession.newUpdate(root) .set(root.fullObject, row.fullObject) .set(root.containerIdSeq, lastCid + 1) @@ -145,7 +141,7 @@ private String addObjectWithoutOid() throws SchemaException { row.oid = oid; row.objectType = objectType; // sub-entities can use it, now it's safe to set it - transformer.storeRelatedEntities(row, schemaObject, jdbcSession); + rootMapping.storeRelatedEntities(row, schemaObject, jdbcSession); jdbcSession.commit(); return oidString; diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ObjectTemplateSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ObjectTemplateSqlTransformer.java deleted file mode 100644 index b4f23b44494..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ObjectTemplateSqlTransformer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; - -public class ObjectTemplateSqlTransformer - extends ObjectSqlTransformer { - - public ObjectTemplateSqlTransformer( - SqlTransformerSupport transformerSupport, QObjectTemplateMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public void storeRelatedEntities(@NotNull MObject row, - @NotNull ObjectTemplateType schemaObject, @NotNull JdbcSession jdbcSession) { - super.storeRelatedEntities(row, schemaObject, jdbcSession); - - storeRefs(row, schemaObject.getIncludeRef(), - QObjectReferenceMapping.INSTANCE_INCLUDE, jdbcSession); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java index 674c523ccd8..c97b359d9e0 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java @@ -8,9 +8,12 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType.F_INCLUDE_REF; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; @@ -37,13 +40,22 @@ protected QObjectTemplate newAliasInstance(String alias) { } @Override - public ObjectTemplateSqlTransformer createTransformer( + public QObjectTemplateMapping createTransformer( SqlTransformerSupport transformerSupport) { - return new ObjectTemplateSqlTransformer(transformerSupport, this); + return this; } @Override public MObject newRowObject() { return new MObject(); } + + @Override + public void storeRelatedEntities(@NotNull MObject row, + @NotNull ObjectTemplateType schemaObject, @NotNull JdbcSession jdbcSession) { + super.storeRelatedEntities(row, schemaObject, jdbcSession); + + storeRefs(row, schemaObject.getIncludeRef(), + QObjectReferenceMapping.INSTANCE_INCLUDE, jdbcSession); + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QOwnedByMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QOwnedByMapping.java index b9b1c1ec9db..6345dca8ff4 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QOwnedByMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QOwnedByMapping.java @@ -6,7 +6,7 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; /** * Marks mappings for {@link QOwnedBy} entities. @@ -21,5 +21,5 @@ public interface QOwnedByMapping { /** Returns a row with foreign key fields referencing the provided owner row. */ R newRowObject(OR ownerRow); - TransformerForOwnedBy createTransformer(SqlTransformerSupport transformerSupport); + R insert(S schemaObject, OR ownerRow, JdbcSession jdbcSession); } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java index 81b5cbdb34b..0b2d5986a9c 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java @@ -6,24 +6,47 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; import java.util.function.Function; +import javax.xml.namespace.QName; +import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.*; +import com.querydsl.sql.ColumnMetadata; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; import com.evolveum.midpoint.repo.sqale.delta.item.*; import com.evolveum.midpoint.repo.sqale.filtering.RefItemFilterProcessor; import com.evolveum.midpoint.repo.sqale.filtering.UriItemFilterProcessor; import com.evolveum.midpoint.repo.sqale.mapping.SqaleItemSqlMapper; +import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; +import com.evolveum.midpoint.repo.sqale.qmodel.ref.MReference; +import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.filtering.item.EnumItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.PolyStringItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.TimestampItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; +import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** * Mapping superclass with common functions for {@link QObject} and non-objects (e.g. containers). @@ -36,7 +59,9 @@ */ public abstract class SqaleTableMapping, R> extends QueryTableMapping - implements SqaleMappingMixin { + implements SqaleMappingMixin, SqlTransformer { + + protected final Logger logger = LoggerFactory.getLogger(getClass()); protected SqaleTableMapping( @NotNull String tableName, @@ -169,4 +194,163 @@ public > SqaleItemSqlMapper enumMapper( ctx -> new EnumItemDeltaProcessor<>(ctx, rootToQueryItem), rootToQueryItem); } + + // Previously transformer code from here down + // TODO inline later + protected QueryTableMapping mapping() { + return this; + } + + @Override + public S toSchemaObject(R row) { + throw new UnsupportedOperationException("Use toSchemaObject(Tuple,...)"); + } + + /** + * Transforms row Tuple containing {@link R} under entity path and extension columns. + */ + @Override + public S toSchemaObject(Tuple tuple, Q entityPath, + Collection> options) + throws SchemaException { + S schemaObject = toSchemaObject(tuple.get(entityPath)); + processExtensionColumns(schemaObject, tuple, entityPath); + return schemaObject; + } + + @SuppressWarnings("unused") + protected void processExtensionColumns(S schemaObject, Tuple tuple, Q entityPath) { + // empty by default, can be overridden + } + + /** + * Returns {@link ObjectReferenceType} with specified oid, proper type based on + * {@link MObjectType} and, optionally, target name/description. + * Returns {@code null} if OID is null. + * Fails if OID is not null and {@code repoObjectType} is null. + */ + @Nullable + protected ObjectReferenceType objectReferenceType( + @Nullable String oid, MObjectType repoObjectType, String targetName) { + if (oid == null) { + return null; + } + if (repoObjectType == null) { + throw new IllegalArgumentException( + "NULL object type provided for object reference with OID " + oid); + } + + return new ObjectReferenceType() + .oid(oid) + .type(SqaleTransformerSupport.getInstance().schemaClassToQName(repoObjectType.getSchemaType())) + .description(targetName) + .targetName(targetName); + } + + /** + * Trimming the value to the column size from column metadata (must be specified). + */ + protected @Nullable String trim( + @Nullable String value, @NotNull ColumnMetadata columnMetadata) { + if (!columnMetadata.hasSize()) { + throw new IllegalArgumentException( + "trimString with column metadata without specified size: " + columnMetadata); + } + return MiscUtil.trimString(value, columnMetadata.getSize()); + } + + protected @NotNull Integer searchCachedRelationId(QName qName) { + return SqaleTransformerSupport.getInstance().searchCachedRelationId(qName); + } + + /** Returns ID for cached URI without going to the database. */ + protected Integer resolveUriToId(String uri) { + return SqaleTransformerSupport.getInstance().resolveUriToId(uri); + } + + /** + * Returns ID for relation QName creating new {@link QUri} row in DB as needed. + * Relation is normalized before consulting the cache. + * Never returns null, returns default ID for configured default relation. + */ + protected Integer processCacheableRelation(QName qName) { + return SqaleTransformerSupport.getInstance().processCacheableRelation(qName); + } + + /** Returns ID for URI creating new cache row in DB as needed. */ + protected Integer processCacheableUri(String uri) { + return uri != null + ? SqaleTransformerSupport.getInstance().processCacheableUri(uri) + : null; + } + + /** Returns ID for URI creating new cache row in DB as needed. */ + protected Integer processCacheableUri(QName qName) { + return qName != null + ? SqaleTransformerSupport.getInstance().processCacheableUri(QNameUtil.qNameToUri(qName)) + : null; + } + + /** + * Returns IDs as Integer array for URI strings creating new cache row in DB as needed. + * Returns null for null or empty list on input. + */ + protected Integer[] processCacheableUris(List uris) { + if (uris == null || uris.isEmpty()) { + return null; + } + return uris.stream() + .map(uri -> processCacheableUri(uri)) + .toArray(Integer[]::new); + } + + protected @Nullable UUID oidToUUid(@Nullable String oid) { + return oid != null ? UUID.fromString(oid) : null; + } + + protected MObjectType schemaTypeToObjectType(QName schemaType) { + return schemaType == null ? null : + MObjectType.fromSchemaType( + SqaleTransformerSupport.getInstance().qNameToSchemaClass(schemaType)); + } + + protected void setPolyString(PolyStringType polyString, + Consumer origConsumer, Consumer normConsumer) { + if (polyString != null) { + origConsumer.accept(polyString.getOrig()); + normConsumer.accept(polyString.getNorm()); + } + } + + protected void setReference(ObjectReferenceType ref, + Consumer targetOidConsumer, Consumer targetTypeConsumer, + Consumer relationIdConsumer) { + if (ref != null) { + targetOidConsumer.accept(oidToUUid(ref.getOid())); + targetTypeConsumer.accept(schemaTypeToObjectType(ref.getType())); + relationIdConsumer.accept(processCacheableRelation(ref.getRelation())); + } + } + + protected , OR> void storeRefs( + @NotNull OR ownerRow, @NotNull List refs, + @NotNull QReferenceMapping mapping, @NotNull JdbcSession jdbcSession) { + if (!refs.isEmpty()) { + refs.forEach(ref -> mapping.insert(ref, ownerRow, jdbcSession)); + } + } + + protected String[] arrayFor(List strings) { + if (strings == null || strings.isEmpty()) { + return null; + } + return strings.toArray(String[]::new); + } + + /** Convenient insert shortcut when the row is fully populated. */ + protected void insert(R row, JdbcSession jdbcSession) { + jdbcSession.newInsert(mapping().defaultAlias()) + .populate(row) + .execute(); + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTransformerBase.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTransformerBase.java deleted file mode 100644 index 9e86853cf9e..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTransformerBase.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel; - -import java.util.Collection; -import java.util.List; -import java.util.UUID; -import java.util.function.Consumer; -import javax.xml.namespace.QName; - -import com.querydsl.core.Tuple; -import com.querydsl.sql.ColumnMetadata; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; -import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; -import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; -import com.evolveum.midpoint.repo.sqale.qmodel.ref.MReference; -import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping; -import com.evolveum.midpoint.repo.sqale.qmodel.ref.ReferenceSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - -/** - * @param schema type - * @param type of entity path - * @param type of the row bean for the table - */ -public abstract class SqaleTransformerBase, R> - implements SqlTransformer { - - protected final Logger logger = LoggerFactory.getLogger(getClass()); - - protected final SqaleTransformerSupport transformerSupport; - - /** - * Constructor uses {@link SqlTransformerSupport} type even when it really is - * {@link SqaleTransformerSupport}, but this way we can cast it just once here; otherwise cast - * would be needed in each implementation of {@link QueryTableMapping#createTransformer)}. - * (Alternative is to parametrize {@link QueryTableMapping} with various {@link SqlTransformer} - * types which is not convenient at all. This little downcast is low price to pay.) - */ - protected SqaleTransformerBase(SqlTransformerSupport transformerSupport) { - this.transformerSupport = (SqaleTransformerSupport) transformerSupport; - } - - protected abstract QueryTableMapping mapping(); - - @Override - public S toSchemaObject(R row) { - throw new UnsupportedOperationException("Use toSchemaObject(Tuple,...)"); - } - - /** - * Transforms row Tuple containing {@link R} under entity path and extension columns. - */ - @Override - public S toSchemaObject(Tuple tuple, Q entityPath, - Collection> options) - throws SchemaException { - S schemaObject = toSchemaObject(tuple.get(entityPath)); - processExtensionColumns(schemaObject, tuple, entityPath); - return schemaObject; - } - - @SuppressWarnings("unused") - protected void processExtensionColumns(S schemaObject, Tuple tuple, Q entityPath) { - // empty by default, can be overridden - } - - /** - * Returns {@link ObjectReferenceType} with specified oid, proper type based on - * {@link MObjectType} and, optionally, target name/description. - * Returns {@code null} if OID is null. - * Fails if OID is not null and {@code repoObjectType} is null. - */ - @Nullable - protected ObjectReferenceType objectReferenceType( - @Nullable String oid, MObjectType repoObjectType, String targetName) { - if (oid == null) { - return null; - } - if (repoObjectType == null) { - throw new IllegalArgumentException( - "NULL object type provided for object reference with OID " + oid); - } - - return new ObjectReferenceType() - .oid(oid) - .type(transformerSupport.schemaClassToQName(repoObjectType.getSchemaType())) - .description(targetName) - .targetName(targetName); - } - - /** - * Trimming the value to the column size from column metadata (must be specified). - */ - protected @Nullable String trim( - @Nullable String value, @NotNull ColumnMetadata columnMetadata) { - if (!columnMetadata.hasSize()) { - throw new IllegalArgumentException( - "trimString with column metadata without specified size: " + columnMetadata); - } - return MiscUtil.trimString(value, columnMetadata.getSize()); - } - - protected @NotNull Integer searchCachedRelationId(QName qName) { - return transformerSupport.searchCachedRelationId(qName); - } - - /** Returns ID for cached URI without going to the database. */ - protected Integer resolveUriToId(String uri) { - return transformerSupport.resolveUriToId(uri); - } - - /** - * Returns ID for relation QName creating new {@link QUri} row in DB as needed. - * Relation is normalized before consulting the cache. - * Never returns null, returns default ID for configured default relation. - */ - protected Integer processCacheableRelation(QName qName) { - return transformerSupport.processCacheableRelation(qName); - } - - /** Returns ID for URI creating new cache row in DB as needed. */ - protected Integer processCacheableUri(String uri) { - return uri != null - ? transformerSupport.processCacheableUri(uri) - : null; - } - - /** Returns ID for URI creating new cache row in DB as needed. */ - protected Integer processCacheableUri(QName qName) { - return qName != null - ? transformerSupport.processCacheableUri(QNameUtil.qNameToUri(qName)) - : null; - } - - /** - * Returns IDs as Integer array for URI strings creating new cache row in DB as needed. - * Returns null for null or empty list on input. - */ - protected Integer[] processCacheableUris(List uris) { - if (uris == null || uris.isEmpty()) { - return null; - } - return uris.stream() - .map(uri -> processCacheableUri(uri)) - .toArray(Integer[]::new); - } - - protected @Nullable UUID oidToUUid(@Nullable String oid) { - return oid != null ? UUID.fromString(oid) : null; - } - - protected MObjectType schemaTypeToObjectType(QName schemaType) { - return schemaType == null ? null : - MObjectType.fromSchemaType( - transformerSupport.qNameToSchemaClass(schemaType)); - } - - protected void setPolyString(PolyStringType polyString, - Consumer origConsumer, Consumer normConsumer) { - if (polyString != null) { - origConsumer.accept(polyString.getOrig()); - normConsumer.accept(polyString.getNorm()); - } - } - - protected void setReference(ObjectReferenceType ref, - Consumer targetOidConsumer, Consumer targetTypeConsumer, - Consumer relationIdConsumer) { - if (ref != null) { - targetOidConsumer.accept(oidToUUid(ref.getOid())); - targetTypeConsumer.accept(schemaTypeToObjectType(ref.getType())); - relationIdConsumer.accept(processCacheableRelation(ref.getRelation())); - } - } - - protected , OR> void storeRefs( - @NotNull OR ownerRow, @NotNull List refs, - @NotNull QReferenceMapping mapping, @NotNull JdbcSession jdbcSession) { - if (!refs.isEmpty()) { - ReferenceSqlTransformer transformer = - mapping.createTransformer(transformerSupport); - refs.forEach(ref -> transformer.insert(ref, ownerRow, jdbcSession)); - } - } - - protected String[] arrayFor(List strings) { - if (strings == null || strings.isEmpty()) { - return null; - } - return strings.toArray(String[]::new); - } - - /** Convenient insert shortcut when the row is fully populated. */ - protected void insert(R row, JdbcSession jdbcSession) { - jdbcSession.newInsert(mapping().defaultAlias()) - .populate(row) - .execute(); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java index b760c78d907..a50f328a136 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java @@ -18,5 +18,4 @@ public interface TransformerForOwnedBy { /** Contract for insertion of row of type {@link R} owned by {@link OR}. */ - R insert(S schemaObject, OR ownerRow, JdbcSession jdbcSession); } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/AccessCertificationDefinitionSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/AccessCertificationDefinitionSqlTransformer.java deleted file mode 100644 index 52570a81a0d..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/AccessCertificationDefinitionSqlTransformer.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.accesscert; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDefinitionType; - -public class AccessCertificationDefinitionSqlTransformer - extends ObjectSqlTransformer { - - public AccessCertificationDefinitionSqlTransformer( - SqlTransformerSupport transformerSupport, - QAccessCertificationDefinitionMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MAccessCertificationDefinition toRowObjectWithoutFullObject( - AccessCertificationDefinitionType schemaObject, JdbcSession jdbcSession) { - MAccessCertificationDefinition row = - super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - row.handlerUriId = processCacheableUri(schemaObject.getHandlerUri()); - row.lastCampaignStartedTimestamp = - MiscUtil.asInstant(schemaObject.getLastCampaignStartedTimestamp()); - row.lastCampaignClosedTimestamp = - MiscUtil.asInstant(schemaObject.getLastCampaignClosedTimestamp()); - setReference(schemaObject.getOwnerRef(), - o -> row.ownerRefTargetOid = o, - t -> row.ownerRefTargetType = t, - r -> row.ownerRefRelationId = r); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinitionMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinitionMapping.java index e302547d70f..450f04ee3e3 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinitionMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/accesscert/QAccessCertificationDefinitionMapping.java @@ -8,8 +8,11 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAccessCertificationDefinitionType.*; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDefinitionType; /** @@ -46,12 +49,26 @@ protected QAccessCertificationDefinition newAliasInstance(String alias) { } @Override - public AccessCertificationDefinitionSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new AccessCertificationDefinitionSqlTransformer(transformerSupport, this); + public MAccessCertificationDefinition newRowObject() { + return new MAccessCertificationDefinition(); } @Override - public MAccessCertificationDefinition newRowObject() { - return new MAccessCertificationDefinition(); + public @NotNull MAccessCertificationDefinition toRowObjectWithoutFullObject( + AccessCertificationDefinitionType schemaObject, JdbcSession jdbcSession) { + MAccessCertificationDefinition row = + super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + row.handlerUriId = processCacheableUri(schemaObject.getHandlerUri()); + row.lastCampaignStartedTimestamp = + MiscUtil.asInstant(schemaObject.getLastCampaignStartedTimestamp()); + row.lastCampaignClosedTimestamp = + MiscUtil.asInstant(schemaObject.getLastCampaignClosedTimestamp()); + setReference(schemaObject.getOwnerRef(), + o -> row.ownerRefTargetOid = o, + t -> row.ownerRefTargetType = t, + r -> row.ownerRefRelationId = r); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/AssignmentSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/AssignmentSqlTransformer.java deleted file mode 100644 index e69e2d1fab4..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/AssignmentSqlTransformer.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.assignment; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ContainerSqlTransformer; -import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; - -public class AssignmentSqlTransformer - extends ContainerSqlTransformer, MAssignment, OR> { - - public AssignmentSqlTransformer( - SqlTransformerSupport transformerSupport, QAssignmentMapping mapping) { - super(transformerSupport, mapping); - } - - // about duplication see the comment in ObjectSqlTransformer.toRowObjectWithoutFullObject - @SuppressWarnings("DuplicatedCode") - @Override - public MAssignment insert(AssignmentType assignment, OR ownerRow, JdbcSession jdbcSession) { - MAssignment row = initRowObject(assignment, ownerRow); - - row.ownerType = ownerRow.objectType; - row.lifecycleState = assignment.getLifecycleState(); - row.orderValue = assignment.getOrder(); - setReference(assignment.getOrgRef(), - o -> row.orgRefTargetOid = o, - t -> row.orgRefTargetType = t, - r -> row.orgRefRelationId = r); - setReference(assignment.getTargetRef(), - o -> row.targetRefTargetOid = o, - t -> row.targetRefTargetType = t, - r -> row.targetRefRelationId = r); - setReference(assignment.getTenantRef(), - o -> row.tenantRefTargetOid = o, - t -> row.tenantRefTargetType = t, - r -> row.tenantRefRelationId = r); - - // TODO no idea how to do this yet, somehow related to RAssignment.extension -// row.extId = assignment.getExtension()...id?; -// row.extOid =; - row.policySituations = processCacheableUris(assignment.getPolicySituation()); - // TODO extensions stored inline (JSON) - - ConstructionType construction = assignment.getConstruction(); - if (construction != null) { - setReference(construction.getResourceRef(), - o -> row.resourceRefTargetOid = o, - t -> row.resourceRefTargetType = t, - r -> row.resourceRefRelationId = r); - } - - ActivationType activation = assignment.getActivation(); - if (activation != null) { - row.administrativeStatus = activation.getAdministrativeStatus(); - row.effectiveStatus = activation.getEffectiveStatus(); - row.enableTimestamp = MiscUtil.asInstant(activation.getEnableTimestamp()); - row.disableTimestamp = MiscUtil.asInstant(activation.getDisableTimestamp()); - row.disableReason = activation.getDisableReason(); - row.validityStatus = activation.getValidityStatus(); - row.validFrom = MiscUtil.asInstant(activation.getValidFrom()); - row.validTo = MiscUtil.asInstant(activation.getValidTo()); - row.validityChangeTimestamp = MiscUtil.asInstant(activation.getValidityChangeTimestamp()); - row.archiveTimestamp = MiscUtil.asInstant(activation.getArchiveTimestamp()); - } - - MetadataType metadata = assignment.getMetadata(); - if (metadata != null) { - setReference(metadata.getCreatorRef(), - o -> row.creatorRefTargetOid = o, - t -> row.creatorRefTargetType = t, - r -> row.creatorRefRelationId = r); - row.createChannelId = processCacheableUri(metadata.getCreateChannel()); - row.createTimestamp = MiscUtil.asInstant(metadata.getCreateTimestamp()); - - setReference(metadata.getModifierRef(), - o -> row.modifierRefTargetOid = o, - t -> row.modifierRefTargetType = t, - r -> row.modifierRefRelationId = r); - row.modifyChannelId = processCacheableUri(metadata.getModifyChannel()); - row.modifyTimestamp = MiscUtil.asInstant(metadata.getModifyTimestamp()); - } - - // insert before treating sub-entities - insert(row, jdbcSession); - - if (metadata != null) { - storeRefs(row, metadata.getCreateApproverRef(), - QAssignmentReferenceMapping.INSTANCE_ASSIGNMENT_CREATE_APPROVER, jdbcSession); - storeRefs(row, metadata.getModifyApproverRef(), - QAssignmentReferenceMapping.INSTANCE_ASSIGNMENT_MODIFY_APPROVER, jdbcSession); - } - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java index 100b9b37c3a..a8da39f7a7d 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java @@ -13,7 +13,8 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QReferenceMapping; import com.evolveum.midpoint.repo.sqale.qmodel.role.MAbstractRole; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; @@ -129,11 +130,6 @@ protected QAssignment newAliasInstance(String alias) { return new QAssignment<>(alias); } - @Override - public AssignmentSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new AssignmentSqlTransformer<>(transformerSupport, this); - } - @Override public MAssignment newRowObject() { MAssignment row = new MAssignment(); @@ -147,4 +143,84 @@ public MAssignment newRowObject(OR ownerRow) { row.ownerOid = ownerRow.oid; return row; } + + // about duplication see the comment in ObjectSqlTransformer.toRowObjectWithoutFullObject + @SuppressWarnings("DuplicatedCode") + @Override + public MAssignment insert(AssignmentType assignment, OR ownerRow, JdbcSession jdbcSession) { + MAssignment row = initRowObject(assignment, ownerRow); + + row.ownerType = ownerRow.objectType; + row.lifecycleState = assignment.getLifecycleState(); + row.orderValue = assignment.getOrder(); + setReference(assignment.getOrgRef(), + o -> row.orgRefTargetOid = o, + t -> row.orgRefTargetType = t, + r -> row.orgRefRelationId = r); + setReference(assignment.getTargetRef(), + o -> row.targetRefTargetOid = o, + t -> row.targetRefTargetType = t, + r -> row.targetRefRelationId = r); + setReference(assignment.getTenantRef(), + o -> row.tenantRefTargetOid = o, + t -> row.tenantRefTargetType = t, + r -> row.tenantRefRelationId = r); + + // TODO no idea how to do this yet, somehow related to RAssignment.extension +// row.extId = assignment.getExtension()...id?; +// row.extOid =; + row.policySituations = processCacheableUris(assignment.getPolicySituation()); + // TODO extensions stored inline (JSON) + + ConstructionType construction = assignment.getConstruction(); + if (construction != null) { + setReference(construction.getResourceRef(), + o -> row.resourceRefTargetOid = o, + t -> row.resourceRefTargetType = t, + r -> row.resourceRefRelationId = r); + } + + ActivationType activation = assignment.getActivation(); + if (activation != null) { + row.administrativeStatus = activation.getAdministrativeStatus(); + row.effectiveStatus = activation.getEffectiveStatus(); + row.enableTimestamp = MiscUtil.asInstant(activation.getEnableTimestamp()); + row.disableTimestamp = MiscUtil.asInstant(activation.getDisableTimestamp()); + row.disableReason = activation.getDisableReason(); + row.validityStatus = activation.getValidityStatus(); + row.validFrom = MiscUtil.asInstant(activation.getValidFrom()); + row.validTo = MiscUtil.asInstant(activation.getValidTo()); + row.validityChangeTimestamp = MiscUtil.asInstant(activation.getValidityChangeTimestamp()); + row.archiveTimestamp = MiscUtil.asInstant(activation.getArchiveTimestamp()); + } + + MetadataType metadata = assignment.getMetadata(); + if (metadata != null) { + setReference(metadata.getCreatorRef(), + o -> row.creatorRefTargetOid = o, + t -> row.creatorRefTargetType = t, + r -> row.creatorRefRelationId = r); + row.createChannelId = processCacheableUri(metadata.getCreateChannel()); + row.createTimestamp = MiscUtil.asInstant(metadata.getCreateTimestamp()); + + setReference(metadata.getModifierRef(), + o -> row.modifierRefTargetOid = o, + t -> row.modifierRefTargetType = t, + r -> row.modifierRefRelationId = r); + row.modifyChannelId = processCacheableUri(metadata.getModifyChannel()); + row.modifyTimestamp = MiscUtil.asInstant(metadata.getModifyTimestamp()); + } + + // insert before treating sub-entities + insert(row, jdbcSession); + + if (metadata != null) { + storeRefs(row, metadata.getCreateApproverRef(), + QAssignmentReferenceMapping.INSTANCE_ASSIGNMENT_CREATE_APPROVER, jdbcSession); + storeRefs(row, metadata.getModifyApproverRef(), + QAssignmentReferenceMapping.INSTANCE_ASSIGNMENT_MODIFY_APPROVER, jdbcSession); + } + + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java index 92d6f162b04..39c63f052f8 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/cases/QCaseMapping.java @@ -8,9 +8,7 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType.*; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; /** @@ -52,15 +50,10 @@ protected QCase newAliasInstance(String alias) { return new QCase(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MCase newRowObject() { return new MCase(); } + + // TODO transformation code } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java index 793303094a8..58fbe74beb4 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java @@ -11,7 +11,7 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ContainerSqlTransformer; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; /** @@ -55,10 +55,8 @@ public R newRowObject(OR ownerRow) { "Container bean creation for owner row called on abstract container mapping"); } - @Override - public ContainerSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new ContainerSqlTransformer<>(transformerSupport, this); + public QContainerMapping createTransformer(SqlTransformerSupport transformerSupport) { + return this; } @Override @@ -66,4 +64,19 @@ public R newRowObject() { //noinspection unchecked return (R) new MContainer(); } + + /** + * This creates the right type of object and fills in the base {@link MContainer} attributes. + */ + public R initRowObject(S schemaObject, OR ownerRow) { + R row = newRowObject(ownerRow); + row.cid = schemaObject.asPrismContainerValue().getId(); + // containerType is generated in DB, must be left null! + return row; + } + + @Override + public R insert(S schemaObject, OR ownerRow, JdbcSession jdbcSession) { + throw new UnsupportedOperationException("insert not implemented in the subclass"); + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorHostSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorHostSqlTransformer.java deleted file mode 100644 index 10479473c4e..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorHostSqlTransformer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.connector; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType; - -public class ConnectorHostSqlTransformer - extends ObjectSqlTransformer { - - public ConnectorHostSqlTransformer( - SqlTransformerSupport transformerSupport, QConnectorHostMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MConnectorHost toRowObjectWithoutFullObject( - ConnectorHostType schemaObject, JdbcSession jdbcSession) { - MConnectorHost row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - row.hostname = schemaObject.getHostname(); - row.port = schemaObject.getPort(); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorSqlTransformer.java deleted file mode 100644 index 8d36432ed34..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/ConnectorSqlTransformer.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.connector; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; - -public class ConnectorSqlTransformer - extends ObjectSqlTransformer { - - public ConnectorSqlTransformer( - SqlTransformerSupport transformerSupport, QConnectorMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MConnector toRowObjectWithoutFullObject( - ConnectorType schemaObject, JdbcSession jdbcSession) { - MConnector row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - row.connectorBundle = schemaObject.getConnectorBundle(); - row.connectorType = schemaObject.getConnectorType(); - row.connectorVersion = schemaObject.getConnectorVersion(); - row.frameworkId = processCacheableUri(schemaObject.getFramework()); - - setReference(schemaObject.getConnectorHostRef(), - o -> row.connectorHostRefTargetOid = o, - t -> row.connectorHostRefTargetType = t, - r -> row.connectorHostRefRelationId = r); - - row.targetSystemTypes = arrayFor(schemaObject.getTargetSystemType()); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorHostMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorHostMapping.java index 2eb116abebf..66e8ccf2cbe 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorHostMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorHostMapping.java @@ -9,8 +9,10 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType.F_HOSTNAME; import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType.F_PORT; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorHostType; /** @@ -37,12 +39,18 @@ protected QConnectorHost newAliasInstance(String alias) { } @Override - public ConnectorHostSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ConnectorHostSqlTransformer(transformerSupport, this); + public MConnectorHost newRowObject() { + return new MConnectorHost(); } @Override - public MConnectorHost newRowObject() { - return new MConnectorHost(); + public @NotNull MConnectorHost toRowObjectWithoutFullObject( + ConnectorHostType schemaObject, JdbcSession jdbcSession) { + MConnectorHost row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + row.hostname = schemaObject.getHostname(); + row.port = schemaObject.getPort(); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorMapping.java index 2b550bb8fc5..ef9fc1aeb81 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/connector/QConnectorMapping.java @@ -8,8 +8,10 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType.*; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; /** @@ -43,12 +45,27 @@ protected QConnector newAliasInstance(String alias) { } @Override - public ConnectorSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ConnectorSqlTransformer(transformerSupport, this); + public MConnector newRowObject() { + return new MConnector(); } @Override - public MConnector newRowObject() { - return new MConnector(); + public @NotNull MConnector toRowObjectWithoutFullObject( + ConnectorType schemaObject, JdbcSession jdbcSession) { + MConnector row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + row.connectorBundle = schemaObject.getConnectorBundle(); + row.connectorType = schemaObject.getConnectorType(); + row.connectorVersion = schemaObject.getConnectorVersion(); + row.frameworkId = processCacheableUri(schemaObject.getFramework()); + + setReference(schemaObject.getConnectorHostRef(), + o -> row.connectorHostRefTargetOid = o, + t -> row.connectorHostRefTargetType = t, + r -> row.connectorHostRefRelationId = r); + + row.targetSystemTypes = arrayFor(schemaObject.getTargetSystemType()); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/FocusSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/FocusSqlTransformer.java deleted file mode 100644 index b37ea75b6f5..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/FocusSqlTransformer.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.focus; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -public class FocusSqlTransformer, R extends MFocus> - extends ObjectSqlTransformer { - - public FocusSqlTransformer( - SqlTransformerSupport transformerSupport, QFocusMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - protected QFocusMapping mapping() { - return (QFocusMapping) super.mapping(); - } - - @SuppressWarnings("DuplicatedCode") // activation code duplicated with assignment - @Override - public @NotNull R toRowObjectWithoutFullObject(S focus, JdbcSession jdbcSession) { - R row = super.toRowObjectWithoutFullObject(focus, jdbcSession); - - row.costCenter = focus.getCostCenter(); - row.emailAddress = focus.getEmailAddress(); - row.photo = focus.getJpegPhoto(); - row.locale = focus.getLocale(); - setPolyString(focus.getLocality(), o -> row.localityOrig = o, n -> row.localityNorm = n); - row.preferredLanguage = focus.getPreferredLanguage(); - row.telephoneNumber = focus.getTelephoneNumber(); - row.timezone = focus.getTimezone(); - - // credential/password/metadata (sorry for nesting, but the gets may not be so cheap) - CredentialsType credentials = focus.getCredentials(); - if (credentials != null) { - PasswordType password = credentials.getPassword(); - if (password != null) { - MetadataType passwordMetadata = password.getMetadata(); - if (passwordMetadata != null) { - row.passwordCreateTimestamp = - MiscUtil.asInstant(passwordMetadata.getCreateTimestamp()); - row.passwordModifyTimestamp = - MiscUtil.asInstant(passwordMetadata.getModifyTimestamp()); - } - } - } - - // activation - ActivationType activation = focus.getActivation(); - if (activation != null) { - row.administrativeStatus = activation.getAdministrativeStatus(); - row.effectiveStatus = activation.getEffectiveStatus(); - row.enableTimestamp = MiscUtil.asInstant(activation.getEnableTimestamp()); - row.disableTimestamp = MiscUtil.asInstant(activation.getDisableTimestamp()); - row.disableReason = activation.getDisableReason(); - row.validityStatus = activation.getValidityStatus(); - row.validFrom = MiscUtil.asInstant(activation.getValidFrom()); - row.validTo = MiscUtil.asInstant(activation.getValidTo()); - row.validityChangeTimestamp = MiscUtil.asInstant(activation.getValidityChangeTimestamp()); - row.archiveTimestamp = MiscUtil.asInstant(activation.getArchiveTimestamp()); - row.lockoutStatus = activation.getLockoutStatus(); - } - - return row; - } - - @Override - public void storeRelatedEntities( - @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { - super.storeRelatedEntities(row, schemaObject, jdbcSession); - - storeRefs(row, schemaObject.getLinkRef(), - mapping().projectionReferenceMapping(), jdbcSession); - storeRefs(row, schemaObject.getPersonaRef(), - mapping().personaReferenceMapping(), jdbcSession); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/GenericObjectSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/GenericObjectSqlTransformer.java deleted file mode 100644 index 8bfc9143b02..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/GenericObjectSqlTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.focus; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType; - -public class GenericObjectSqlTransformer - extends FocusSqlTransformer { - - public GenericObjectSqlTransformer( - SqlTransformerSupport transformerSupport, QGenericObjectMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MGenericObject toRowObjectWithoutFullObject( - GenericObjectType genericObject, JdbcSession jdbcSession) { - MGenericObject row = super.toRowObjectWithoutFullObject(genericObject, jdbcSession); - - row.genericObjectTypeId = processCacheableUri(genericObject.getObjectType()); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocusMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocusMapping.java index fd69cf7246b..d9f64fa0011 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocusMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QFocusMapping.java @@ -15,9 +15,10 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; /** @@ -113,15 +114,68 @@ protected Q newAliasInstance(String alias) { return (Q) new QFocus<>(MFocus.class, alias); } - @Override - public FocusSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new FocusSqlTransformer<>(transformerSupport, this); - } - @Override public R newRowObject() { //noinspection unchecked return (R) new MFocus(); } + + @SuppressWarnings("DuplicatedCode") // activation code duplicated with assignment + @Override + public @NotNull R toRowObjectWithoutFullObject(S focus, JdbcSession jdbcSession) { + R row = super.toRowObjectWithoutFullObject(focus, jdbcSession); + + row.costCenter = focus.getCostCenter(); + row.emailAddress = focus.getEmailAddress(); + row.photo = focus.getJpegPhoto(); + row.locale = focus.getLocale(); + setPolyString(focus.getLocality(), o -> row.localityOrig = o, n -> row.localityNorm = n); + row.preferredLanguage = focus.getPreferredLanguage(); + row.telephoneNumber = focus.getTelephoneNumber(); + row.timezone = focus.getTimezone(); + + // credential/password/metadata (sorry for nesting, but the gets may not be so cheap) + CredentialsType credentials = focus.getCredentials(); + if (credentials != null) { + PasswordType password = credentials.getPassword(); + if (password != null) { + MetadataType passwordMetadata = password.getMetadata(); + if (passwordMetadata != null) { + row.passwordCreateTimestamp = + MiscUtil.asInstant(passwordMetadata.getCreateTimestamp()); + row.passwordModifyTimestamp = + MiscUtil.asInstant(passwordMetadata.getModifyTimestamp()); + } + } + } + + // activation + ActivationType activation = focus.getActivation(); + if (activation != null) { + row.administrativeStatus = activation.getAdministrativeStatus(); + row.effectiveStatus = activation.getEffectiveStatus(); + row.enableTimestamp = MiscUtil.asInstant(activation.getEnableTimestamp()); + row.disableTimestamp = MiscUtil.asInstant(activation.getDisableTimestamp()); + row.disableReason = activation.getDisableReason(); + row.validityStatus = activation.getValidityStatus(); + row.validFrom = MiscUtil.asInstant(activation.getValidFrom()); + row.validTo = MiscUtil.asInstant(activation.getValidTo()); + row.validityChangeTimestamp = MiscUtil.asInstant(activation.getValidityChangeTimestamp()); + row.archiveTimestamp = MiscUtil.asInstant(activation.getArchiveTimestamp()); + row.lockoutStatus = activation.getLockoutStatus(); + } + + return row; + } + + @Override + public void storeRelatedEntities( + @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { + super.storeRelatedEntities(row, schemaObject, jdbcSession); + + storeRefs(row, schemaObject.getLinkRef(), + projectionReferenceMapping(), jdbcSession); + storeRefs(row, schemaObject.getPersonaRef(), + personaReferenceMapping(), jdbcSession); + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObjectMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObjectMapping.java index 4b60efbb6f2..0bf0c08e794 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObjectMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QGenericObjectMapping.java @@ -6,7 +6,9 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.focus; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import org.jetbrains.annotations.NotNull; + +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType; /** @@ -30,13 +32,17 @@ protected QGenericObject newAliasInstance(String alias) { } @Override - public GenericObjectSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new GenericObjectSqlTransformer(transformerSupport, this); + public MGenericObject newRowObject() { + return new MGenericObject(); } @Override - public MGenericObject newRowObject() { - return new MGenericObject(); + public @NotNull MGenericObject toRowObjectWithoutFullObject( + GenericObjectType genericObject, JdbcSession jdbcSession) { + MGenericObject row = super.toRowObjectWithoutFullObject(genericObject, jdbcSession); + + row.genericObjectTypeId = processCacheableUri(genericObject.getObjectType()); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUserMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUserMapping.java index bb47b491e48..0458fc83e95 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUserMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/QUserMapping.java @@ -8,7 +8,9 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.UserType.*; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import org.jetbrains.annotations.NotNull; + +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** @@ -50,13 +52,33 @@ protected QUser newAliasInstance(String alias) { } @Override - public UserSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new UserSqlTransformer(transformerSupport, this); + public MUser newRowObject() { + return new MUser(); } @Override - public MUser newRowObject() { - return new MUser(); + public @NotNull MUser toRowObjectWithoutFullObject( + UserType user, JdbcSession jdbcSession) { + MUser row = super.toRowObjectWithoutFullObject(user, jdbcSession); + + setPolyString(user.getAdditionalName(), + o -> row.additionalNameOrig = o, n -> row.additionalNameNorm = n); + row.employeeNumber = user.getEmployeeNumber(); + setPolyString(user.getFamilyName(), + o -> row.familyNameOrig = o, n -> row.familyNameNorm = n); + setPolyString(user.getFullName(), o -> row.fullNameOrig = o, n -> row.fullNameNorm = n); + setPolyString(user.getGivenName(), o -> row.givenNameOrig = o, n -> row.givenNameNorm = n); + setPolyString(user.getHonorificPrefix(), + o -> row.honorificPrefixOrig = o, n -> row.honorificPrefixNorm = n); + setPolyString(user.getHonorificSuffix(), + o -> row.honorificSuffixOrig = o, n -> row.honorificSuffixNorm = n); + setPolyString(user.getNickName(), o -> row.nickNameOrig = o, n -> row.nickNameNorm = n); + setPolyString(user.getTitle(), o -> row.titleOrig = o, n -> row.titleNorm = n); + + // TODO: + // user.getOrganizationalUnit() -> m_user_organizational_unit + // user.getOrganization() -> m_user_organization + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/UserSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/UserSqlTransformer.java deleted file mode 100644 index a2316192798..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/focus/UserSqlTransformer.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.focus; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; - -public class UserSqlTransformer - extends FocusSqlTransformer { - - public UserSqlTransformer( - SqlTransformerSupport transformerSupport, QUserMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MUser toRowObjectWithoutFullObject( - UserType user, JdbcSession jdbcSession) { - MUser row = super.toRowObjectWithoutFullObject(user, jdbcSession); - - setPolyString(user.getAdditionalName(), - o -> row.additionalNameOrig = o, n -> row.additionalNameNorm = n); - row.employeeNumber = user.getEmployeeNumber(); - setPolyString(user.getFamilyName(), - o -> row.familyNameOrig = o, n -> row.familyNameNorm = n); - setPolyString(user.getFullName(), o -> row.fullNameOrig = o, n -> row.fullNameNorm = n); - setPolyString(user.getGivenName(), o -> row.givenNameOrig = o, n -> row.givenNameNorm = n); - setPolyString(user.getHonorificPrefix(), - o -> row.honorificPrefixOrig = o, n -> row.honorificPrefixNorm = n); - setPolyString(user.getHonorificSuffix(), - o -> row.honorificSuffixOrig = o, n -> row.honorificSuffixNorm = n); - setPolyString(user.getNickName(), o -> row.nickNameOrig = o, n -> row.nickNameNorm = n); - setPolyString(user.getTitle(), o -> row.titleOrig = o, n -> row.titleNorm = n); - - // TODO: - // user.getOrganizationalUnit() -> m_user_organizational_unit - // user.getOrganization() -> m_user_organization - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableRowSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableRowSqlTransformer.java deleted file mode 100644 index b01d7baddd9..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableRowSqlTransformer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.lookuptable; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ContainerSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; - -public class LookupTableRowSqlTransformer - extends ContainerSqlTransformer { - - public LookupTableRowSqlTransformer( - SqlTransformerSupport transformerSupport, QLookupTableRowMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public MLookupTableRow insert(LookupTableRowType lookupTableRow, - MLookupTable ownerRow, JdbcSession jdbcSession) { - - MLookupTableRow row = initRowObject(lookupTableRow, ownerRow); - row.key = lookupTableRow.getKey(); - row.value = lookupTableRow.getValue(); - setPolyString(lookupTableRow.getLabel(), o -> row.labelOrig = o, n -> row.labelNorm = n); - row.lastChangeTimestamp = MiscUtil.asInstant(lookupTableRow.getLastChangeTimestamp()); - - insert(row, jdbcSession); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableSqlTransformer.java deleted file mode 100644 index 21941971077..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/LookupTableSqlTransformer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.lookuptable; - -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; - -public class LookupTableSqlTransformer - extends ObjectSqlTransformer { - - public LookupTableSqlTransformer( - SqlTransformerSupport transformerSupport, QLookupTableMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public void storeRelatedEntities( - @NotNull MLookupTable lookupTable, - @NotNull LookupTableType schemaObject, - @NotNull JdbcSession jdbcSession) { - super.storeRelatedEntities(lookupTable, schemaObject, jdbcSession); - - List rows = schemaObject.getRow(); - if (!rows.isEmpty()) { - LookupTableRowSqlTransformer transformer = - QLookupTableRowMapping.INSTANCE.createTransformer(transformerSupport); - rows.forEach(row -> transformer.insert(row, lookupTable, jdbcSession)); - } - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableMapping.java index 405d6ef9877..2156eba2e29 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableMapping.java @@ -8,8 +8,13 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType.F_ROW; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; /** @@ -36,12 +41,21 @@ protected QLookupTable newAliasInstance(String alias) { } @Override - public LookupTableSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new LookupTableSqlTransformer(transformerSupport, this); + public MLookupTable newRowObject() { + return new MLookupTable(); } @Override - public MLookupTable newRowObject() { - return new MLookupTable(); + public void storeRelatedEntities( + @NotNull MLookupTable lookupTable, + @NotNull LookupTableType schemaObject, + @NotNull JdbcSession jdbcSession) { + super.storeRelatedEntities(lookupTable, schemaObject, jdbcSession); + + List rows = schemaObject.getRow(); + if (!rows.isEmpty()) { + rows.forEach(row -> + QLookupTableRowMapping.INSTANCE.insert(row, lookupTable, jdbcSession)); + } } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRowMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRowMapping.java index faaf1e9ae64..df6f9cb8033 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRowMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/lookuptable/QLookupTableRowMapping.java @@ -9,7 +9,8 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType.*; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; /** @@ -39,11 +40,6 @@ protected QLookupTableRow newAliasInstance(String alias) { return new QLookupTableRow(alias); } - @Override - public LookupTableRowSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new LookupTableRowSqlTransformer(transformerSupport, this); - } - @Override public MLookupTableRow newRowObject() { return new MLookupTableRow(); @@ -55,4 +51,18 @@ public MLookupTableRow newRowObject(MLookupTable ownerRow) { row.ownerOid = ownerRow.oid; return row; } + + @Override + public MLookupTableRow insert(LookupTableRowType lookupTableRow, + MLookupTable ownerRow, JdbcSession jdbcSession) { + + MLookupTableRow row = initRowObject(lookupTableRow, ownerRow); + row.key = lookupTableRow.getKey(); + row.value = lookupTableRow.getValue(); + setPolyString(lookupTableRow.getLabel(), o -> row.labelOrig = o, n -> row.labelNorm = n); + row.lastChangeTimestamp = MiscUtil.asInstant(lookupTableRow.getLastChangeTimestamp()); + + insert(row, jdbcSession); + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/NodeSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/NodeSqlTransformer.java deleted file mode 100644 index b6003939f26..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/NodeSqlTransformer.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.node; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; - -public class NodeSqlTransformer - extends ObjectSqlTransformer { - - public NodeSqlTransformer( - SqlTransformerSupport transformerSupport, QNodeMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MNode toRowObjectWithoutFullObject(NodeType node, JdbcSession jdbcSession) { - MNode row = super.toRowObjectWithoutFullObject(node, jdbcSession); - - row.nodeIdentifier = node.getNodeIdentifier(); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/QNodeMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/QNodeMapping.java index 38bf3917847..5e0dcee34df 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/QNodeMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/node/QNodeMapping.java @@ -8,8 +8,10 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType.F_NODE_IDENTIFIER; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; /** @@ -34,13 +36,15 @@ protected QNode newAliasInstance(String alias) { } @Override - public NodeSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new NodeSqlTransformer(transformerSupport, this); + public MNode newRowObject() { + return new MNode(); } @Override - public MNode newRowObject() { - return new MNode(); + public @NotNull MNode toRowObjectWithoutFullObject(NodeType node, JdbcSession jdbcSession) { + MNode row = super.toRowObjectWithoutFullObject(node, jdbcSession); + + row.nodeIdentifier = node.getNodeIdentifier(); + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ContainerSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ContainerSqlTransformer.java deleted file mode 100644 index 4788cdb3bef..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ContainerSqlTransformer.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.object; - -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTransformerBase; -import com.evolveum.midpoint.repo.sqale.qmodel.TransformerForOwnedBy; -import com.evolveum.midpoint.repo.sqale.qmodel.common.MContainer; -import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainer; -import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; - -/** - * @param schema type - * @param type of entity path - * @param type of the row bean for the table - * @param type of the owner row (table owning the container) - */ -public class ContainerSqlTransformer - , R extends MContainer, OR> - extends SqaleTransformerBase - implements TransformerForOwnedBy { - - private final QContainerMapping mapping; - - public ContainerSqlTransformer( - SqlTransformerSupport transformerSupport, QContainerMapping mapping) { - super(transformerSupport); - this.mapping = mapping; - } - - @Override - protected QContainerMapping mapping() { - return mapping; - } - - /** - * This creates the right type of object and fills in the base {@link MContainer} attributes. - */ - public R initRowObject(S schemaObject, OR ownerRow) { - R row = mapping.newRowObject(ownerRow); - row.cid = schemaObject.asPrismContainerValue().getId(); - // containerType is generated in DB, must be left null! - return row; - } - - @Override - public R insert(S schemaObject, OR ownerRow, JdbcSession jdbcSession) { - throw new UnsupportedOperationException("insert not implemented in the subclass"); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ObjectSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ObjectSqlTransformer.java deleted file mode 100644 index f34779d1dce..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/ObjectSqlTransformer.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.object; - -import java.nio.charset.StandardCharsets; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import javax.xml.namespace.QName; - -import com.querydsl.core.Tuple; -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.SerializationOptions; -import com.evolveum.midpoint.repo.sqale.SqaleUtils; -import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTransformerBase; -import com.evolveum.midpoint.repo.sqale.qmodel.assignment.AssignmentSqlTransformer; -import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -public class ObjectSqlTransformer, R extends MObject> - extends SqaleTransformerBase { - - private final QObjectMapping mapping; - - public ObjectSqlTransformer( - SqlTransformerSupport transformerSupport, - QObjectMapping mapping) { - super(transformerSupport); - this.mapping = mapping; - } - - @Override - protected QObjectMapping mapping() { - return mapping; - } - - @Override - public S toSchemaObject(Tuple row, Q entityPath, - Collection> options) - throws SchemaException { - - byte[] fullObject = Objects.requireNonNull(row.get(entityPath.fullObject)); - - PrismObject prismObject; - String serializedForm = new String(fullObject, StandardCharsets.UTF_8); - try { - SqlTransformerSupport.ParseResult result = - transformerSupport.parsePrismObject(serializedForm); - prismObject = result.prismObject; - if (result.parsingContext.hasWarnings()) { - logger.warn("Object {} parsed with {} warnings", - ObjectTypeUtil.toShortString(prismObject), - result.parsingContext.getWarnings().size()); - } - } catch (SchemaException | RuntimeException | Error e) { - // This is a serious thing. We have corrupted XML in the repo. This may happen even - // during system init. We want really loud and detailed error here. - logger.error("Couldn't parse object {} {}: {}: {}\n{}", - mapping.schemaType().getSimpleName(), row.get(entityPath.oid), - e.getClass().getName(), e.getMessage(), serializedForm, e); - throw e; - } - - return prismObject.asObjectable(); - } - - /** - * Override this to fill additional row attributes after calling this super version. - * - * *This must be called with active JDBC session* so it can create new {@link QUri} rows. - * As this is intended for inserts *DO NOT* set {@link MObject#objectType} to any value, - * it must be NULL otherwise the DB will complain about the value for the generated column. - * - * OID may be null, hence the method does NOT create any sub-entities, see - * {@link #storeRelatedEntities(MObject, ObjectType, JdbcSession)}. - * Try to keep order of fields here, in M-class (MObject for this one) and in SQL the same. - */ - @SuppressWarnings("DuplicatedCode") // see comment for metadata lower - @NotNull - public R toRowObjectWithoutFullObject(S schemaObject, JdbcSession jdbcSession) { - R row = mapping.newRowObject(); - - row.oid = oidToUUid(schemaObject.getOid()); - // objectType MUST be left NULL for INSERT, it's determined by PG - setPolyString(schemaObject.getName(), o -> row.nameOrig = o, n -> row.nameNorm = n); - // fullObject is managed outside of this method - setReference(schemaObject.getTenantRef(), - o -> row.tenantRefTargetOid = o, - t -> row.tenantRefTargetType = t, - r -> row.tenantRefRelationId = r); - row.lifecycleState = schemaObject.getLifecycleState(); - // containerIdSeq is managed outside of this method - row.version = SqaleUtils.objectVersionAsInt(schemaObject); - - // complex DB fields - row.policySituations = processCacheableUris(schemaObject.getPolicySituation()); - row.subtypes = arrayFor(schemaObject.getSubtype()); - // TODO textInfo (fulltext support) - // repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext)); - // TODO extensions stored inline (JSON) - that is ext column - - // This is duplicate code with AssignmentSqlTransformer.toRowObject, but making interface - // and needed setters (fields are not "interface-able") would create much more code. - MetadataType metadata = schemaObject.getMetadata(); - if (metadata != null) { - setReference(metadata.getCreatorRef(), - o -> row.creatorRefTargetOid = o, - t -> row.creatorRefTargetType = t, - r -> row.creatorRefRelationId = r); - row.createChannelId = processCacheableUri(metadata.getCreateChannel()); - row.createTimestamp = MiscUtil.asInstant(metadata.getCreateTimestamp()); - - setReference(metadata.getModifierRef(), - o -> row.modifierRefTargetOid = o, - t -> row.modifierRefTargetType = t, - r -> row.modifierRefRelationId = r); - row.modifyChannelId = processCacheableUri(metadata.getModifyChannel()); - row.modifyTimestamp = MiscUtil.asInstant(metadata.getModifyTimestamp()); - } - return row; - } - - /** - * Stores other entities related to the main object row like containers, references, etc. - * This is not part of {@link #toRowObjectWithoutFullObject} because it requires know OID - * which is not assured before calling that method. - * - * *Always call this super method first in overriding methods.* - * - * @param row master row for the added object("aggregate root") - * @param schemaObject schema objects for which the details are stored - * @param jdbcSession JDBC session used to insert related rows - */ - public void storeRelatedEntities( - @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { - Objects.requireNonNull(row.oid); - - // We're after insert, we can set this for the needs of owned entities (assignments). - row.objectType = MObjectType.fromSchemaType(schemaObject.getClass()); - - MetadataType metadata = schemaObject.getMetadata(); - if (metadata != null) { - storeRefs(row, metadata.getCreateApproverRef(), - mapping.objectCreateApproverReferenceMapping(), jdbcSession); - storeRefs(row, metadata.getModifyApproverRef(), - mapping.objectModifyApproverReferenceMapping(), jdbcSession); - } - - List triggers = schemaObject.getTrigger(); - if (!triggers.isEmpty()) { - TriggerSqlTransformer transformer = - mapping.triggerMapping().createTransformer(transformerSupport); - triggers.forEach(t -> transformer.insert(t, row, jdbcSession)); - } - - List operationExecutions = schemaObject.getOperationExecution(); - if (!operationExecutions.isEmpty()) { - OperationExecutionSqlTransformer transformer = - mapping.operationExecutionMapping().createTransformer(transformerSupport); - operationExecutions.forEach(oe -> transformer.insert(oe, row, jdbcSession)); - } - - storeRefs(row, schemaObject.getParentOrgRef(), - mapping.objectParentOrgReferenceMapping(), jdbcSession); - - if (schemaObject instanceof AssignmentHolderType) { - storeAssignmentHolderEntities(row, (AssignmentHolderType) schemaObject, jdbcSession); - } - - /* TODO EAV extensions - the relevant code from old repo RObject#copyObjectInformationFromJAXB - if (jaxb.getExtension() != null) { - copyExtensionOrAttributesFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.EXTENSION, generatorResult); - } - */ - } - - private void storeAssignmentHolderEntities( - R row, AssignmentHolderType schemaObject, JdbcSession jdbcSession) { - List assignments = schemaObject.getAssignment(); - if (!assignments.isEmpty()) { - AssignmentSqlTransformer transformer = - mapping.assignmentMapping().createTransformer(transformerSupport); - assignments.forEach(assignment -> - transformer.insert(assignment, row, jdbcSession)); - } - - storeRefs(row, schemaObject.getArchetypeRef(), - mapping.archetypeReferenceMapping(), jdbcSession); - storeRefs(row, schemaObject.getDelegatedRef(), - mapping.delegatedReferenceMapping(), jdbcSession); - storeRefs(row, schemaObject.getRoleMembershipRef(), - mapping.roleMembershipReferenceMapping(), jdbcSession); - } - - /** - * Serializes schema object and sets {@link R#fullObject}. - */ - public void setFullObject(R row, S schemaObject) throws SchemaException { - row.fullObject = createFullObject(schemaObject); - } - - public byte[] createFullObject(S schemaObject) throws SchemaException { - if (schemaObject.getOid() == null || schemaObject.getVersion() == null) { - throw new IllegalArgumentException( - "Serialized object must have assigned OID and version: " + schemaObject); - } - - return transformerSupport.createStringSerializer() - .itemsToSkip(fullObjectItemsToSkip()) - .options(SerializationOptions - .createSerializeReferenceNamesForNullOids() - .skipIndexOnly(true) - .skipTransient(true)) - .serialize(schemaObject.asPrismObject()) - .getBytes(StandardCharsets.UTF_8); - } - - protected Collection fullObjectItemsToSkip() { - // TODO extend later, things like FocusType.F_JPEG_PHOTO, see ObjectUpdater#updateFullObject - return Collections.emptyList(); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/OperationExecutionSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/OperationExecutionSqlTransformer.java deleted file mode 100644 index 3048955b408..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/OperationExecutionSqlTransformer.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.object; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType; - -public class OperationExecutionSqlTransformer - extends ContainerSqlTransformer, MOperationExecution, OR> { - - public OperationExecutionSqlTransformer( - SqlTransformerSupport transformerSupport, QOperationExecutionMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public MOperationExecution insert( - OperationExecutionType schemaObject, OR ownerRow, JdbcSession jdbcSession) { - MOperationExecution row = initRowObject(schemaObject, ownerRow); - - row.status = schemaObject.getStatus(); - row.recordType = schemaObject.getRecordType(); - setReference(schemaObject.getInitiatorRef(), - o -> row.initiatorRefTargetOid = o, - t -> row.initiatorRefTargetType = t, - r -> row.initiatorRefRelationId = r); - setReference(schemaObject.getTaskRef(), - o -> row.taskRefTargetOid = o, - t -> row.taskRefTargetType = t, - r -> row.taskRefRelationId = r); - row.timestampValue = MiscUtil.asInstant(schemaObject.getTimestamp()); - - insert(row, jdbcSession); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java index f33c8922acb..8dd59af9d46 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java @@ -8,22 +8,35 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType.*; +import java.nio.charset.StandardCharsets; import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import javax.xml.namespace.QName; +import com.querydsl.core.Tuple; import com.querydsl.core.types.Path; import org.jetbrains.annotations.NotNull; import com.evolveum.midpoint.prism.PrismConstants; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.SerializationOptions; +import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleUtils; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignmentMapping; +import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; /** * Mapping between {@link QObject} and {@link ObjectType}. @@ -171,7 +184,7 @@ protected Q newAliasInstance(String alias) { @Override public SqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ObjectSqlTransformer<>(transformerSupport, this); + return this; } @Override @@ -179,4 +192,187 @@ public R newRowObject() { //noinspection unchecked return (R) new MObject(); } + + // region transformation + @Override + public S toSchemaObject(Tuple row, Q entityPath, + Collection> options) + throws SchemaException { + + byte[] fullObject = Objects.requireNonNull(row.get(entityPath.fullObject)); + + PrismObject prismObject; + String serializedForm = new String(fullObject, StandardCharsets.UTF_8); + try { + SqlTransformerSupport.ParseResult result = + SqaleTransformerSupport.getInstance().parsePrismObject(serializedForm); + prismObject = result.prismObject; + if (result.parsingContext.hasWarnings()) { + logger.warn("Object {} parsed with {} warnings", + ObjectTypeUtil.toShortString(prismObject), + result.parsingContext.getWarnings().size()); + } + } catch (SchemaException | RuntimeException | Error e) { + // This is a serious thing. We have corrupted XML in the repo. This may happen even + // during system init. We want really loud and detailed error here. + logger.error("Couldn't parse object {} {}: {}: {}\n{}", + schemaType().getSimpleName(), row.get(entityPath.oid), + e.getClass().getName(), e.getMessage(), serializedForm, e); + throw e; + } + + return prismObject.asObjectable(); + } + + /** + * Override this to fill additional row attributes after calling this super version. + * + * *This must be called with active JDBC session* so it can create new {@link QUri} rows. + * As this is intended for inserts *DO NOT* set {@link MObject#objectType} to any value, + * it must be NULL otherwise the DB will complain about the value for the generated column. + * + * OID may be null, hence the method does NOT create any sub-entities, see + * {@link #storeRelatedEntities(MObject, ObjectType, JdbcSession)}. + * Try to keep order of fields here, in M-class (MObject for this one) and in SQL the same. + */ + @SuppressWarnings("DuplicatedCode") // see comment for metadata lower + @NotNull + public R toRowObjectWithoutFullObject(S schemaObject, JdbcSession jdbcSession) { + R row = newRowObject(); + + row.oid = oidToUUid(schemaObject.getOid()); + // objectType MUST be left NULL for INSERT, it's determined by PG + setPolyString(schemaObject.getName(), o -> row.nameOrig = o, n -> row.nameNorm = n); + // fullObject is managed outside of this method + setReference(schemaObject.getTenantRef(), + o -> row.tenantRefTargetOid = o, + t -> row.tenantRefTargetType = t, + r -> row.tenantRefRelationId = r); + row.lifecycleState = schemaObject.getLifecycleState(); + // containerIdSeq is managed outside of this method + row.version = SqaleUtils.objectVersionAsInt(schemaObject); + + // complex DB fields + row.policySituations = processCacheableUris(schemaObject.getPolicySituation()); + row.subtypes = arrayFor(schemaObject.getSubtype()); + // TODO textInfo (fulltext support) + // repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext)); + // TODO extensions stored inline (JSON) - that is ext column + + // This is duplicate code with AssignmentSqlTransformer.toRowObject, but making interface + // and needed setters (fields are not "interface-able") would create much more code. + MetadataType metadata = schemaObject.getMetadata(); + if (metadata != null) { + setReference(metadata.getCreatorRef(), + o -> row.creatorRefTargetOid = o, + t -> row.creatorRefTargetType = t, + r -> row.creatorRefRelationId = r); + row.createChannelId = processCacheableUri(metadata.getCreateChannel()); + row.createTimestamp = MiscUtil.asInstant(metadata.getCreateTimestamp()); + + setReference(metadata.getModifierRef(), + o -> row.modifierRefTargetOid = o, + t -> row.modifierRefTargetType = t, + r -> row.modifierRefRelationId = r); + row.modifyChannelId = processCacheableUri(metadata.getModifyChannel()); + row.modifyTimestamp = MiscUtil.asInstant(metadata.getModifyTimestamp()); + } + return row; + } + + /** + * Stores other entities related to the main object row like containers, references, etc. + * This is not part of {@link #toRowObjectWithoutFullObject} because it requires know OID + * which is not assured before calling that method. + * + * *Always call this super method first in overriding methods.* + * + * @param row master row for the added object("aggregate root") + * @param schemaObject schema objects for which the details are stored + * @param jdbcSession JDBC session used to insert related rows + */ + public void storeRelatedEntities( + @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { + Objects.requireNonNull(row.oid); + + // We're after insert, we can set this for the needs of owned entities (assignments). + row.objectType = MObjectType.fromSchemaType(schemaObject.getClass()); + + MetadataType metadata = schemaObject.getMetadata(); + if (metadata != null) { + storeRefs(row, metadata.getCreateApproverRef(), + objectCreateApproverReferenceMapping(), jdbcSession); + storeRefs(row, metadata.getModifyApproverRef(), + objectModifyApproverReferenceMapping(), jdbcSession); + } + + List triggers = schemaObject.getTrigger(); + if (!triggers.isEmpty()) { + triggers.forEach(t -> triggerMapping().insert(t, row, jdbcSession)); + } + + List operationExecutions = schemaObject.getOperationExecution(); + if (!operationExecutions.isEmpty()) { + operationExecutions.forEach(oe -> + operationExecutionMapping().insert(oe, row, jdbcSession)); + } + + storeRefs(row, schemaObject.getParentOrgRef(), + objectParentOrgReferenceMapping(), jdbcSession); + + if (schemaObject instanceof AssignmentHolderType) { + storeAssignmentHolderEntities(row, (AssignmentHolderType) schemaObject, jdbcSession); + } + + /* TODO EAV extensions - the relevant code from old repo RObject#copyObjectInformationFromJAXB + if (jaxb.getExtension() != null) { + copyExtensionOrAttributesFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.EXTENSION, generatorResult); + } + */ + } + + private void storeAssignmentHolderEntities( + R row, AssignmentHolderType schemaObject, JdbcSession jdbcSession) { + List assignments = schemaObject.getAssignment(); + if (!assignments.isEmpty()) { + assignments.forEach(assignment -> + assignmentMapping().insert(assignment, row, jdbcSession)); + } + + storeRefs(row, schemaObject.getArchetypeRef(), + archetypeReferenceMapping(), jdbcSession); + storeRefs(row, schemaObject.getDelegatedRef(), + delegatedReferenceMapping(), jdbcSession); + storeRefs(row, schemaObject.getRoleMembershipRef(), + roleMembershipReferenceMapping(), jdbcSession); + } + + /** + * Serializes schema object and sets {@link R#fullObject}. + */ + public void setFullObject(R row, S schemaObject) throws SchemaException { + row.fullObject = createFullObject(schemaObject); + } + + public byte[] createFullObject(S schemaObject) throws SchemaException { + if (schemaObject.getOid() == null || schemaObject.getVersion() == null) { + throw new IllegalArgumentException( + "Serialized object must have assigned OID and version: " + schemaObject); + } + + return SqaleTransformerSupport.getInstance().createStringSerializer() + .itemsToSkip(fullObjectItemsToSkip()) + .options(SerializationOptions + .createSerializeReferenceNamesForNullOids() + .skipIndexOnly(true) + .skipTransient(true)) + .serialize(schemaObject.asPrismObject()) + .getBytes(StandardCharsets.UTF_8); + } + + protected Collection fullObjectItemsToSkip() { + // TODO extend later, things like FocusType.F_JPEG_PHOTO, see ObjectUpdater#updateFullObject + return Collections.emptyList(); + } + // endregion } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecutionMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecutionMapping.java index 427bed89379..25e65d8f0e5 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecutionMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QOperationExecutionMapping.java @@ -9,7 +9,8 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType.*; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType; /** @@ -50,12 +51,6 @@ protected QOperationExecution newAliasInstance(String alias) { return new QOperationExecution<>(alias); } - @Override - public OperationExecutionSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new OperationExecutionSqlTransformer<>(transformerSupport, this); - } - @Override public MOperationExecution newRowObject() { return new MOperationExecution(); @@ -67,4 +62,25 @@ public MOperationExecution newRowObject(OR ownerRow) { row.ownerOid = ownerRow.oid; return row; } + + @Override + public MOperationExecution insert( + OperationExecutionType schemaObject, OR ownerRow, JdbcSession jdbcSession) { + MOperationExecution row = initRowObject(schemaObject, ownerRow); + + row.status = schemaObject.getStatus(); + row.recordType = schemaObject.getRecordType(); + setReference(schemaObject.getInitiatorRef(), + o -> row.initiatorRefTargetOid = o, + t -> row.initiatorRefTargetType = t, + r -> row.initiatorRefRelationId = r); + setReference(schemaObject.getTaskRef(), + o -> row.taskRefTargetOid = o, + t -> row.taskRefTargetType = t, + r -> row.taskRefRelationId = r); + row.timestampValue = MiscUtil.asInstant(schemaObject.getTimestamp()); + + insert(row, jdbcSession); + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QTriggerMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QTriggerMapping.java index dd1019ddf14..6cf8fefe560 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QTriggerMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QTriggerMapping.java @@ -7,7 +7,8 @@ package com.evolveum.midpoint.repo.sqale.qmodel.object; import com.evolveum.midpoint.repo.sqale.qmodel.common.QContainerMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; /** @@ -37,11 +38,6 @@ protected QTrigger newAliasInstance(String alias) { return new QTrigger<>(alias); } - @Override - public TriggerSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new TriggerSqlTransformer<>(transformerSupport, this); - } - @Override public MTrigger newRowObject() { return new MTrigger(); @@ -53,4 +49,15 @@ public MTrigger newRowObject(OR ownerRow) { row.ownerOid = ownerRow.oid; return row; } + + @Override + public MTrigger insert(TriggerType schemaObject, OR ownerRow, JdbcSession jdbcSession) { + MTrigger row = initRowObject(schemaObject, ownerRow); + + row.handlerUriId = processCacheableUri(schemaObject.getHandlerUri()); + row.timestampValue = MiscUtil.asInstant(schemaObject.getTimestamp()); + + insert(row, jdbcSession); + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/TriggerSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/TriggerSqlTransformer.java deleted file mode 100644 index 77c42cb0974..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/TriggerSqlTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.object; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; - -public class TriggerSqlTransformer - extends ContainerSqlTransformer, MTrigger, OR> { - - public TriggerSqlTransformer( - SqlTransformerSupport transformerSupport, QTriggerMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public MTrigger insert(TriggerType schemaObject, OR ownerRow, JdbcSession jdbcSession) { - MTrigger row = initRowObject(schemaObject, ownerRow); - - row.handlerUriId = processCacheableUri(schemaObject.getHandlerUri()); - row.timestampValue = MiscUtil.asInstant(schemaObject.getTimestamp()); - - insert(row, jdbcSession); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QDashboardMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QDashboardMapping.java index 79a2ce5f5f4..856f3292201 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QDashboardMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QDashboardMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.other; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardType; /** @@ -32,13 +30,6 @@ protected QDashboard newAliasInstance(String alias) { return new QDashboard(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFormMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFormMapping.java index cb52224d9ef..c85a7e07553 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFormMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFormMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.other; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.FormType; /** @@ -31,13 +29,6 @@ protected QForm newAliasInstance(String alias) { return new QForm(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFunctionLibraryMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFunctionLibraryMapping.java index 4045a9c7354..f4ca68fb11e 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFunctionLibraryMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QFunctionLibraryMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.other; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.FunctionLibraryType; /** @@ -32,13 +30,6 @@ protected QFunctionLibrary newAliasInstance(String alias) { return new QFunctionLibrary(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QObjectCollectionMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QObjectCollectionMapping.java index 689429112eb..d6b6b485bc3 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QObjectCollectionMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QObjectCollectionMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.other; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType; /** @@ -32,13 +30,6 @@ protected QObjectCollection newAliasInstance(String alias) { return new QObjectCollection(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QSequenceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QSequenceMapping.java index d73c213ef1f..76c62f5a41d 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QSequenceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/other/QSequenceMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.other; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.SequenceType; /** @@ -31,13 +29,6 @@ protected QSequence newAliasInstance(String alias) { return new QSequence(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java index cce8979b28c..37c5138901e 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java @@ -6,6 +6,7 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.ref; +import java.util.UUID; import java.util.function.BiFunction; import com.querydsl.core.types.Predicate; @@ -13,6 +14,7 @@ import com.evolveum.midpoint.prism.Referencable; import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; @@ -59,10 +61,9 @@ protected Q newAliasInstance(String alias) { return (Q) new QReference<>(MReference.class, alias); } - @Override - public ReferenceSqlTransformer createTransformer( + public QReferenceMapping createTransformer( SqlTransformerSupport transformerSupport) { - return new ReferenceSqlTransformer<>(transformerSupport, this); + return this; } /** Defines a contract for creating the reference for the provided owner row. */ @@ -76,4 +77,21 @@ public BiFunction joinOnPredicate() { throw new UnsupportedOperationException( "joinOnPredicate not supported on abstract reference mapping"); } + + /** + * There is no need to override this, only reference creation is different and that is covered + * by {@link QReferenceMapping#newRowObject(Object)} including setting FK columns. + * All the other columns are based on a single schema type, so there is no variation. + */ + @Override + public R insert(Referencable schemaObject, OR ownerRow, JdbcSession jdbcSession) { + R row = newRowObject(ownerRow); + // row.referenceType is DB generated, must be kept NULL, but it will match referenceType + row.relationId = processCacheableRelation(schemaObject.getRelation()); + row.targetOid = UUID.fromString(schemaObject.getOid()); + row.targetType = schemaTypeToObjectType(schemaObject.getType()); + + insert(row, jdbcSession); + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/ReferenceSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/ReferenceSqlTransformer.java deleted file mode 100644 index d42fb232724..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/ReferenceSqlTransformer.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.ref; - -import java.util.UUID; - -import com.evolveum.midpoint.prism.Referencable; -import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTransformerBase; -import com.evolveum.midpoint.repo.sqale.qmodel.TransformerForOwnedBy; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; - -/** - * @param type of entity path for the reference table - * @param type of the transformed data, a row bean - * @param row type of the reference owner - */ -public class ReferenceSqlTransformer, R extends MReference, OR> - extends SqaleTransformerBase - implements TransformerForOwnedBy { - - private final QReferenceMapping mapping; - - public ReferenceSqlTransformer( - SqlTransformerSupport transformerSupport, QReferenceMapping mapping) { - super(transformerSupport); - this.mapping = mapping; - } - - @Override - protected QReferenceMapping mapping() { - return mapping; - } - - /** - * There is no need to override this, only reference creation is different and that is covered - * by {@link QReferenceMapping#newRowObject(Object)} including setting FK columns. - * All the other columns are based on a single schema type, so there is no variation. - */ - @Override - public R insert(Referencable schemaObject, OR ownerRow, JdbcSession jdbcSession) { - R row = mapping.newRowObject(ownerRow); - // row.referenceType is DB generated, must be kept NULL, but it will match referenceType - row.relationId = processCacheableRelation(schemaObject.getRelation()); - row.targetOid = UUID.fromString(schemaObject.getOid()); - row.targetType = schemaTypeToObjectType(schemaObject.getType()); - - insert(row, jdbcSession); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java index 4f4c393fece..04dd1e88576 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java @@ -8,7 +8,10 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType.F_REPORT_REF; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType; @@ -38,12 +41,25 @@ protected QReportData newAliasInstance(String alias) { } @Override - public ReportDataSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ReportDataSqlTransformer(transformerSupport, this); + public QReportDataMapping createTransformer(SqlTransformerSupport transformerSupport) { + return this; } @Override public MReportData newRowObject() { return new MReportData(); } + + @Override + public @NotNull MReportData toRowObjectWithoutFullObject( + ReportDataType reportData, JdbcSession jdbcSession) { + MReportData row = super.toRowObjectWithoutFullObject(reportData, jdbcSession); + + setReference(reportData.getReportRef(), + o -> row.reportRefTargetOid = o, + t -> row.reportRefTargetType = t, + r -> row.reportRefRelationId = r); + + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java index 4e7ecc3a4c0..74ef986fdbd 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java @@ -6,7 +6,10 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.report; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.JasperReportEngineConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; @@ -38,12 +41,26 @@ protected QReport newAliasInstance(String alias) { } @Override - public ReportSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ReportSqlTransformer(transformerSupport, this); + public QReportMapping createTransformer(SqlTransformerSupport transformerSupport) { + return this; } @Override public MReport newRowObject() { return new MReport(); } + + @Override + public @NotNull MReport toRowObjectWithoutFullObject( + ReportType schemaObject, JdbcSession jdbcSession) { + MReport row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + JasperReportEngineConfigurationType jasper = schemaObject.getJasper(); + if (jasper != null) { + row.orientation = jasper.getOrientation(); + row.parent = jasper.isParent(); + } + + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportDataSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportDataSqlTransformer.java deleted file mode 100644 index 24a9bbe40da..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportDataSqlTransformer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.report; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType; - -public class ReportDataSqlTransformer - extends ObjectSqlTransformer { - - public ReportDataSqlTransformer( - SqlTransformerSupport transformerSupport, QReportDataMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MReportData toRowObjectWithoutFullObject( - ReportDataType reportData, JdbcSession jdbcSession) { - MReportData row = super.toRowObjectWithoutFullObject(reportData, jdbcSession); - - setReference(reportData.getReportRef(), - o -> row.reportRefTargetOid = o, - t -> row.reportRefTargetType = t, - r -> row.reportRefRelationId = r); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportSqlTransformer.java deleted file mode 100644 index ff2a51847e2..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/ReportSqlTransformer.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.report; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.JasperReportEngineConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; - -public class ReportSqlTransformer - extends ObjectSqlTransformer { - - public ReportSqlTransformer( - SqlTransformerSupport transformerSupport, QReportMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MReport toRowObjectWithoutFullObject( - ReportType schemaObject, JdbcSession jdbcSession) { - MReport row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - JasperReportEngineConfigurationType jasper = schemaObject.getJasper(); - if (jasper != null) { - row.orientation = jasper.getOrientation(); - row.parent = jasper.isParent(); - } - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java index ae5eaafa2b7..b5b72b7229c 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java @@ -8,8 +8,11 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType.*; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBusinessConfigurationType; @@ -49,12 +52,49 @@ protected QResource newAliasInstance(String alias) { } @Override - public ResourceSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ResourceSqlTransformer(transformerSupport, this); + public QResourceMapping createTransformer(SqlTransformerSupport transformerSupport) { + return this; } @Override public MResource newRowObject() { return new MResource(); } + + @Override + public @NotNull MResource toRowObjectWithoutFullObject( + ResourceType schemaObject, JdbcSession jdbcSession) { + MResource row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + ResourceBusinessConfigurationType business = schemaObject.getBusiness(); + if (business != null) { + row.businessAdministrativeState = business.getAdministrativeState(); + } + + OperationalStateType operationalState = schemaObject.getOperationalState(); + if (operationalState != null) { + row.operationalStateLastAvailabilityStatus = + operationalState.getLastAvailabilityStatus(); + } + + setReference(schemaObject.getConnectorRef(), + o -> row.connectorRefTargetOid = o, + t -> row.connectorRefTargetType = t, + r -> row.connectorRefRelationId = r); + + return row; + } + + @Override + public void storeRelatedEntities(@NotNull MResource row, + @NotNull ResourceType schemaObject, @NotNull JdbcSession jdbcSession) { + super.storeRelatedEntities(row, schemaObject, jdbcSession); + + ResourceBusinessConfigurationType business = schemaObject.getBusiness(); + if (business != null) { + storeRefs(row, business.getApproverRef(), + QObjectReferenceMapping.INSTANCE_RESOURCE_BUSINESS_CONFIGURATION_APPROVER, + jdbcSession); + } + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/ResourceSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/ResourceSqlTransformer.java deleted file mode 100644 index bce4d17a50c..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/ResourceSqlTransformer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.resource; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalStateType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBusinessConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; - -public class ResourceSqlTransformer - extends ObjectSqlTransformer { - - public ResourceSqlTransformer( - SqlTransformerSupport transformerSupport, QResourceMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MResource toRowObjectWithoutFullObject( - ResourceType schemaObject, JdbcSession jdbcSession) { - MResource row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - ResourceBusinessConfigurationType business = schemaObject.getBusiness(); - if (business != null) { - row.businessAdministrativeState = business.getAdministrativeState(); - } - - OperationalStateType operationalState = schemaObject.getOperationalState(); - if (operationalState != null) { - row.operationalStateLastAvailabilityStatus = - operationalState.getLastAvailabilityStatus(); - } - - setReference(schemaObject.getConnectorRef(), - o -> row.connectorRefTargetOid = o, - t -> row.connectorRefTargetType = t, - r -> row.connectorRefRelationId = r); - - return row; - } - - @Override - public void storeRelatedEntities(@NotNull MResource row, - @NotNull ResourceType schemaObject, @NotNull JdbcSession jdbcSession) { - super.storeRelatedEntities(row, schemaObject, jdbcSession); - - ResourceBusinessConfigurationType business = schemaObject.getBusiness(); - if (business != null) { - storeRefs(row, business.getApproverRef(), - QObjectReferenceMapping.INSTANCE_RESOURCE_BUSINESS_CONFIGURATION_APPROVER, - jdbcSession); - } - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/AbstractRoleSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/AbstractRoleSqlTransformer.java deleted file mode 100644 index 6b7c83f22d0..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/AbstractRoleSqlTransformer.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.role; - -import java.util.List; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.assignment.AssignmentSqlTransformer; -import com.evolveum.midpoint.repo.sqale.qmodel.focus.FocusSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AutoassignSpecificationType; - -public class AbstractRoleSqlTransformer< - S extends AbstractRoleType, Q extends QAbstractRole, R extends MAbstractRole> - extends FocusSqlTransformer { - - public AbstractRoleSqlTransformer( - SqlTransformerSupport transformerSupport, QAbstractRoleMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull R toRowObjectWithoutFullObject(S abstractRole, JdbcSession jdbcSession) { - R row = super.toRowObjectWithoutFullObject(abstractRole, jdbcSession); - - AutoassignSpecificationType autoassign = abstractRole.getAutoassign(); - if (autoassign != null) { - row.autoAssignEnabled = autoassign.isEnabled(); - } - setPolyString(abstractRole.getDisplayName(), - o -> row.displayNameOrig = o, n -> row.displayNameNorm = n); - row.identifier = abstractRole.getIdentifier(); - row.requestable = abstractRole.isRequestable(); - row.riskLevel = abstractRole.getRiskLevel(); - return row; - } - - @Override - public void storeRelatedEntities( - @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { - super.storeRelatedEntities(row, schemaObject, jdbcSession); - - List inducement = schemaObject.getInducement(); - if (!inducement.isEmpty()) { - AssignmentSqlTransformer transformer = - mapping().inducementMapping().createTransformer(transformerSupport); - inducement.forEach(assignment -> - transformer.insert(assignment, row, jdbcSession)); - } - } - - @Override - protected QAbstractRoleMapping mapping() { - return (QAbstractRoleMapping) super.mapping(); - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRoleMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRoleMapping.java index b0abeb426ef..c1f69a05847 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRoleMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QAbstractRoleMapping.java @@ -8,12 +8,15 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType.*; +import java.util.List; + import org.jetbrains.annotations.NotNull; import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignmentMapping; import com.evolveum.midpoint.repo.sqale.qmodel.focus.QFocusMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AutoassignSpecificationType; /** @@ -68,8 +71,30 @@ protected Q newAliasInstance(String alias) { } @Override - public AbstractRoleSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new AbstractRoleSqlTransformer<>(transformerSupport, this); + public @NotNull R toRowObjectWithoutFullObject(S abstractRole, JdbcSession jdbcSession) { + R row = super.toRowObjectWithoutFullObject(abstractRole, jdbcSession); + + AutoassignSpecificationType autoassign = abstractRole.getAutoassign(); + if (autoassign != null) { + row.autoAssignEnabled = autoassign.isEnabled(); + } + setPolyString(abstractRole.getDisplayName(), + o -> row.displayNameOrig = o, n -> row.displayNameNorm = n); + row.identifier = abstractRole.getIdentifier(); + row.requestable = abstractRole.isRequestable(); + row.riskLevel = abstractRole.getRiskLevel(); + return row; + } + + @Override + public void storeRelatedEntities( + @NotNull R row, @NotNull S schemaObject, @NotNull JdbcSession jdbcSession) { + super.storeRelatedEntities(row, schemaObject, jdbcSession); + + List inducement = schemaObject.getInducement(); + if (!inducement.isEmpty()) { + inducement.forEach(assignment -> + inducementMapping().insert(assignment, row, jdbcSession)); + } } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QArchetypeMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QArchetypeMapping.java index f867f70cbb4..55788f874b6 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QArchetypeMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QArchetypeMapping.java @@ -6,7 +6,6 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.role; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType; /** @@ -29,13 +28,6 @@ protected QArchetype newAliasInstance(String alias) { return new QArchetype(alias); } - @Override - public AbstractRoleSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new AbstractRoleSqlTransformer<>(transformerSupport, this); - } - @Override public MArchetype newRowObject() { return new MArchetype(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QRoleMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QRoleMapping.java index c7ca6f41ee2..bf33d135430 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QRoleMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QRoleMapping.java @@ -8,7 +8,9 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType.F_ROLE_TYPE; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import org.jetbrains.annotations.NotNull; + +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; /** @@ -34,12 +36,17 @@ protected QRole newAliasInstance(String alias) { } @Override - public RoleSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new RoleSqlTransformer(transformerSupport, this); + public MRole newRowObject() { + return new MRole(); } @Override - public MRole newRowObject() { - return new MRole(); + public @NotNull MRole toRowObjectWithoutFullObject( + RoleType schemaObject, JdbcSession jdbcSession) { + MRole row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + row.roleType = schemaObject.getRoleType(); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QServiceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QServiceMapping.java index 4b8d185fa16..3f0c2920588 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QServiceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/QServiceMapping.java @@ -8,7 +8,9 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType.F_DISPLAY_ORDER; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import org.jetbrains.annotations.NotNull; + +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; /** @@ -34,12 +36,17 @@ protected QService newAliasInstance(String alias) { } @Override - public ServiceSqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return new ServiceSqlTransformer(transformerSupport, this); + public MService newRowObject() { + return new MService(); } @Override - public MService newRowObject() { - return new MService(); + public @NotNull MService toRowObjectWithoutFullObject( + ServiceType schemaObject, JdbcSession jdbcSession) { + MService row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); + + row.displayOrder = schemaObject.getDisplayOrder(); + + return row; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/RoleSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/RoleSqlTransformer.java deleted file mode 100644 index 60dcbf2db88..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/RoleSqlTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.role; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; - -public class RoleSqlTransformer - extends AbstractRoleSqlTransformer { - - public RoleSqlTransformer( - SqlTransformerSupport transformerSupport, QRoleMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MRole toRowObjectWithoutFullObject( - RoleType schemaObject, JdbcSession jdbcSession) { - MRole row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - row.roleType = schemaObject.getRoleType(); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/ServiceSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/ServiceSqlTransformer.java deleted file mode 100644 index 5885dfe1c69..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/role/ServiceSqlTransformer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.role; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; - -public class ServiceSqlTransformer - extends AbstractRoleSqlTransformer { - - public ServiceSqlTransformer( - SqlTransformerSupport transformerSupport, QServiceMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MService toRowObjectWithoutFullObject( - ServiceType schemaObject, JdbcSession jdbcSession) { - MService row = super.toRowObjectWithoutFullObject(schemaObject, jdbcSession); - - row.displayOrder = schemaObject.getDisplayOrder(); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java index 7ff572cc48b..7fe2bb99a2a 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java @@ -8,8 +8,12 @@ import static com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType.*; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; /** @@ -51,13 +55,40 @@ protected QShadow newAliasInstance(String alias) { } @Override - public ShadowSqlTransformer createTransformer( + public QShadowMapping createTransformer( SqlTransformerSupport transformerSupport) { - return new ShadowSqlTransformer(transformerSupport, this); + return this; } @Override public MShadow newRowObject() { return new MShadow(); } + + @Override + public @NotNull MShadow toRowObjectWithoutFullObject( + ShadowType shadow, JdbcSession jdbcSession) { + MShadow row = super.toRowObjectWithoutFullObject(shadow, jdbcSession); + + row.objectClassId = processCacheableUri(shadow.getObjectClass()); + setReference(shadow.getResourceRef(), + o -> row.resourceRefTargetOid = o, + t -> row.resourceRefTargetType = t, + r -> row.resourceRefRelationId = r); + row.intent = shadow.getIntent(); + row.kind = shadow.getKind(); +// row.attemptNumber = shadow.att; TODO not set in RShadow, probably just with deltas? Where does it come from? + row.dead = shadow.isDead(); + row.exist = shadow.isExists(); + row.fullSynchronizationTimestamp = + MiscUtil.asInstant(shadow.getFullSynchronizationTimestamp()); + row.pendingOperationCount = shadow.getPendingOperation().size(); + row.primaryIdentifierValue = shadow.getPrimaryIdentifierValue(); + row.synchronizationSituation = shadow.getSynchronizationSituation(); + row.synchronizationTimestamp = MiscUtil.asInstant(shadow.getSynchronizationTimestamp()); + + // TODO extension attributes + // copyExtensionOrAttributesFromJAXB(jaxb.getAttributes().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.ATTRIBUTES, generatorResult); + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/ShadowSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/ShadowSqlTransformer.java deleted file mode 100644 index 1e229b4dae9..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/ShadowSqlTransformer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.shadow; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; - -public class ShadowSqlTransformer - extends ObjectSqlTransformer { - - public ShadowSqlTransformer( - SqlTransformerSupport transformerSupport, QShadowMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MShadow toRowObjectWithoutFullObject( - ShadowType shadow, JdbcSession jdbcSession) { - MShadow row = super.toRowObjectWithoutFullObject(shadow, jdbcSession); - - row.objectClassId = processCacheableUri(shadow.getObjectClass()); - setReference(shadow.getResourceRef(), - o -> row.resourceRefTargetOid = o, - t -> row.resourceRefTargetType = t, - r -> row.resourceRefRelationId = r); - row.intent = shadow.getIntent(); - row.kind = shadow.getKind(); -// row.attemptNumber = shadow.att; TODO not set in RShadow, probably just with deltas? Where does it come from? - row.dead = shadow.isDead(); - row.exist = shadow.isExists(); - row.fullSynchronizationTimestamp = - MiscUtil.asInstant(shadow.getFullSynchronizationTimestamp()); - row.pendingOperationCount = shadow.getPendingOperation().size(); - row.primaryIdentifierValue = shadow.getPrimaryIdentifierValue(); - row.synchronizationSituation = shadow.getSynchronizationSituation(); - row.synchronizationTimestamp = MiscUtil.asInstant(shadow.getSynchronizationTimestamp()); - - // TODO extension attributes - // copyExtensionOrAttributesFromJAXB(jaxb.getAttributes().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.ATTRIBUTES, generatorResult); - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSecurityPolicyMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSecurityPolicyMapping.java index 001f458c3b7..7cfeff53eb6 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSecurityPolicyMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSecurityPolicyMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.system; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; /** @@ -32,13 +30,6 @@ protected QSecurityPolicy newAliasInstance(String alias) { return new QSecurityPolicy(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSystemConfigurationMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSystemConfigurationMapping.java index b6f5b30e143..1ebaa23eb9a 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSystemConfigurationMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QSystemConfigurationMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.system; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; /** @@ -32,13 +30,6 @@ protected QSystemConfiguration newAliasInstance(String alias) { return new QSystemConfiguration(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QValuePolicyMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QValuePolicyMapping.java index 3b4d87a0277..0fda2aeb90e 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QValuePolicyMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/system/QValuePolicyMapping.java @@ -7,9 +7,7 @@ package com.evolveum.midpoint.repo.sqale.qmodel.system; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType; /** @@ -32,13 +30,6 @@ protected QValuePolicy newAliasInstance(String alias) { return new QValuePolicy(alias); } - @Override - public ObjectSqlTransformer - createTransformer(SqlTransformerSupport transformerSupport) { - // no special class needed, no additional columns - return new ObjectSqlTransformer<>(transformerSupport, this); - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java index 54d94df64d6..5397685ce17 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java @@ -6,8 +6,12 @@ */ package com.evolveum.midpoint.repo.sqale.qmodel.task; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; +import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; /** @@ -59,13 +63,46 @@ protected QTask newAliasInstance(String alias) { } @Override - public TaskSqlTransformer createTransformer( + public QTaskMapping createTransformer( SqlTransformerSupport transformerSupport) { - return new TaskSqlTransformer(transformerSupport, this); + return this; } @Override public MTask newRowObject() { return new MTask(); } + + @Override + public @NotNull MTask toRowObjectWithoutFullObject( + TaskType task, JdbcSession jdbcSession) { + MTask row = super.toRowObjectWithoutFullObject(task, jdbcSession); + + row.taskIdentifier = task.getTaskIdentifier(); + row.binding = task.getBinding(); + row.category = task.getCategory(); + row.completionTimestamp = MiscUtil.asInstant(task.getCompletionTimestamp()); + row.executionStatus = task.getExecutionStatus(); +// row.fullResult = TODO + row.handlerUriId = processCacheableUri(task.getHandlerUri()); + row.lastRunStartTimestamp = MiscUtil.asInstant(task.getLastRunStartTimestamp()); + row.lastRunFinishTimestamp = MiscUtil.asInstant(task.getLastRunFinishTimestamp()); + row.node = task.getNode(); + setReference(task.getObjectRef(), + o -> row.objectRefTargetOid = o, + t -> row.objectRefTargetType = t, + r -> row.objectRefRelationId = r); + setReference(task.getOwnerRef(), + o -> row.ownerRefTargetOid = o, + t -> row.ownerRefTargetType = t, + r -> row.ownerRefRelationId = r); + row.parent = task.getParent(); + row.recurrence = task.getRecurrence(); + row.resultStatus = task.getResultStatus(); + row.threadStopAction = task.getThreadStopAction(); + row.waitingReason = task.getWaitingReason(); + row.dependentTaskIdentifiers = task.getDependent().toArray(String[]::new); + + return row; + } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/TaskSqlTransformer.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/TaskSqlTransformer.java deleted file mode 100644 index 9058d52ddde..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/TaskSqlTransformer.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel.task; - -import org.jetbrains.annotations.NotNull; - -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; - -public class TaskSqlTransformer extends ObjectSqlTransformer { - - public TaskSqlTransformer(SqlTransformerSupport transformerSupport, QTaskMapping mapping) { - super(transformerSupport, mapping); - } - - @Override - public @NotNull MTask toRowObjectWithoutFullObject( - TaskType task, JdbcSession jdbcSession) { - MTask row = super.toRowObjectWithoutFullObject(task, jdbcSession); - - row.taskIdentifier = task.getTaskIdentifier(); - row.binding = task.getBinding(); - row.category = task.getCategory(); - row.completionTimestamp = MiscUtil.asInstant(task.getCompletionTimestamp()); - row.executionStatus = task.getExecutionStatus(); -// row.fullResult = TODO - row.handlerUriId = processCacheableUri(task.getHandlerUri()); - row.lastRunStartTimestamp = MiscUtil.asInstant(task.getLastRunStartTimestamp()); - row.lastRunFinishTimestamp = MiscUtil.asInstant(task.getLastRunFinishTimestamp()); - row.node = task.getNode(); - setReference(task.getObjectRef(), - o -> row.objectRefTargetOid = o, - t -> row.objectRefTargetType = t, - r -> row.objectRefRelationId = r); - setReference(task.getOwnerRef(), - o -> row.ownerRefTargetOid = o, - t -> row.ownerRefTargetType = t, - r -> row.ownerRefRelationId = r); - row.parent = task.getParent(); - row.recurrence = task.getRecurrence(); - row.resultStatus = task.getResultStatus(); - row.threadStopAction = task.getThreadStopAction(); - row.waitingReason = task.getWaitingReason(); - row.dependentTaskIdentifiers = task.getDependent().toArray(String[]::new); - - return row; - } -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java index e5bf09f6a98..d30e5677846 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java @@ -22,8 +22,8 @@ import com.evolveum.midpoint.repo.sqale.SqaleUtils; import com.evolveum.midpoint.repo.sqale.delta.DelegatingItemDeltaProcessor; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; -import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; +import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.RepositoryException; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; @@ -42,7 +42,7 @@ public class RootUpdateContext, R ext extends SqaleUpdateContext { private final S object; - protected final QueryTableMapping mapping; + protected final QObjectMapping mapping; private final Q rootPath; private final SQLUpdateClause update; private final int objectVersion; @@ -148,10 +148,7 @@ protected void finishExecutionOwn() throws SchemaException, RepositoryException update.set(rootPath.version, newVersion); update.set(rootPath.containerIdSeq, cidGenerator.lastUsedId() + 1); - - ObjectSqlTransformer transformer = - (ObjectSqlTransformer) mapping.createTransformer(transformerSupport); - update.set(rootPath.fullObject, transformer.createFullObject(object)); + update.set(rootPath.fullObject, mapping.createFullObject(object)); long rows = update.execute(); if (rows != 1) { diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java index 12e5515ddc3..fd2422fe226 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java @@ -18,7 +18,6 @@ import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor; import com.evolveum.midpoint.repo.sqale.delta.item.UriItemDeltaProcessor; import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; -import com.evolveum.midpoint.repo.sqale.qmodel.TransformerForOwnedBy; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.RepositoryException; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMapping; @@ -127,9 +126,7 @@ public R row() { @SuppressWarnings("UnusedReturnValue") public TR insertOwnedRow(QOwnedByMapping mapping, TS schemaObject) { - TransformerForOwnedBy transformer = - mapping.createTransformer(transformerSupport()); - return transformer.insert(schemaObject, row, jdbcSession); + return mapping.insert(schemaObject, row, jdbcSession); } public SqaleUpdateContext getSubcontext(ItemPath itemPath) { diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java index b007a0575de..9710f9c2643 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java @@ -22,12 +22,19 @@ */ public class SqlTransformerSupport { + private static SqlTransformerSupport instance; + protected final SchemaService schemaService; protected final SqlRepoContext sqlRepoContext; public SqlTransformerSupport(SchemaService schemaService, SqlRepoContext sqlRepoContext) { this.schemaService = schemaService; this.sqlRepoContext = sqlRepoContext; + instance = this; + } + + public static SqlTransformerSupport getInstance() { + return instance; } public Class qNameToSchemaClass(QName qName) { diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java index e6da4e258af..a702c535f98 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java @@ -260,6 +260,7 @@ public synchronized Q defaultAlias() { * or cache (I don't like the sound of that). On the other hand they are really lightweight * and short lived helpers too, so it shouldn't be a real GC problem. */ + @Deprecated public SqlTransformer createTransformer( SqlTransformerSupport transformerSupport) { throw new UnsupportedOperationException("Bean transformer not supported for " + queryType()); From a52a7f84dcb109f62a6f19d8246c114bc19bc435 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Fri, 30 Apr 2021 14:32:44 +0200 Subject: [PATCH 2/4] SqlTransformer completely gone, all is in mapping now, audit included --- .../repo/sqale/SqaleQueryContext.java | 6 - .../repo/sqale/SqaleRepositoryService.java | 6 +- .../sqale/qmodel/QObjectTemplateMapping.java | 7 - .../repo/sqale/qmodel/SqaleTableMapping.java | 16 +- .../qmodel/common/QContainerMapping.java | 5 - .../sqale/qmodel/object/QObjectMapping.java | 6 - .../sqale/qmodel/ref/QReferenceMapping.java | 6 - .../qmodel/report/QReportDataMapping.java | 6 - .../sqale/qmodel/report/QReportMapping.java | 6 - .../qmodel/resource/QResourceMapping.java | 6 - .../sqale/qmodel/shadow/QShadowMapping.java | 7 - .../repo/sqale/qmodel/task/QTaskMapping.java | 7 - .../repo/sql/SqlAuditServiceImpl.java | 4 +- .../repo/sql/audit/AuditSqlQueryContext.java | 6 - .../sql/audit/beans/MAuditEventRecord.java | 15 +- .../mapping/AuditDeltaSqlTransformer.java | 75 ----- .../AuditEventRecordSqlTransformer.java | 263 ------------------ .../AuditTableMapping.java} | 32 +-- .../sql/audit/mapping/QAuditDeltaMapping.java | 53 +++- .../mapping/QAuditEventRecordMapping.java | 233 +++++++++++++++- .../sql/audit/mapping/QAuditItemMapping.java | 3 +- .../mapping/QAuditPropertyValueMapping.java | 3 +- .../audit/mapping/QAuditRefValueMapping.java | 3 +- .../audit/mapping/QAuditResourceMapping.java | 3 +- .../repo/sqlbase/SqlQueryContext.java | 25 +- .../sqlbase/mapping/QueryModelMapping.java | 4 + .../sqlbase/mapping/QueryTableMapping.java | 49 ++-- .../mapping/SqlTransformationException.java | 18 ++ .../repo/sqlbase/mapping/SqlTransformer.java | 65 ----- 29 files changed, 369 insertions(+), 569 deletions(-) delete mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditDeltaSqlTransformer.java delete mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditEventRecordSqlTransformer.java rename repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/{AuditSqlTransformerBase.java => mapping/AuditTableMapping.java} (80%) create mode 100644 repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java delete mode 100644 repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformer.java diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java index cffe745ec8d..07f9e0ff2dd 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java @@ -18,7 +18,6 @@ import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; import com.evolveum.midpoint.repo.sqlbase.filtering.FilterProcessor; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; public class SqaleQueryContext, R> @@ -48,11 +47,6 @@ private SqaleQueryContext( super(entityPath, mapping, sqlRepoContext, transformerSupport, query); } - @Override - protected SqlTransformer createTransformer() { - return entityPathMapping.createTransformer(transformerSupport); - } - @Override public FilterProcessor createInOidFilter(SqlQueryContext context) { return new InOidFilterProcessor(context); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java index 47dfa1f6840..42899eb84ce 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java @@ -184,8 +184,7 @@ private S readByOid( throw new ObjectNotFoundException(schemaType, oid.toString()); } - return rootMapping.createTransformer(transformerSupport) - .toSchemaObject(result, root, options); + return rootMapping.toSchemaObject(result, root, options); } @Override @@ -416,8 +415,7 @@ RootUpdateContext prepareUpdateContext( throw new ObjectNotFoundException(schemaType, oid.toString()); } - S object = rootMapping.createTransformer(transformerSupport) - .toSchemaObject(result, root, Collections.emptyList()); + S object = rootMapping.toSchemaObject(result, root, Collections.emptyList()); R rootRow = rootMapping.newRowObject(); rootRow.oid = oid; diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java index c97b359d9e0..f492dfda53f 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/QObjectTemplateMapping.java @@ -14,7 +14,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; /** @@ -39,12 +38,6 @@ protected QObjectTemplate newAliasInstance(String alias) { return new QObjectTemplate(alias); } - @Override - public QObjectTemplateMapping createTransformer( - SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MObject newRowObject() { return new MObject(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java index 0b2d5986a9c..af453912c57 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java @@ -18,8 +18,6 @@ import com.querydsl.sql.ColumnMetadata; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; import com.evolveum.midpoint.repo.sqale.delta.item.*; @@ -37,7 +35,6 @@ import com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.TimestampItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -59,9 +56,7 @@ */ public abstract class SqaleTableMapping, R> extends QueryTableMapping - implements SqaleMappingMixin, SqlTransformer { - - protected final Logger logger = LoggerFactory.getLogger(getClass()); + implements SqaleMappingMixin { protected SqaleTableMapping( @NotNull String tableName, @@ -105,7 +100,8 @@ public SqaleItemSqlMapper integerMapper( * @param mapped schema type, see javadoc in {@link QueryTableMapping} */ @Override - protected SqaleItemSqlMapper booleanMapper(Function rootToQueryItem) { + protected SqaleItemSqlMapper booleanMapper( + Function rootToQueryItem) { return new SqaleItemSqlMapper<>( ctx -> new SimpleItemFilterProcessor<>(ctx, rootToQueryItem), ctx -> new SimpleItemDeltaProcessor<>(ctx, rootToQueryItem), @@ -242,7 +238,8 @@ protected ObjectReferenceType objectReferenceType( return new ObjectReferenceType() .oid(oid) - .type(SqaleTransformerSupport.getInstance().schemaClassToQName(repoObjectType.getSchemaType())) + .type(SqaleTransformerSupport.getInstance() + .schemaClassToQName(repoObjectType.getSchemaType())) .description(targetName) .targetName(targetName); } @@ -287,7 +284,8 @@ protected Integer processCacheableUri(String uri) { /** Returns ID for URI creating new cache row in DB as needed. */ protected Integer processCacheableUri(QName qName) { return qName != null - ? SqaleTransformerSupport.getInstance().processCacheableUri(QNameUtil.qNameToUri(qName)) + ? SqaleTransformerSupport.getInstance() + .processCacheableUri(QNameUtil.qNameToUri(qName)) : null; } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java index 58fbe74beb4..0bb4cb72005 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/common/QContainerMapping.java @@ -12,7 +12,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; /** * Mapping between {@link QContainer} and {@link Containerable}. @@ -55,10 +54,6 @@ public R newRowObject(OR ownerRow) { "Container bean creation for owner row called on abstract container mapping"); } - public QContainerMapping createTransformer(SqlTransformerSupport transformerSupport) { - return this; - } - @Override public R newRowObject() { //noinspection unchecked diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java index 8dd59af9d46..e8d43b9abb4 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java @@ -30,7 +30,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -182,11 +181,6 @@ protected Q newAliasInstance(String alias) { return (Q) new QObject<>(MObject.class, alias); } - @Override - public SqlTransformer createTransformer(SqlTransformerSupport transformerSupport) { - return this; - } - @Override public R newRowObject() { //noinspection unchecked diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java index 37c5138901e..0ad554ca371 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/ref/QReferenceMapping.java @@ -15,7 +15,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; @@ -61,11 +60,6 @@ protected Q newAliasInstance(String alias) { return (Q) new QReference<>(MReference.class, alias); } - public QReferenceMapping createTransformer( - SqlTransformerSupport transformerSupport) { - return this; - } - /** Defines a contract for creating the reference for the provided owner row. */ public R newRowObject(OR ownerRow) { throw new UnsupportedOperationException( diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java index 04dd1e88576..68f32bf115f 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportDataMapping.java @@ -12,7 +12,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType; /** @@ -40,11 +39,6 @@ protected QReportData newAliasInstance(String alias) { return new QReportData(alias); } - @Override - public QReportDataMapping createTransformer(SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MReportData newRowObject() { return new MReportData(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java index 74ef986fdbd..c07dd68b7a7 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/report/QReportMapping.java @@ -10,7 +10,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.JasperReportEngineConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; @@ -40,11 +39,6 @@ protected QReport newAliasInstance(String alias) { return new QReport(alias); } - @Override - public QReportMapping createTransformer(SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MReport newRowObject() { return new MReport(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java index b5b72b7229c..9f8964fab34 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/resource/QResourceMapping.java @@ -13,7 +13,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBusinessConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; @@ -51,11 +50,6 @@ protected QResource newAliasInstance(String alias) { return new QResource(alias); } - @Override - public QResourceMapping createTransformer(SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MResource newRowObject() { return new MResource(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java index 7fe2bb99a2a..c68a2a35293 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/shadow/QShadowMapping.java @@ -12,7 +12,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -54,12 +53,6 @@ protected QShadow newAliasInstance(String alias) { return new QShadow(alias); } - @Override - public QShadowMapping createTransformer( - SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MShadow newRowObject() { return new MShadow(); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java index 5397685ce17..16bf53d48e1 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/task/QTaskMapping.java @@ -10,7 +10,6 @@ import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; @@ -62,12 +61,6 @@ protected QTask newAliasInstance(String alias) { return new QTask(alias); } - @Override - public QTaskMapping createTransformer( - SqlTransformerSupport transformerSupport) { - return this; - } - @Override public MTask newRowObject() { return new MTask(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index 9c8984d9307..2629cbdac40 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -179,9 +179,7 @@ private Long insertAuditEventRecord( JdbcSession jdbcSession, AuditEventRecord record) { QAuditEventRecordMapping aerMapping = QAuditEventRecordMapping.INSTANCE; QAuditEventRecord aer = aerMapping.defaultAlias(); - MAuditEventRecord aerBean = aerMapping - .createTransformer(transformerSupport) - .from(record); + MAuditEventRecord aerBean = aerMapping.from(record); SQLInsertClause insert = jdbcSession.newInsert(aer).populate(aerBean); Map customColumns = aerMapping.getExtensionColumns(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java index 81068d051ed..7656a79d106 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java @@ -12,7 +12,6 @@ import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; /** @@ -47,11 +46,6 @@ private AuditSqlQueryContext( super(entityPath, mapping, sqlRepoContext, transformerSupport, query); } - @Override - protected SqlTransformer createTransformer() { - return entityPathMapping.createTransformer(transformerSupport); - } - @Override protected , TR> SqlQueryContext deriveNew(TQ newPath, QueryTableMapping newMapping) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/beans/MAuditEventRecord.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/beans/MAuditEventRecord.java index 40560e8350f..0466a587903 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/beans/MAuditEventRecord.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/beans/MAuditEventRecord.java @@ -9,22 +9,9 @@ import java.time.Instant; import java.util.*; -import com.evolveum.midpoint.repo.sql.audit.mapping.AuditEventRecordSqlTransformer; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord; -/** - * Querydsl "row bean" type related to {@link QAuditEventRecord}. - *

- * Design notes (TODO reconsider in 2021 and possibly remove if settled): - * This bean is super stupid for now. - * It can have getters/setters and handle more transformations and trimming (in setters), - * but at this moment this is left to transformation code like in {@link AuditEventRecordSqlTransformer}. - * I'd not suggest to move complete transformations here, but small conversions and trimming could - * be here - but how to do it reasonably without converting all fields to private + set/get methods? - * Can additional setter indicate conversion/trimming duties? - * What about methods like {@code SqlTransformerBase.trim()}, should we create common supertype - * to make it easy to call them in M-beans? Or should we use RUtil? - */ +/** Querydsl "row bean" type related to {@link QAuditEventRecord}. */ @SuppressWarnings("unused") public class MAuditEventRecord { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditDeltaSqlTransformer.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditDeltaSqlTransformer.java deleted file mode 100644 index 7a820f582ba..00000000000 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditDeltaSqlTransformer.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sql.audit.mapping; - -import com.querydsl.sql.SQLServerTemplates; -import com.querydsl.sql.SQLTemplates; - -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.repo.sql.audit.AuditSqlTransformerBase; -import com.evolveum.midpoint.repo.sql.audit.beans.MAuditDelta; -import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditDelta; -import com.evolveum.midpoint.repo.sql.util.RUtil; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectDeltaOperationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; -import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - -/** - * Transformer between repo and Prism world for audit event. - */ -public class AuditDeltaSqlTransformer - extends AuditSqlTransformerBase { - - private static final Trace LOGGER = TraceManager.getTrace(AuditDeltaSqlTransformer.class); - - public AuditDeltaSqlTransformer( - SqlTransformerSupport transformerSupport, QAuditDeltaMapping mapping) { - super(transformerSupport, mapping); - } - - public ObjectDeltaOperationType toSchemaObject(MAuditDelta row) { - ObjectDeltaOperationType odo = new ObjectDeltaOperationType(); - SQLTemplates querydslTemplates = transformerSupport.sqlRepoContext().getQuerydslTemplates(); - - boolean usingSqlServer = querydslTemplates instanceof SQLServerTemplates; - odo.setObjectDelta(parseBytes(row.delta, usingSqlServer, ObjectDeltaType.class)); - odo.setExecutionResult(parseBytes(row.fullResult, usingSqlServer, OperationResultType.class)); - - if (row.objectNameOrig != null || row.objectNameNorm != null) { - odo.setObjectName(new PolyStringType( - new PolyString(row.objectNameOrig, row.objectNameNorm))); - } - odo.setResourceOid(row.resourceOid); - if (row.resourceNameOrig != null || row.resourceNameNorm != null) { - odo.setResourceName(new PolyStringType( - new PolyString(row.resourceNameOrig, row.resourceNameNorm))); - } - - return odo; - } - - private T parseBytes(byte[] bytes, boolean usingSqlServer, Class clazz) { - if (bytes == null) { - return null; - } - - try { - return transformerSupport - .createStringParser(RUtil.getSerializedFormFromBytes(bytes, usingSqlServer)) - .compat() - .parseRealValue(clazz); - } catch (SchemaException e) { - LOGGER.error("Cannot parse {}: {}", clazz.getSimpleName(), e.getMessage(), e); - return null; - } - } -} diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditEventRecordSqlTransformer.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditEventRecordSqlTransformer.java deleted file mode 100644 index dbca9ac7ccd..00000000000 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditEventRecordSqlTransformer.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sql.audit.mapping; - -import static com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord.MESSAGE; - -import java.util.List; -import java.util.Map; -import javax.xml.namespace.QName; - -import com.querydsl.core.Tuple; - -import com.evolveum.midpoint.audit.api.AuditEventRecord; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.repo.sql.audit.AuditSqlTransformerBase; -import com.evolveum.midpoint.repo.sql.audit.beans.MAuditDelta; -import com.evolveum.midpoint.repo.sql.audit.beans.MAuditEventRecord; -import com.evolveum.midpoint.repo.sql.audit.beans.MAuditRefValue; -import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditDelta; -import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord; -import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventStage; -import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventType; -import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; -import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.audit_3.*; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectDeltaOperationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - -/** - * Transformation of audit event records between repo and Prism world. - */ -public class AuditEventRecordSqlTransformer - extends AuditSqlTransformerBase { - - public AuditEventRecordSqlTransformer( - SqlTransformerSupport transformerSupport, QAuditEventRecordMapping mapping) { - super(transformerSupport, mapping); - } - - public AuditEventRecordType toSchemaObject(MAuditEventRecord row) throws SchemaException { - AuditEventRecordType record = mapSimpleAttributes(row); - mapDeltas(record, row.deltas); - mapChangedItems(record, row.changedItemPaths); - mapRefValues(record, row.refValues); - mapProperties(record, row.properties); - mapResourceOids(record, row.resourceOids); - return record; - } - - private AuditEventRecordType mapSimpleAttributes(MAuditEventRecord row) { - // prismContext in constructor ensures complex type definition - return new AuditEventRecordType(transformerSupport.prismContext()) - .repoId(row.id) - .channel(row.channel) - .eventIdentifier(row.eventIdentifier) - .eventStage(auditEventStageTypeFromRepo(row.eventStage)) - .eventType(auditEventTypeTypeFromRepo(row.eventType)) - .hostIdentifier(row.hostIdentifier) - .message(row.message) - .nodeIdentifier(row.nodeIdentifier) - .outcome(operationResultStatusTypeFromRepo(row.outcome)) - .parameter(row.parameter) - .remoteHostAddress(row.remoteHostAddress) - .requestIdentifier(row.requestIdentifier) - .result(row.result) - .sessionIdentifier(row.sessionIdentifier) - .taskIdentifier(row.taskIdentifier) - .taskOID(row.taskOid) - .timestamp(MiscUtil.asXMLGregorianCalendar(row.timestamp)) - .initiatorRef(objectReferenceType( - row.initiatorOid, - repoObjectType(row.initiatorType, RObjectType.FOCUS), - row.initiatorName)) - .attorneyRef(objectReferenceType( - row.attorneyOid, RObjectType.FOCUS, row.attorneyName)) - .targetRef(objectReferenceType( - row.targetOid, - // targetType must not be null if targetOid is not - repoObjectType(row.targetType), - row.targetName)) - .targetOwnerRef(objectReferenceType( - row.targetOwnerOid, - repoObjectType(row.targetOwnerType), - row.targetOwnerName)); - } - - private void mapDeltas(AuditEventRecordType record, List deltas) - throws SchemaException { - if (deltas == null) { - return; - } - - SqlTransformer deltaTransformer = - QAuditDeltaMapping.INSTANCE.createTransformer(transformerSupport); - for (MAuditDelta delta : deltas) { - record.delta(deltaTransformer.toSchemaObject(delta)); - } - } - - // the rest of sub-entities do not deserve the dedicated transformer classes (yet) - private void mapChangedItems(AuditEventRecordType record, List changedItemPaths) { - if (changedItemPaths == null) { - return; - } - - for (String changedItemPath : changedItemPaths) { - ItemPath itemPath = ItemPath.create(changedItemPath); - record.getChangedItem().add(new ItemPathType(itemPath)); - } - } - - private void mapRefValues( - AuditEventRecordType record, Map> refValues) { - if (refValues == null) { - return; - } - - for (Map.Entry> entry : refValues.entrySet()) { - AuditEventRecordReferenceType referenceValues = - new AuditEventRecordReferenceType().name(entry.getKey()); - for (MAuditRefValue refValue : entry.getValue()) { - AuditEventRecordReferenceValueType value = new AuditEventRecordReferenceValueType() - .oid(refValue.oid) - .type(QName.valueOf(refValue.type)); - if (refValue.targetNameOrig != null) { - value.targetName(new PolyStringType( - new PolyString(refValue.targetNameOrig, refValue.targetNameNorm))); - } - referenceValues.value(value); - } - record.reference(referenceValues); - } - } - - private void mapProperties(AuditEventRecordType record, Map> properties) { - if (properties == null) { - return; - } - - for (Map.Entry> entry : properties.entrySet()) { - AuditEventRecordPropertyType propType = - new AuditEventRecordPropertyType().name(entry.getKey()); - propType.getValue().addAll(entry.getValue()); - record.property(propType); - } - } - - private void mapResourceOids( - AuditEventRecordType record, List resourceOids) { - if (resourceOids == null) { - return; - } - - record.getResourceOid().addAll(resourceOids); - } - - private AuditEventTypeType auditEventTypeTypeFromRepo(Integer ordinal) { - RAuditEventType eventType = MiscUtil.enumFromOrdinal(RAuditEventType.class, ordinal); - return eventType != null - ? eventType.getSchemaValue() - : null; - } - - private AuditEventStageType auditEventStageTypeFromRepo(Integer ordinal) { - RAuditEventStage stage = MiscUtil.enumFromOrdinal(RAuditEventStage.class, ordinal); - return stage != null - ? stage.getSchemaValue() - : null; - } - - private OperationResultStatusType operationResultStatusTypeFromRepo(Integer ordinal) { - ROperationResultStatus status = - MiscUtil.enumFromOrdinal(ROperationResultStatus.class, ordinal); - return status != null - ? status.getSchemaValue() - : null; - } - - /** - * Transforms {@link AuditEventRecord} to {@link MAuditEventRecord} without any subentities. - *

- * Design notes: Arguably, this code could be in {@link MAuditEventRecord}. - * Also the - */ - public MAuditEventRecord from(AuditEventRecord record) { - MAuditEventRecord bean = new MAuditEventRecord(); - bean.id = record.getRepoId(); // this better be null if we want to insert - bean.eventIdentifier = record.getEventIdentifier(); - bean.timestamp = MiscUtil.asInstant(record.getTimestamp()); - bean.channel = record.getChannel(); - bean.eventStage = MiscUtil.enumOrdinal(RAuditEventStage.from(record.getEventStage())); - bean.eventType = MiscUtil.enumOrdinal(RAuditEventType.from(record.getEventType())); - bean.hostIdentifier = record.getHostIdentifier(); - - PrismReferenceValue attorney = record.getAttorneyRef(); - if (attorney != null) { - bean.attorneyName = attorney.getDescription(); - bean.attorneyOid = attorney.getOid(); - } - - PrismReferenceValue initiator = record.getInitiatorRef(); - if (initiator != null) { - bean.initiatorName = initiator.getDescription(); - bean.initiatorOid = initiator.getOid(); - bean.initiatorType = targetTypeToRepoOrdinal(initiator); - } - - bean.message = trim(record.getMessage(), MESSAGE); - bean.nodeIdentifier = record.getNodeIdentifier(); - bean.outcome = MiscUtil.enumOrdinal(ROperationResultStatus.from(record.getOutcome())); - bean.parameter = record.getParameter(); - bean.remoteHostAddress = record.getRemoteHostAddress(); - bean.requestIdentifier = record.getRequestIdentifier(); - bean.result = record.getResult(); - bean.sessionIdentifier = record.getSessionIdentifier(); - - PrismReferenceValue target = record.getTargetRef(); - if (target != null) { - bean.targetName = target.getDescription(); - bean.targetOid = target.getOid(); - bean.targetType = targetTypeToRepoOrdinal(target); - } - PrismReferenceValue targetOwner = record.getTargetOwnerRef(); - if (targetOwner != null) { - bean.targetOwnerName = targetOwner.getDescription(); - bean.targetOwnerOid = targetOwner.getOid(); - bean.targetOwnerType = targetTypeToRepoOrdinal(targetOwner); - } - bean.taskIdentifier = record.getTaskIdentifier(); - bean.taskOid = record.getTaskOid(); - return bean; - } - - private Integer targetTypeToRepoOrdinal(PrismReferenceValue targetOwner) { - //noinspection rawtypes - Class objectClass = transformerSupport.qNameToSchemaClass(targetOwner.getTargetType()); - //noinspection unchecked - return MiscUtil.enumOrdinal(RObjectType.getByJaxbType(objectClass)); - } - - @Override - protected void processExtensionColumns( - AuditEventRecordType schemaObject, Tuple tuple, QAuditEventRecord entityPath) { - for (String propertyName : mapping.getExtensionColumns().keySet()) { - Object customColumnValue = tuple.get(entityPath.getPath(propertyName)); - schemaObject.getCustomColumnProperty().add( - new AuditEventRecordCustomColumnPropertyType() - .name(propertyName).value((String) customColumnValue)); - } - } -} diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlTransformerBase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java similarity index 80% rename from repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlTransformerBase.java rename to repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java index 1deeef56da9..5ce8221f693 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlTransformerBase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java @@ -4,7 +4,7 @@ * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.repo.sql.audit; +package com.evolveum.midpoint.repo.sql.audit.mapping; import java.util.Collection; @@ -16,31 +16,25 @@ import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -/** Transformation functionality common for audit. */ -public abstract class AuditSqlTransformerBase, R> - implements SqlTransformer { - - protected final SqlTransformerSupport transformerSupport; - protected final QueryTableMapping mapping; +/** + * Common functionality for audit table mapping, mostly around row/object transformation. + */ +public abstract class AuditTableMapping, R> + extends QueryTableMapping { - protected AuditSqlTransformerBase( - SqlTransformerSupport transformerSupport, QueryTableMapping mapping) { - this.transformerSupport = transformerSupport; - this.mapping = mapping; + protected AuditTableMapping(@NotNull String tableName, @NotNull String defaultAliasName, @NotNull Class schemaType, @NotNull Class queryType) { + super(tableName, defaultAliasName, schemaType, queryType); } @Override public S toSchemaObject( - Tuple tuple, Q entityPath, Collection> options) - throws SchemaException { + Tuple tuple, Q entityPath, Collection> options) { S schemaObject = toSchemaObject(tuple.get(entityPath)); processExtensionColumns(schemaObject, tuple, entityPath); return schemaObject; @@ -69,7 +63,8 @@ protected ObjectReferenceType objectReferenceType( return new ObjectReferenceType() .oid(oid) - .type(transformerSupport.schemaClassToQName(repoObjectType.getJaxbClass())) + .type(SqlTransformerSupport.getInstance() + .schemaClassToQName(repoObjectType.getJaxbClass())) .description(targetName) .targetName(targetName); } @@ -109,4 +104,9 @@ protected ObjectReferenceType objectReferenceType( } return MiscUtil.trimString(value, columnMetadata.getSize()); } + + @Override + public S toSchemaObject(R row) { + throw new UnsupportedOperationException("Implemented in subclasses only"); + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java index 29664f946cd..40042910e00 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java @@ -8,18 +8,25 @@ import static com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditItem.TABLE_NAME; +import com.querydsl.sql.SQLServerTemplates; +import com.querydsl.sql.SQLTemplates; + +import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.repo.sql.audit.beans.MAuditDelta; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditDelta; +import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectDeltaOperationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; +import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** * Mapping between {@link QAuditDelta} and {@link ObjectDeltaOperationType}. */ public class QAuditDeltaMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "ad"; @@ -35,9 +42,41 @@ protected QAuditDelta newAliasInstance(String alias) { return new QAuditDelta(alias); } - @Override - public SqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new AuditDeltaSqlTransformer(transformerSupport, this); + public ObjectDeltaOperationType toSchemaObject(MAuditDelta row) { + ObjectDeltaOperationType odo = new ObjectDeltaOperationType(); + SQLTemplates querydslTemplates = + SqlTransformerSupport.getInstance().sqlRepoContext().getQuerydslTemplates(); + + boolean usingSqlServer = querydslTemplates instanceof SQLServerTemplates; + odo.setObjectDelta(parseBytes(row.delta, usingSqlServer, ObjectDeltaType.class)); + odo.setExecutionResult(parseBytes(row.fullResult, usingSqlServer, OperationResultType.class)); + + if (row.objectNameOrig != null || row.objectNameNorm != null) { + odo.setObjectName(new PolyStringType( + new PolyString(row.objectNameOrig, row.objectNameNorm))); + } + odo.setResourceOid(row.resourceOid); + if (row.resourceNameOrig != null || row.resourceNameNorm != null) { + odo.setResourceName(new PolyStringType( + new PolyString(row.resourceNameOrig, row.resourceNameNorm))); + } + + return odo; + } + + private T parseBytes(byte[] bytes, boolean usingSqlServer, Class clazz) { + if (bytes == null) { + return null; + } + + try { + return SqlTransformerSupport.getInstance() + .createStringParser(RUtil.getSerializedFormFromBytes(bytes, usingSqlServer)) + .compat() + .parseRealValue(clazz); + } catch (SchemaException e) { + logger.error("Cannot parse {}: {}", clazz.getSimpleName(), e.getMessage(), e); + return null; + } } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java index b764c2352a7..04c8fcf0ec4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java @@ -6,28 +6,45 @@ */ package com.evolveum.midpoint.repo.sql.audit.mapping; +import static com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord.MESSAGE; import static com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord.TABLE_NAME; import static com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType.*; +import java.util.List; +import java.util.Map; +import javax.xml.namespace.QName; + +import com.querydsl.core.Tuple; + +import com.evolveum.midpoint.audit.api.AuditEventRecord; +import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.repo.sql.audit.beans.MAuditDelta; import com.evolveum.midpoint.repo.sql.audit.beans.MAuditEventRecord; +import com.evolveum.midpoint.repo.sql.audit.beans.MAuditRefValue; import com.evolveum.midpoint.repo.sql.audit.querymodel.*; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventStage; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventType; import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; +import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.filtering.item.CanonicalItemPathItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.DetailTableItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.EnumOrdinalItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.repo.sqlbase.mapping.SqlDetailFetchMapper; -import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.xml.ns._public.common.audit_3.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** * Mapping between {@link QAuditEventRecord} and {@link AuditEventRecordType}. */ public class QAuditEventRecordMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "aer"; @@ -120,9 +137,213 @@ protected QAuditEventRecord newAliasInstance(String alias) { return new QAuditEventRecord(alias); } + public AuditEventRecordType toSchemaObject(MAuditEventRecord row) { + AuditEventRecordType record = mapSimpleAttributes(row); + mapDeltas(record, row.deltas); + mapChangedItems(record, row.changedItemPaths); + mapRefValues(record, row.refValues); + mapProperties(record, row.properties); + mapResourceOids(record, row.resourceOids); + return record; + } + + private AuditEventRecordType mapSimpleAttributes(MAuditEventRecord row) { + // prismContext in constructor ensures complex type definition + return new AuditEventRecordType(SqlTransformerSupport.getInstance().prismContext()) + .repoId(row.id) + .channel(row.channel) + .eventIdentifier(row.eventIdentifier) + .eventStage(auditEventStageTypeFromRepo(row.eventStage)) + .eventType(auditEventTypeTypeFromRepo(row.eventType)) + .hostIdentifier(row.hostIdentifier) + .message(row.message) + .nodeIdentifier(row.nodeIdentifier) + .outcome(operationResultStatusTypeFromRepo(row.outcome)) + .parameter(row.parameter) + .remoteHostAddress(row.remoteHostAddress) + .requestIdentifier(row.requestIdentifier) + .result(row.result) + .sessionIdentifier(row.sessionIdentifier) + .taskIdentifier(row.taskIdentifier) + .taskOID(row.taskOid) + .timestamp(MiscUtil.asXMLGregorianCalendar(row.timestamp)) + .initiatorRef(objectReferenceType( + row.initiatorOid, + repoObjectType(row.initiatorType, RObjectType.FOCUS), + row.initiatorName)) + .attorneyRef(objectReferenceType( + row.attorneyOid, RObjectType.FOCUS, row.attorneyName)) + .targetRef(objectReferenceType( + row.targetOid, + // targetType must not be null if targetOid is not + repoObjectType(row.targetType), + row.targetName)) + .targetOwnerRef(objectReferenceType( + row.targetOwnerOid, + repoObjectType(row.targetOwnerType), + row.targetOwnerName)); + } + + private void mapDeltas(AuditEventRecordType record, List deltas) { + if (deltas == null) { + return; + } + + for (MAuditDelta delta : deltas) { + record.delta(QAuditDeltaMapping.INSTANCE.toSchemaObject(delta)); + } + } + + // the rest of sub-entities do not deserve the dedicated transformer classes (yet) + private void mapChangedItems(AuditEventRecordType record, List changedItemPaths) { + if (changedItemPaths == null) { + return; + } + + for (String changedItemPath : changedItemPaths) { + ItemPath itemPath = ItemPath.create(changedItemPath); + record.getChangedItem().add(new ItemPathType(itemPath)); + } + } + + private void mapRefValues( + AuditEventRecordType record, Map> refValues) { + if (refValues == null) { + return; + } + + for (Map.Entry> entry : refValues.entrySet()) { + AuditEventRecordReferenceType referenceValues = + new AuditEventRecordReferenceType().name(entry.getKey()); + for (MAuditRefValue refValue : entry.getValue()) { + AuditEventRecordReferenceValueType value = new AuditEventRecordReferenceValueType() + .oid(refValue.oid) + .type(QName.valueOf(refValue.type)); + if (refValue.targetNameOrig != null) { + value.targetName(new PolyStringType( + new PolyString(refValue.targetNameOrig, refValue.targetNameNorm))); + } + referenceValues.value(value); + } + record.reference(referenceValues); + } + } + + private void mapProperties(AuditEventRecordType record, Map> properties) { + if (properties == null) { + return; + } + + for (Map.Entry> entry : properties.entrySet()) { + AuditEventRecordPropertyType propType = + new AuditEventRecordPropertyType().name(entry.getKey()); + propType.getValue().addAll(entry.getValue()); + record.property(propType); + } + } + + private void mapResourceOids( + AuditEventRecordType record, List resourceOids) { + if (resourceOids == null) { + return; + } + + record.getResourceOid().addAll(resourceOids); + } + + private AuditEventTypeType auditEventTypeTypeFromRepo(Integer ordinal) { + RAuditEventType eventType = MiscUtil.enumFromOrdinal(RAuditEventType.class, ordinal); + return eventType != null + ? eventType.getSchemaValue() + : null; + } + + private AuditEventStageType auditEventStageTypeFromRepo(Integer ordinal) { + RAuditEventStage stage = MiscUtil.enumFromOrdinal(RAuditEventStage.class, ordinal); + return stage != null + ? stage.getSchemaValue() + : null; + } + + private OperationResultStatusType operationResultStatusTypeFromRepo(Integer ordinal) { + ROperationResultStatus status = + MiscUtil.enumFromOrdinal(ROperationResultStatus.class, ordinal); + return status != null + ? status.getSchemaValue() + : null; + } + + /** + * Transforms {@link AuditEventRecord} to {@link MAuditEventRecord} without any subentities. + *

+ * Design notes: Arguably, this code could be in {@link MAuditEventRecord}. + * Also the + */ + public MAuditEventRecord from(AuditEventRecord record) { + MAuditEventRecord bean = new MAuditEventRecord(); + bean.id = record.getRepoId(); // this better be null if we want to insert + bean.eventIdentifier = record.getEventIdentifier(); + bean.timestamp = MiscUtil.asInstant(record.getTimestamp()); + bean.channel = record.getChannel(); + bean.eventStage = MiscUtil.enumOrdinal(RAuditEventStage.from(record.getEventStage())); + bean.eventType = MiscUtil.enumOrdinal(RAuditEventType.from(record.getEventType())); + bean.hostIdentifier = record.getHostIdentifier(); + + PrismReferenceValue attorney = record.getAttorneyRef(); + if (attorney != null) { + bean.attorneyName = attorney.getDescription(); + bean.attorneyOid = attorney.getOid(); + } + + PrismReferenceValue initiator = record.getInitiatorRef(); + if (initiator != null) { + bean.initiatorName = initiator.getDescription(); + bean.initiatorOid = initiator.getOid(); + bean.initiatorType = targetTypeToRepoOrdinal(initiator); + } + + bean.message = trim(record.getMessage(), MESSAGE); + bean.nodeIdentifier = record.getNodeIdentifier(); + bean.outcome = MiscUtil.enumOrdinal(ROperationResultStatus.from(record.getOutcome())); + bean.parameter = record.getParameter(); + bean.remoteHostAddress = record.getRemoteHostAddress(); + bean.requestIdentifier = record.getRequestIdentifier(); + bean.result = record.getResult(); + bean.sessionIdentifier = record.getSessionIdentifier(); + + PrismReferenceValue target = record.getTargetRef(); + if (target != null) { + bean.targetName = target.getDescription(); + bean.targetOid = target.getOid(); + bean.targetType = targetTypeToRepoOrdinal(target); + } + PrismReferenceValue targetOwner = record.getTargetOwnerRef(); + if (targetOwner != null) { + bean.targetOwnerName = targetOwner.getDescription(); + bean.targetOwnerOid = targetOwner.getOid(); + bean.targetOwnerType = targetTypeToRepoOrdinal(targetOwner); + } + bean.taskIdentifier = record.getTaskIdentifier(); + bean.taskOid = record.getTaskOid(); + return bean; + } + + private Integer targetTypeToRepoOrdinal(PrismReferenceValue targetOwner) { + //noinspection rawtypes + Class objectClass = SqlTransformerSupport.getInstance() + .qNameToSchemaClass(targetOwner.getTargetType()); + //noinspection unchecked + return MiscUtil.enumOrdinal(RObjectType.getByJaxbType(objectClass)); + } + @Override - public AuditEventRecordSqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - return new AuditEventRecordSqlTransformer(transformerSupport, this); + protected void processExtensionColumns( + AuditEventRecordType schemaObject, Tuple tuple, QAuditEventRecord entityPath) { + for (String propertyName : getExtensionColumns().keySet()) { + Object customColumnValue = tuple.get(entityPath.getPath(propertyName)); + schemaObject.getCustomColumnProperty().add( + new AuditEventRecordCustomColumnPropertyType() + .name(propertyName).value((String) customColumnValue)); + } } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditItemMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditItemMapping.java index a615273c1b8..cc38d987160 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditItemMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditItemMapping.java @@ -10,14 +10,13 @@ import com.evolveum.midpoint.repo.sql.audit.beans.MAuditItem; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditItem; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; /** * Mapping for {@link QAuditItem}, model type is non-containerable {@link ItemPathType}. */ public class QAuditItemMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "ai"; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditPropertyValueMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditPropertyValueMapping.java index 328c6cf5541..36f9a15c9fc 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditPropertyValueMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditPropertyValueMapping.java @@ -10,14 +10,13 @@ import com.evolveum.midpoint.repo.sql.audit.beans.MAuditPropertyValue; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditPropertyValue; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordPropertyType; /** * Mapping for {@link QAuditPropertyValue}. */ public class QAuditPropertyValueMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "apv"; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditRefValueMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditRefValueMapping.java index 6507e3eeebd..15396686744 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditRefValueMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditRefValueMapping.java @@ -10,14 +10,13 @@ import com.evolveum.midpoint.repo.sql.audit.beans.MAuditRefValue; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditRefValue; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordReferenceType; /** * Mapping between {@link QAuditRefValue} and {@link AuditEventRecordReferenceType}. */ public class QAuditRefValueMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "aref"; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java index 8f65c518dab..a912d94ce62 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java @@ -10,13 +10,12 @@ import com.evolveum.midpoint.repo.sql.audit.beans.MAuditResource; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditResource; -import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; /** * Mapping for {@link QAuditResource}, no transformation supported. */ public class QAuditResourceMapping - extends QueryTableMapping { + extends AuditTableMapping { public static final String DEFAULT_ALIAS_NAME = "ares"; diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java index 5bad518b18e..d7304ad77d0 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java @@ -29,7 +29,7 @@ import com.evolveum.midpoint.repo.sqlbase.filtering.ObjectFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.repo.sqlbase.mapping.SqlDetailFetchMapper; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer; +import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformationException; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; @@ -141,7 +141,8 @@ private void processOrdering(List orderings) throw new QueryException( "ORDER BY is not possible for complex paths: " + orderByItemPath); } - Path path = mapping().primarySqlPath(orderByItemPath.asSingleNameOrFail(), this); + Path path = entityPathMapping.primarySqlPath( + orderByItemPath.asSingleNameOrFail(), this); if (!(path instanceof ComparableExpressionBase)) { throw new QueryException( "ORDER BY is not possible for non-comparable path: " + orderByItemPath); @@ -172,12 +173,14 @@ public PageOf executeQuery(Connection conn) throws QueryException { .fetch(); // TODO: run fetchers selectively based on options? - if (!mapping().detailFetchMappers().isEmpty()) { + Collection> detailFetchMappers = + entityPathMapping.detailFetchMappers(); + if (!detailFetchMappers.isEmpty()) { // we don't want to extract R if no mappers exist, otherwise we want to do it only once List dataEntities = data.stream() .map(t -> t.get(entity)) .collect(Collectors.toList()); - for (SqlDetailFetchMapper fetcher : mapping().detailFetchMappers()) { + for (SqlDetailFetchMapper fetcher : detailFetchMappers) { fetcher.execute(sqlRepoContext, () -> sqlRepoContext.newQuery(conn), dataEntities); } } @@ -186,7 +189,7 @@ public PageOf executeQuery(Connection conn) throws QueryException { } private @NotNull Expression[] buildSelectExpressions(Q entity, SQLQuery query) { - Path[] defaultExpressions = mapping().selectExpressions(entity, options); + Path[] defaultExpressions = entityPathMapping.selectExpressions(entity, options); if (!query.getMetadata().isDistinct() || query.getMetadata().getOrderBy().isEmpty()) { return defaultExpressions; } @@ -293,9 +296,8 @@ public void processOptions(Collection> opti public PageOf transformToSchemaType(PageOf result) throws SchemaException, QueryException { try { - SqlTransformer transformer = createTransformer(); - return result.map(row -> transformer.toSchemaObjectSafe(row, root(), options)); - } catch (SqlTransformer.SqlTransformationException e) { + return result.map(row -> entityPathMapping.toSchemaObjectSafe(row, root(), options)); + } catch (SqlTransformationException e) { Throwable cause = e.getCause(); if (cause instanceof SchemaException) { throw (SchemaException) cause; @@ -307,13 +309,6 @@ public PageOf transformToSchemaType(PageOf result) } } - /** - * Creates transformer for the {@link #entityPathMapping}. - * Made abstract, because the way how to create the transformer can differ on the type - * of context that is needed to do it (typically providing various components). - */ - protected abstract SqlTransformer createTransformer(); - /** * Returns wrapped query if usage of Querydsl API is more convenient. */ diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryModelMapping.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryModelMapping.java index edaa59726b5..73033d3b514 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryModelMapping.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryModelMapping.java @@ -13,6 +13,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.prism.path.ItemPath; @@ -39,6 +41,8 @@ */ public class QueryModelMapping, R> { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + private final Class schemaType; private final Class queryType; diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java index a702c535f98..961282f4912 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java @@ -11,6 +11,7 @@ import java.util.function.Function; import javax.xml.namespace.QName; +import com.querydsl.core.Tuple; import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Path; import com.querydsl.core.types.Predicate; @@ -26,7 +27,6 @@ import com.evolveum.midpoint.repo.sqlbase.QueryException; import com.evolveum.midpoint.repo.sqlbase.RepositoryException; import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; import com.evolveum.midpoint.repo.sqlbase.filtering.item.PolyStringItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.SimpleItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.TimestampItemFilterProcessor; @@ -35,6 +35,7 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; /** * Common supertype for mapping items/attributes between schema (prism) classes and tables. @@ -43,8 +44,8 @@ * related to-many detail tables. * * The main goal of this type is to map object query conditions and ORDER BY to SQL. - * Transformation between schema/prism objects and repository objects (row beans or tuples) is - * delegated to {@link SqlTransformer}. + * Mappings also takes care of transformation between schema/prism objects and repository objects + * (row beans or tuples). * Objects of various {@link QueryTableMapping} subclasses are factories for the transformer. * * Other important functions of mapping: @@ -253,19 +254,6 @@ public synchronized Q defaultAlias() { return defaultAlias; } - /** - * Creates {@link SqlTransformer} of row bean to schema type, override if provided. - * TODO: rethink/confirm this create mechanism, currently the SqlTransformerSupport is managed - * component without any other state and so are transformers, perhaps we can pre-create them - * or cache (I don't like the sound of that). On the other hand they are really lightweight - * and short lived helpers too, so it shouldn't be a real GC problem. - */ - @Deprecated - public SqlTransformer createTransformer( - SqlTransformerSupport transformerSupport) { - throw new UnsupportedOperationException("Bean transformer not supported for " + queryType()); - } - /** * Returns collection of all registered {@link SqlDetailFetchMapper}s. */ @@ -325,6 +313,35 @@ public R newRowObject() { "Row bean creation not implemented for query type " + queryType().getName()); } + /** + * Transforms row of {@link R} type to schema type {@link S}. + * If pre-generated bean is used as row it does not include extension (dynamic) columns, + * which is OK if extension columns are used only for query and their information + * is still contained in the object somehow else (e.g. full object LOB). + * + * Alternative would be dynamically generated list of select expressions and transforming + * row to M object directly from {@link com.querydsl.core.Tuple}. + */ + public abstract S toSchemaObject(R row) throws SchemaException; + + /** + * Transforms row Tuple containing attributes of {@link R} to schema type {@link S}. + * Entity path can be used to access tuple elements. + * This allows loading also dynamically defined columns (like extensions). + */ + public abstract S toSchemaObject(Tuple row, Q entityPath, + Collection> options) + throws SchemaException; + + public S toSchemaObjectSafe(Tuple tuple, Q entityPath, + Collection> options) { + try { + return toSchemaObject(tuple, entityPath, options); + } catch (SchemaException e) { + throw new SqlTransformationException(e); + } + } + @Override public String toString() { return "QueryTableMapping{" + diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java new file mode 100644 index 00000000000..35028b6b7fb --- /dev/null +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2010-2021 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.repo.sqlbase.mapping; + +/** + * Runtime exception wrapping other exception that occurred during object transformation + * inside mapping (e.g. tuple to schema object). + */ +public class SqlTransformationException extends RuntimeException { + + public SqlTransformationException(Throwable cause) { + super(cause); + } +} diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformer.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformer.java deleted file mode 100644 index 20e71732c62..00000000000 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformer.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqlbase.mapping; - -import java.util.Collection; - -import com.querydsl.core.Tuple; - -import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.util.exception.SchemaException; - -/** - * Contract for SQL transformers translating from query beans or tuples to model types. - * Concrete transformers may do more than pure transformation, they can also help with storing - * related entities (e.g. parts of the object aggregate). - * The implemented methods may vary wildly as some are used by very generic mechanisms (query - * interpreter) while others are called on concrete transformer of known type needed in particular - * situation. - * - * @param schema type - * @param type of entity path - * @param type of the transformed data, a row bean - */ -public interface SqlTransformer, R> { - - /** - * Transforms row of {@link R} type to schema type {@link S}. - * If pre-generated bean is used as row it does not include extension (dynamic) columns, - * which is OK if extension columns are used only for query and their information - * is still contained in the object somehow else (e.g. full object LOB). - *

- * Alternative would be dynamically generated list of select expressions and transforming - * row to M object directly from {@link com.querydsl.core.Tuple}. - */ - S toSchemaObject(R row) throws SchemaException; - - /** - * Transforms row Tuple containing attributes of {@link R} to schema type {@link S}. - * Entity path can be used to access tuple elements. - * This allows loading also dynamically defined columns (like extensions). - */ - S toSchemaObject(Tuple row, Q entityPath, - Collection> options) - throws SchemaException; - - default S toSchemaObjectSafe(Tuple tuple, Q entityPath, Collection> options) { - try { - return toSchemaObject(tuple, entityPath, options); - } catch (SchemaException e) { - throw new SqlTransformationException(e); - } - } - - class SqlTransformationException extends RuntimeException { - public SqlTransformationException(Throwable cause) { - super(cause); - } - } -} From d12dbc72937c5dcb6f57be35aebaf58ac3d51725 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 30 Apr 2021 13:24:42 +0200 Subject: [PATCH 3/4] Improve parameterized system performance test 1) We now use TestMonitor to report some of the aspects. 2) Second import task and user recomputation task were added. 3) Minor code improvements were done. 4) Plus other things cherry-picked from support-4.2 branch. --- testing/story/pom.xml | 4 - .../story/sysperf/DetailsOutputFile.java | 32 +++ .../story/sysperf/ExtensionSchemaVariant.java | 7 +- .../story/sysperf/OtherParameters.java | 18 ++ .../story/sysperf/PopulationVariant.java | 3 +- .../story/sysperf/ProgressOutputFile.java | 32 +++ .../testing/story/sysperf/SourceVariant.java | 2 + .../story/sysperf/SummaryOutputFile.java | 36 ++++ .../story/sysperf/TestSystemPerformance.java | 203 +++++++++++++----- .../story/sysperf/ThreadingVariant.java | 39 +++- .../resources/system-perf/task-import-16t.xml | 28 --- .../resources/system-perf/task-import-4t.xml | 28 --- .../{task-import-1t.xml => task-import.xml} | 2 +- .../resources/system-perf/task-recompute.xml | 35 +++ 14 files changed, 337 insertions(+), 132 deletions(-) create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/DetailsOutputFile.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/OtherParameters.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ProgressOutputFile.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SummaryOutputFile.java delete mode 100644 testing/story/src/test/resources/system-perf/task-import-16t.xml delete mode 100644 testing/story/src/test/resources/system-perf/task-import-4t.xml rename testing/story/src/test/resources/system-perf/{task-import-1t.xml => task-import.xml} (92%) create mode 100644 testing/story/src/test/resources/system-perf/task-recompute.xml diff --git a/testing/story/pom.xml b/testing/story/pom.xml index c6bd553c231..31af5e5bab1 100644 --- a/testing/story/pom.xml +++ b/testing/story/pom.xml @@ -181,10 +181,6 @@ ch.qos.logback logback-classic - - com.google.guava - guava - diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/DetailsOutputFile.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/DetailsOutputFile.java new file mode 100644 index 00000000000..beadc7ec923 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/DetailsOutputFile.java @@ -0,0 +1,32 @@ +package com.evolveum.midpoint.testing.story.sysperf; + +import com.evolveum.midpoint.schema.util.task.TaskOperationStatsUtil; +import com.evolveum.midpoint.schema.util.task.TaskPerformanceInformation; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import static com.evolveum.midpoint.testing.story.sysperf.TestSystemPerformance.START; +import static com.evolveum.midpoint.testing.story.sysperf.TestSystemPerformance.TARGET_DIR; + +class DetailsOutputFile { + + private static final File FILE = new File(TARGET_DIR, START + "-details.txt"); + private final PrintWriter writer; + + DetailsOutputFile() throws IOException { + writer = new PrintWriter(new FileWriter(FILE)); + } + + void logTestFinish(String testName, TaskType taskAfter, TaskPerformanceInformation performanceInformation) { + writer.printf("********** %s FINISHED **********\n\n", testName); + writer.println(TaskOperationStatsUtil.format(taskAfter.getOperationStats())); + writer.println(); + writer.println(performanceInformation.debugDump()); + writer.println(); + writer.flush(); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ExtensionSchemaVariant.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ExtensionSchemaVariant.java index 5870a608bc8..fc2b6a2a5ad 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ExtensionSchemaVariant.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ExtensionSchemaVariant.java @@ -10,9 +10,10 @@ enum ExtensionSchemaVariant { BASIC("basic"), - BIG("big"), - BIG_GLOBAL("big-global"), - INDEXED("indexed"); + INDEXED("indexed"), + BIG("big"), // don't use: does not make any difference + BIG_GLOBAL("big-global") // don't use: does not make any difference + ; private static final String PROP_EXTENSION_SCHEMA = "schema"; diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/OtherParameters.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/OtherParameters.java new file mode 100644 index 00000000000..820feafecf2 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/OtherParameters.java @@ -0,0 +1,18 @@ +package com.evolveum.midpoint.testing.story.sysperf; + +public class OtherParameters { + + private static final String PROP_TASK_TIMEOUT = "taskTimeout"; + + final int taskTimeout; + + private OtherParameters(int taskTimeout) { + this.taskTimeout = taskTimeout; + } + + static OtherParameters setup() { + return new OtherParameters( + Integer.parseInt(System.getProperty(PROP_TASK_TIMEOUT, "1800000")) // 30 minutes + ); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/PopulationVariant.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/PopulationVariant.java index fc5971206eb..8e18fe1655a 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/PopulationVariant.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/PopulationVariant.java @@ -7,11 +7,10 @@ package com.evolveum.midpoint.testing.story.sysperf; -import com.evolveum.midpoint.test.DummyTestResource; - enum PopulationVariant { P10("10", 10), + P100("100", 100), P1K("1k", 1000), P10K("10k", 10000), P100K("100k", 100_000), diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ProgressOutputFile.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ProgressOutputFile.java new file mode 100644 index 00000000000..5fef0efa789 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ProgressOutputFile.java @@ -0,0 +1,32 @@ +package com.evolveum.midpoint.testing.story.sysperf; + +import com.evolveum.midpoint.task.api.Task; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import static com.evolveum.midpoint.testing.story.sysperf.TestSystemPerformance.TARGET_DIR; +import static com.evolveum.midpoint.testing.story.sysperf.TestSystemPerformance.START; + +class ProgressOutputFile { + + static final File FILE = new File(TARGET_DIR, START + "-progress.csv"); + private final PrintWriter writer; + + ProgressOutputFile() throws IOException { + writer = new PrintWriter(new FileWriter(FILE)); + writer.println("test;time;progress"); + } + + void recordProgress(String testName, Task task) { + long start = task.getLastRunStartTimestamp(); + Long lastFinish = task.getLastRunFinishTimestamp(); + long thisFinish = lastFinish != null && lastFinish > start ? lastFinish : System.currentTimeMillis(); + long running = thisFinish - start; + long progress = task.getProgress(); + writer.println(testName + ";" + running + ";" + progress); + writer.flush(); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SourceVariant.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SourceVariant.java index 396ba8e503c..9ce90c90906 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SourceVariant.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SourceVariant.java @@ -23,6 +23,8 @@ enum SourceVariant { MS2_5("ms2-5", "resource-source-ms0002.xml", 1, 1, 5), MS20_5("ms20-5", "resource-source-ms0020.xml", 10, 10, 5), MS110_5("ms110-5", "resource-source-ms0110.xml", 100, 10, 5), + MS110_20("ms110-20", "resource-source-ms0110.xml", 100, 10, 20), + MS110_100("ms110-100", "resource-source-ms0110.xml", 100, 10, 100), MS110_1000("ms110-1000", "resource-source-ms0110.xml", 100, 10, 1000); private static final String PROP_SOURCE = "source"; diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SummaryOutputFile.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SummaryOutputFile.java new file mode 100644 index 00000000000..514801ed06b --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/SummaryOutputFile.java @@ -0,0 +1,36 @@ +package com.evolveum.midpoint.testing.story.sysperf; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Date; + +import static com.evolveum.midpoint.testing.story.sysperf.TestSystemPerformance.*; + +class SummaryOutputFile { + + private static final File FILE = new File(TARGET_DIR, START + "-summary.txt"); + private final PrintWriter writer; + + SummaryOutputFile() throws IOException { + writer = new PrintWriter(new FileWriter(FILE)); + } + + void logStart() { + writer.println("Started: " + new Date(START) + " (" + START + ")"); + writer.printf("Extension schema variant: %s\n", EXTENSION_SCHEMA_VARIANT); + writer.printf("Source variant: %s\n", SOURCE_VARIANT); + writer.printf("Threading variant: %s\n", THREADING_VARIANT); + writer.printf("Population variant: %s\n", POPULATION_VARIANT); + writer.printf("Progress file: %s\n\n", ProgressOutputFile.FILE); + writer.flush(); + } + + void logTestFinish(String testName, long executionTime, double timePerAccount) { + writer.printf("********** %s FINISHED **********\n\n", testName); + writer.printf("Task execution time: %,d ms\n", executionTime); + writer.printf("Time per account: %,.1f ms\n\n", timePerAccount); + writer.flush(); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/TestSystemPerformance.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/TestSystemPerformance.java index c9273dd4e81..ab4b89cf977 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/TestSystemPerformance.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/TestSystemPerformance.java @@ -7,14 +7,16 @@ package com.evolveum.midpoint.testing.story.sysperf; +import static com.evolveum.midpoint.tools.testng.TestMonitor.PERF_REPORT_PREFIX_PROPERTY_NAME; + import static org.assertj.core.api.Assertions.assertThat; import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; -import java.util.Date; +import java.io.IOException; + +import com.evolveum.midpoint.tools.testng.PerformanceTestClassMixin; +import com.evolveum.midpoint.tools.testng.TestReportSection; -import com.google.common.base.MoreObjects; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; @@ -43,34 +45,41 @@ * * Examples: * - * -Dpopulation=10k -Dthreading=16t -Dschema=basic -Dsource=ms2-5 - * -Dpopulation=100k -Dthreading=4t -Dschema=indexed -Dsource=ms110-5 - * -Dpopulation=10k -Dthreading=16t -Dschema=big-global -Dsource=ms110-1000 + * -Dpopulation=10k -Dthreading=16t -Dschema=basic -Dsource=ms2-5 + * -Dpopulation=100k -Dthreading=4t -Dschema=indexed -Dsource=ms110-5 + * -Dpopulation=10k -Dthreading=16t -Dschema=basic -Dsource=ms110-1000 */ @ContextConfiguration(locations = { "classpath:ctx-story-test-main.xml" }) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -public class TestSystemPerformance extends AbstractStoryTest { +public class TestSystemPerformance extends AbstractStoryTest implements PerformanceTestClassMixin { public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "system-perf"); + static final String TARGET_DIR = "./target"; private static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); - private static final ExtensionSchemaVariant EXTENSION_SCHEMA_VARIANT; - private static final SourceVariant SOURCE_VARIANT; - private static final ThreadingVariant THREADING_VARIANT; + static final ExtensionSchemaVariant EXTENSION_SCHEMA_VARIANT; + static final SourceVariant SOURCE_VARIANT; + static final ThreadingVariant THREADING_VARIANT; private static final TemplateVariant TEMPLATE_VARIANT; - private static final PopulationVariant POPULATION_VARIANT; + static final PopulationVariant POPULATION_VARIANT; + private static final OtherParameters OTHER_PARAMETERS; private static final DummyTestResource RESOURCE_SOURCE; private static final TestResource TASK_IMPORT; + private static final TestResource TASK_RECOMPUTE; + + static final long START = System.currentTimeMillis(); - private static final long START = System.currentTimeMillis(); + private static final String REPORT_FILE_PREFIX = TARGET_DIR + "/" + START + "-report"; + private static final String REPORT_SECTION_SUMMARY_NAME = "summary"; + private static final String REPORT_SECTION_TEST_SUMMARY_NAME = "testSummary"; - private static final File SUMMARY_FILE = new File("./target", START + "-summary.txt"); - private PrintWriter summary; + private TestReportSection testSummaryReportSection; - private static final File PROGRESS_FILE = new File("./target", START + "-progress.csv"); - private PrintWriter progress; + private final ProgressOutputFile progressOutputFile = new ProgressOutputFile(); + private final SummaryOutputFile summaryOutputFile = new SummaryOutputFile(); + private final DetailsOutputFile detailsOutputFile = new DetailsOutputFile(); private long lastProgress; @@ -82,9 +91,16 @@ public class TestSystemPerformance extends AbstractStoryTest { THREADING_VARIANT = ThreadingVariant.setup(); TEMPLATE_VARIANT = TemplateVariant.setup(); POPULATION_VARIANT = PopulationVariant.setup(); + OTHER_PARAMETERS = OtherParameters.setup(); RESOURCE_SOURCE = SOURCE_VARIANT.createDummyTestResource(); TASK_IMPORT = THREADING_VARIANT.getImportTaskResource(); + TASK_RECOMPUTE = THREADING_VARIANT.getRecomputeTaskResource(); + + System.setProperty(PERF_REPORT_PREFIX_PROPERTY_NAME, REPORT_FILE_PREFIX); + } + + public TestSystemPerformance() throws IOException { } @Override @@ -98,12 +114,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti sourceInitializer = new SourceInitializer(this, RESOURCE_SOURCE, SOURCE_VARIANT, POPULATION_VARIANT, initTask); sourceInitializer.run(initResult); - summary = new PrintWriter(new FileWriter(SUMMARY_FILE)); - - progress = new PrintWriter(new FileWriter(PROGRESS_FILE)); - progress.println("time;progress"); - - logStart(); + addObject(TASK_IMPORT.file, initTask, initResult, workerThreadsCustomizer(THREADING_VARIANT.getThreads())); + addObject(TASK_RECOMPUTE.file, initTask, initResult, workerThreadsCustomizer(THREADING_VARIANT.getThreads())); } @Override @@ -121,6 +133,38 @@ protected void importSystemTasks(OperationResult initResult) { // nothing here } + @Test + public void test000LogStart() { + + testMonitor().addReportSection(REPORT_SECTION_SUMMARY_NAME) + .withColumns("schema", "source", "singleValuedAttributes", "multiValuedAttributes", "attributeValues", + "threading", "threads", "tasks", + "population", "accounts") + .addRow(EXTENSION_SCHEMA_VARIANT.getName(), + SOURCE_VARIANT.getName(), + SOURCE_VARIANT.getSingleValuedAttributes(), + SOURCE_VARIANT.getMultiValuedAttributes(), + SOURCE_VARIANT.getAttributeValues(), + THREADING_VARIANT.getName(), + THREADING_VARIANT.getThreads(), + THREADING_VARIANT.getTasks(), + POPULATION_VARIANT.getName(), + POPULATION_VARIANT.getAccounts()); + + + testSummaryReportSection = testMonitor().addReportSection(REPORT_SECTION_TEST_SUMMARY_NAME) + .withColumns("test", "time", "timePerAccount"); + + logger.info("********** STARTED **********\n"); + logger.info("Extension schema variant: {}", EXTENSION_SCHEMA_VARIANT); + logger.info("Source variant: {}", SOURCE_VARIANT); + logger.info("Threading variant: {}", THREADING_VARIANT); + logger.info("Population variant: {}", POPULATION_VARIANT); + logger.info("Progress file: {}", ProgressOutputFile.FILE); + + summaryOutputFile.logStart(); + } + @Test public void test001DumpExtensionSchema() { PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); @@ -139,8 +183,10 @@ public void test100Import() throws Exception { when(); - addTask(TASK_IMPORT, result); - waitForTaskFinish(TASK_IMPORT.oid, false, 0, 1000000, false, 0, + restartTask(TASK_IMPORT.oid, result); + Thread.sleep(500); + + waitForTaskFinish(TASK_IMPORT.oid, false, 0, OTHER_PARAMETERS.taskTimeout, false, 0, builder -> builder.taskConsumer(this::recordProgress)); then(); @@ -162,7 +208,62 @@ public void test100Import() throws Exception { .display() .getObject(); - logFinish(taskAfter); + logTestFinish(taskAfter); + } + + @Test + public void test110ImportAgain() throws Exception { + given(); + + Task task = getTestTask(); + OperationResult result = task.getResult(); + + int usersBefore = repositoryService.countObjects(UserType.class, null, null, result); + + when(); + + restartTask(TASK_IMPORT.oid, result); + Thread.sleep(500); + + lastProgress = 0; + waitForTaskFinish(TASK_IMPORT.oid, false, 0, OTHER_PARAMETERS.taskTimeout, false, 0, + builder -> builder.taskConsumer(this::recordProgress)); + + then(); + + int usersAfter = repositoryService.countObjects(UserType.class, null, null, result); + assertThat(usersAfter - usersBefore).as("users created").isEqualTo(0); + + PrismObject taskAfter = assertTask(TASK_IMPORT.oid, "after") + .display() + .getObject(); + + logTestFinish(taskAfter); + } + + @Test + public void test120RecomputeUsers() throws Exception { + given(); + + Task task = getTestTask(); + OperationResult result = task.getResult(); + + when(); + + restartTask(TASK_RECOMPUTE.oid, result); + Thread.sleep(500); + + lastProgress = 0; + waitForTaskFinish(TASK_RECOMPUTE.oid, false, 0, OTHER_PARAMETERS.taskTimeout, false, 0, + builder -> builder.taskConsumer(this::recordProgress)); + + then(); + + PrismObject taskAfter = assertTask(TASK_RECOMPUTE.oid, "after") + .display() + .getObject(); + + logTestFinish(taskAfter); } private long getExecutionTime(PrismObject taskAfter) { @@ -171,47 +272,34 @@ private long getExecutionTime(PrismObject taskAfter) { return end - start; } + @SuppressWarnings("SameParameterValue") private String getSingleValuedPropertyName(int i) { return String.format("p-single-%04d", i); } + @SuppressWarnings("SameParameterValue") private String getMultiValuedPropertyName(int i) { return String.format("p-multi-%04d", i); } - private void logStart() { - logger.info("********** STARTED **********\n"); - logger.info("Extension schema variant: {}", EXTENSION_SCHEMA_VARIANT); - logger.info("Source variant: {}", SOURCE_VARIANT); - logger.info("Threading variant: {}", THREADING_VARIANT); - logger.info("Population variant: {}", POPULATION_VARIANT); - logger.info("Progress file: {}", PROGRESS_FILE); - - summary.println("Started: " + new Date(START) + " (" + START + ")"); - summary.printf("Extension schema variant: %s\n", EXTENSION_SCHEMA_VARIANT); - summary.printf("Source variant: %s\n", SOURCE_VARIANT); - summary.printf("Threading variant: %s\n", THREADING_VARIANT); - summary.printf("Population variant: %s\n", POPULATION_VARIANT); - summary.printf("Progress file: %s\n\n", PROGRESS_FILE); - summary.flush(); - } - - private void logFinish(PrismObject taskAfter) { + private void logTestFinish(PrismObject taskAfter) { TaskPerformanceInformation performanceInformation = TaskPerformanceInformation.fromTaskTree(taskAfter.asObjectable()); long executionTime = getExecutionTime(taskAfter); + double timePerAccount = (double) executionTime / (double) POPULATION_VARIANT.getAccounts(); + + String testName = getTestNameShort(); + + logger.info("********** {} FINISHED **********\n", testName); + logger.info(String.format("Task execution time: %,d ms", executionTime)); + logger.info(String.format("Time per account: %,.1f ms", timePerAccount)); + logger.info(TaskOperationStatsUtil.format(taskAfter.asObjectable().getOperationStats())); + logger.info(performanceInformation.debugDump()); - logger.info("********** FINISHED **********\n"); - logger.info("{}", String.format("Task execution time: %,d ms", executionTime)); - logger.info("{}", String.format("Time per account: %,.1f ms", (double) executionTime / (double) POPULATION_VARIANT.getAccounts())); - logger.info("{}", (TaskOperationStatsUtil.format(taskAfter.asObjectable().getOperationStats()))); - logger.info("{}", performanceInformation.debugDump()); + summaryOutputFile.logTestFinish(testName, executionTime, timePerAccount); + detailsOutputFile.logTestFinish(testName, taskAfter.asObjectable(), performanceInformation); - summary.printf("********** FINISHED **********\n"); - summary.printf("Task execution time: %,d ms\n", executionTime); - summary.printf("Time per account: %,.1f ms\n", (double) executionTime / (double) POPULATION_VARIANT.getAccounts()); - summary.println(TaskOperationStatsUtil.format(taskAfter.asObjectable().getOperationStats())); - summary.println(performanceInformation.debugDump()); - summary.flush(); + testSummaryReportSection + .addRow(testName, executionTime, timePerAccount); } private void recordProgress(Task task) { @@ -223,10 +311,7 @@ private void recordProgress(Task task) { } lastProgress = progress; - long end = MoreObjects.firstNonNull(task.getLastRunFinishTimestamp(), System.currentTimeMillis()); - long running = end - start; - this.progress.println(running + ";" + progress); - this.progress.flush(); + progressOutputFile.recordProgress(getTestNameShort(), task); OperationStatsType stats = task.getStoredOperationStatsOrClone(); logger.info("\n{}", TaskOperationStatsUtil.format(stats)); diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ThreadingVariant.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ThreadingVariant.java index 9fabb6b0793..cf5b0f368f0 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ThreadingVariant.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/sysperf/ThreadingVariant.java @@ -14,26 +14,46 @@ enum ThreadingVariant { - T1("1t"), - T4("4t"), - T16("16t"), - T40_N4("40t-4n"); + T1("1t", "", 1, 1), + T4("4t", "", 4, 1), + T6("6t", "", 6, 1), + T8("8t", "", 8, 1), + T12("12t", "", 12, 1), + T16("16t", "", 16, 1), + T40_N4("40t-4n", "", 40, 4); private static final String PROP_THREADING = "threading"; private static final String IMPORT_TASK_OID = "c32d4da6-bdd3-481d-931a-60ca8a5a01ba"; - private static final String TASK_FILE_NAME_PATTERN = "task-import-%s.xml"; + private static final String IMPORT_TASK_FILE_NAME_PATTERN = "task-import%s.xml"; + + private static final String RECOMPUTE_TASK_OID = "f5920848-6c8f-4eda-ae26-2b961d6dae1b"; + private static final String RECOMPUTE_TASK_FILE_NAME_PATTERN = "task-recompute%s.xml"; private final String name; + private final String taskNameSuffix; + private final int threads; + private final int tasks; - ThreadingVariant(String name) { + ThreadingVariant(String name, String taskNameSuffix, int threads, int tasks) { this.name = name; + this.taskNameSuffix = taskNameSuffix; + this.threads = threads; + this.tasks = tasks; } public String getName() { return name; } + public int getThreads() { + return threads; + } + + public int getTasks() { + return tasks; + } + public static ThreadingVariant setup() { String configuredName = System.getProperty(PROP_THREADING, T1.name); ThreadingVariant variant = fromName(configuredName); @@ -42,10 +62,15 @@ public static ThreadingVariant setup() { } public TestResource getImportTaskResource() { - String fileName = String.format(TASK_FILE_NAME_PATTERN, name); + String fileName = String.format(IMPORT_TASK_FILE_NAME_PATTERN, taskNameSuffix); return new TestResource<>(TEST_DIR, fileName, IMPORT_TASK_OID); } + public TestResource getRecomputeTaskResource() { + String fileName = String.format(RECOMPUTE_TASK_FILE_NAME_PATTERN, taskNameSuffix); + return new TestResource<>(TEST_DIR, fileName, RECOMPUTE_TASK_OID); + } + private static ThreadingVariant fromName(String name) { for (ThreadingVariant value : values()) { if (value.name.equals(name)) { diff --git a/testing/story/src/test/resources/system-perf/task-import-16t.xml b/testing/story/src/test/resources/system-perf/task-import-16t.xml deleted file mode 100644 index 4e99715237f..00000000000 --- a/testing/story/src/test/resources/system-perf/task-import-16t.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Import - - - ri:AccountObjectClass - 16 - - - - runnable - - http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/import/handler-3 - - - single - diff --git a/testing/story/src/test/resources/system-perf/task-import-4t.xml b/testing/story/src/test/resources/system-perf/task-import-4t.xml deleted file mode 100644 index 1f5fd3eeced..00000000000 --- a/testing/story/src/test/resources/system-perf/task-import-4t.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Import - - - ri:AccountObjectClass - 4 - - - - runnable - - http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/import/handler-3 - - - single - diff --git a/testing/story/src/test/resources/system-perf/task-import-1t.xml b/testing/story/src/test/resources/system-perf/task-import.xml similarity index 92% rename from testing/story/src/test/resources/system-perf/task-import-1t.xml rename to testing/story/src/test/resources/system-perf/task-import.xml index fad1852f6f2..6f5872231f9 100644 --- a/testing/story/src/test/resources/system-perf/task-import-1t.xml +++ b/testing/story/src/test/resources/system-perf/task-import.xml @@ -18,7 +18,7 @@ - runnable + closed http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/import/handler-3 diff --git a/testing/story/src/test/resources/system-perf/task-recompute.xml b/testing/story/src/test/resources/system-perf/task-recompute.xml new file mode 100644 index 00000000000..4a17cd4afea --- /dev/null +++ b/testing/story/src/test/resources/system-perf/task-recompute.xml @@ -0,0 +1,35 @@ + + + + + + Recompute + + + UserType + + + + name + u- + true + + + + + + + closed + + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/recompute/handler-3 + + single + From 1b2c07c9deea55ef5bc451e1931b8266c2d79b72 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Fri, 30 Apr 2021 20:58:28 +0200 Subject: [PATCH 4/4] *TransformerSupport renamed to *SupportService, code cleanup --- .../repo/sqale/SqaleQueryContext.java | 16 ++++++------- .../midpoint/repo/sqale/SqaleRepoContext.java | 4 +++- .../repo/sqale/SqaleRepositoryBeanConfig.java | 7 +++++- .../repo/sqale/SqaleRepositoryService.java | 23 ++++++++---------- ...rSupport.java => SqaleSupportService.java} | 12 +++++----- .../item/RefTableItemDeltaProcessor.java | 2 +- .../sqale/operations/AddObjectOperation.java | 6 ++--- .../repo/sqale/qmodel/SqaleTableMapping.java | 24 +++++++------------ .../sqale/qmodel/TransformerForOwnedBy.java | 21 ---------------- .../qmodel/assignment/QAssignmentMapping.java | 2 +- .../sqale/qmodel/object/QObjectMapping.java | 12 +++++----- .../repo/sqale/update/RootUpdateContext.java | 10 ++++---- .../repo/sqale/update/SqaleUpdateContext.java | 18 +++++++------- .../func/SqaleRepoAddDeleteObjectTest.java | 6 ++--- .../evolveum/midpoint/repo/sql/AuditTest.java | 2 +- .../midpoint/repo/sql/BaseSQLRepoTest.java | 2 +- .../repo/sql/SqlAuditServiceFactory.java | 4 ++-- .../repo/sql/SqlAuditServiceImpl.java | 6 ++--- .../repo/sql/audit/AuditSqlQueryContext.java | 12 +++++----- .../sql/audit/mapping/AuditTableMapping.java | 4 ++-- .../sql/audit/mapping/QAuditDeltaMapping.java | 6 ++--- .../mapping/QAuditEventRecordMapping.java | 12 ++++------ .../audit/mapping/QAuditResourceMapping.java | 2 +- .../repo/sqlbase/SqlQueryContext.java | 23 +++++++++--------- .../repo/sqlbase/SqlQueryExecutor.java | 3 +-- .../midpoint/repo/sqlbase/SqlRepoContext.java | 12 +++++++++- ...merSupport.java => SqlSupportService.java} | 12 ++++++---- .../sqlbase/mapping/QueryTableMapping.java | 3 +-- ...n.java => RepositoryMappingException.java} | 4 ++-- 29 files changed, 126 insertions(+), 144 deletions(-) rename repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/{SqaleTransformerSupport.java => SqaleSupportService.java} (82%) delete mode 100644 repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java rename repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/{SqlTransformerSupport.java => SqlSupportService.java} (88%) rename repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/{SqlTransformationException.java => RepositoryMappingException.java} (77%) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java index 07f9e0ff2dd..4379a1f2e24 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleQueryContext.java @@ -24,7 +24,7 @@ public class SqaleQueryContext, R> extends SqlQueryContext { public static , R> SqaleQueryContext from( - Class schemaType, SqaleTransformerSupport transformerSupport, + Class schemaType, SqaleSupportService sqaleSupportService, SqlRepoContext sqlRepoContext) { SqaleTableMapping rootMapping = sqlRepoContext.getMappingBySchemaType(schemaType); @@ -35,16 +35,16 @@ public static , R> SqaleQueryContext< query.getMetadata().setValidate(true); return new SqaleQueryContext<>( - rootPath, rootMapping, transformerSupport, sqlRepoContext, query); + rootPath, rootMapping, sqaleSupportService, sqlRepoContext, query); } private SqaleQueryContext( Q entityPath, SqaleTableMapping mapping, - SqaleTransformerSupport transformerSupport, + SqaleSupportService sqaleSupportService, SqlRepoContext sqlRepoContext, SQLQuery query) { - super(entityPath, mapping, sqlRepoContext, transformerSupport, query); + super(entityPath, mapping, sqaleSupportService, query); } @Override @@ -53,7 +53,7 @@ public FilterProcessor createInOidFilter(SqlQueryContext c } public @NotNull Integer searchCachedRelationId(QName qName) { - return transformerSupport().searchCachedRelationId(qName); + return supportService().searchCachedRelationId(qName); } /** @@ -66,10 +66,10 @@ public FilterProcessor createInOidFilter(SqlQueryContext c deriveNew(TQ newPath, QueryTableMapping newMapping) { return (SqlQueryContext) new SqaleQueryContext( newPath, (SqaleTableMapping) newMapping, - transformerSupport(), sqlRepoContext, sqlQuery); + supportService(), sqlRepoContext, sqlQuery); } - private SqaleTransformerSupport transformerSupport() { - return (SqaleTransformerSupport) transformerSupport; + private SqaleSupportService supportService() { + return (SqaleSupportService) sqlSupportService; } } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepoContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepoContext.java index b46b6eea22d..6be2920d497 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepoContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepoContext.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryModelMappingRegistry; import com.evolveum.midpoint.repo.sqlbase.querydsl.QuerydslJsonbType; +import com.evolveum.midpoint.schema.SchemaService; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; /** @@ -32,8 +33,9 @@ public class SqaleRepoContext extends SqlRepoContext { public SqaleRepoContext( JdbcRepositoryConfiguration jdbcRepositoryConfiguration, DataSource dataSource, + SchemaService schemaService, QueryModelMappingRegistry mappingRegistry) { - super(jdbcRepositoryConfiguration, dataSource, mappingRegistry); + super(jdbcRepositoryConfiguration, dataSource, schemaService, mappingRegistry); // each enum type must be registered if we want to map it as objects (to PG enum types) querydslConfig.register(new EnumAsObjectType<>(ActivationStatusType.class)); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java index 800f72f08e5..50b9da2b697 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryBeanConfig.java @@ -110,6 +110,7 @@ public DataSource dataSource(DataSourceFactory dataSourceFactory) @Bean public SqaleRepoContext sqlRepoContext( SqaleRepositoryConfiguration repositoryConfiguration, + SchemaService schemaService, DataSource dataSource) { QueryModelMappingRegistry mappingRegistry = new QueryModelMappingRegistry() // ordered alphabetically here, mappings without schema type at the end @@ -152,7 +153,11 @@ public SqaleRepoContext sqlRepoContext( .register(QReferenceMapping.INSTANCE) .seal(); - return new SqaleRepoContext(repositoryConfiguration, dataSource, mappingRegistry); + return new SqaleRepoContext( + repositoryConfiguration, + dataSource, + schemaService, + mappingRegistry); } @Bean diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java index 42899eb84ce..41822a14438 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleRepositoryService.java @@ -54,9 +54,7 @@ /** * Repository implementation based on SQL, JDBC and Querydsl without any ORM. - * WORK IN PROGRESS: - * It will be PostgreSQL only or at least PG optimized with generic SQL support for other unsupported DB. - * Possible Oracle support is in play. + * WORK IN PROGRESS. */ public class SqaleRepositoryService implements RepositoryService { @@ -74,7 +72,7 @@ public class SqaleRepositoryService implements RepositoryService { private final SqaleRepoContext sqlRepoContext; private final SchemaService schemaService; private final SqlQueryExecutor sqlQueryExecutor; - private final SqaleTransformerSupport transformerSupport; + private final SqaleSupportService supportService; private final SqlPerformanceMonitorsCollection sqlPerformanceMonitorsCollection; // TODO: see comment in the SystemConfigurationChangeDispatcherImpl for related issues @@ -92,7 +90,7 @@ public SqaleRepositoryService( this.sqlRepoContext = sqlRepoContext; this.schemaService = schemaService; this.sqlQueryExecutor = new SqlQueryExecutor(sqlRepoContext); - this.transformerSupport = new SqaleTransformerSupport(schemaService, sqlRepoContext); + this.supportService = new SqaleSupportService(schemaService, sqlRepoContext); this.sqlPerformanceMonitorsCollection = sqlPerformanceMonitorsCollection; // monitor initialization and registration @@ -257,7 +255,7 @@ public String addObject( // TODO use executeAttempts String oid = new AddObjectOperation<>(object, options, operationResult) - .execute(transformerSupport); + .execute(supportService); invokeConflictWatchers((w) -> w.afterAddObject(oid, object)); return oid; /* @@ -424,7 +422,7 @@ RootUpdateContext prepareUpdateContext( rootRow.objectType = MObjectType.fromSchemaType(object.getClass()); // we don't care about full object in row - return new RootUpdateContext<>(transformerSupport, jdbcSession, object, rootRow); + return new RootUpdateContext<>(supportService, jdbcSession, object, rootRow); } private void logTraceModifications(@NotNull Collection> modifications) { @@ -482,8 +480,7 @@ private void logTraceModifications(@NotNull Collection DeleteObjectResult deleteObjectAttempt(Class type, UUID oid, JdbcSession jdbcSession) throws ObjectNotFoundException { - QueryTableMapping mapping = - transformerSupport.sqlRepoContext().getMappingBySchemaType(type); + QueryTableMapping mapping = sqlRepoContext.getMappingBySchemaType(type); Q entityPath = mapping.defaultAlias(); byte[] fullObject = jdbcSession.newQuery() .select(entityPath.fullObject) @@ -520,7 +517,7 @@ public int countObjects(Class type, ObjectQuery query, .build(); try { - var queryContext = SqaleQueryContext.from(type, transformerSupport, sqlRepoContext); + var queryContext = SqaleQueryContext.from(type, supportService, sqlRepoContext); return sqlQueryExecutor.count(queryContext, query, options); } catch (RepositoryException | RuntimeException e) { throw handledGeneralException(e, operationResult); @@ -548,7 +545,7 @@ public int countObjects(Class type, ObjectQuery query, .build(); try { - var queryContext = SqaleQueryContext.from(type, transformerSupport, sqlRepoContext); + var queryContext = SqaleQueryContext.from(type, supportService, sqlRepoContext); SearchResultList result = sqlQueryExecutor.list(queryContext, query, options); // TODO see the commented code from old repo lower, problems for each object must be caught @@ -567,7 +564,7 @@ public int countObjects(Class type, ObjectQuery query, /* TODO from ObjectRetriever, how to do this per-object Throwable catch + record result? - should we smuggle the OperationResult all the way to the transformer call? + should we smuggle the OperationResult all the way to the mapping call? @NotNull private List> queryResultToPrismObjects( List objects, Class type, @@ -631,7 +628,7 @@ public SearchResultList searchContainers( .build(); try { - var queryContext = SqaleQueryContext.from(type, transformerSupport, sqlRepoContext); + var queryContext = SqaleQueryContext.from(type, supportService, sqlRepoContext); SearchResultList result = sqlQueryExecutor.list(queryContext, query, options); return result; diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleSupportService.java similarity index 82% rename from repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java rename to repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleSupportService.java index 7674440d99c..8bbde61260c 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleTransformerSupport.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/SqaleSupportService.java @@ -11,23 +11,23 @@ import org.jetbrains.annotations.NotNull; import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.schema.SchemaService; import com.evolveum.midpoint.util.QNameUtil; /** - * Extension of {@link SqlTransformerSupport} adding Sqale features like {@link UriCache} support. + * Extension of {@link SqlSupportService} adding Sqale features like {@link UriCache} support. */ -public class SqaleTransformerSupport extends SqlTransformerSupport { +public class SqaleSupportService extends SqlSupportService { - private static SqaleTransformerSupport instance; + private static SqaleSupportService instance; - public SqaleTransformerSupport(SchemaService schemaService, SqaleRepoContext sqaleRepoContext) { + public SqaleSupportService(SchemaService schemaService, SqaleRepoContext sqaleRepoContext) { super(schemaService, sqaleRepoContext); instance = this; } - public static SqaleTransformerSupport getInstance() { + public static SqaleSupportService getInstance() { return instance; } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/delta/item/RefTableItemDeltaProcessor.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/delta/item/RefTableItemDeltaProcessor.java index 011dbb6b2d3..7b068645f6b 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/delta/item/RefTableItemDeltaProcessor.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/delta/item/RefTableItemDeltaProcessor.java @@ -46,7 +46,7 @@ public void addValues(Collection values) { public void deleteValues(Collection values) { Q r = refTableMapping.defaultAlias(); for (Referencable ref : values) { - Integer relId = context.transformerSupport().searchCachedRelationId(ref.getRelation()); + Integer relId = context.supportService().searchCachedRelationId(ref.getRelation()); context.jdbcSession().newDelete(r) .where(r.isOwnedBy(context.row()) .and(r.targetOid.eq(UUID.fromString(ref.getOid()))) diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java index fff4d6ecdf3..aa63319d799 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/operations/AddObjectOperation.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.sqale.ContainerValueIdGenerator; -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleSupportService; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObjectType; import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject; @@ -59,11 +59,11 @@ public AddObjectOperation(@NotNull PrismObject object, } /** Inserts the object provided to the constructor and returns its OID. */ - public String execute(SqaleTransformerSupport transformerSupport) + public String execute(SqaleSupportService supportService) throws SchemaException, ObjectAlreadyExistsException { try { // TODO utilize options and result - sqlRepoContext = transformerSupport.sqlRepoContext(); + sqlRepoContext = supportService.sqlRepoContext(); Class schemaObjectClass = object.getCompileTimeClass(); objectType = MObjectType.fromSchemaType(schemaObjectClass); rootMapping = sqlRepoContext.getMappingBySchemaType(schemaObjectClass); diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java index af453912c57..26df02bc71a 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/SqaleTableMapping.java @@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleSupportService; import com.evolveum.midpoint.repo.sqale.delta.item.*; import com.evolveum.midpoint.repo.sqale.filtering.RefItemFilterProcessor; import com.evolveum.midpoint.repo.sqale.filtering.UriItemFilterProcessor; @@ -191,12 +191,6 @@ public > SqaleItemSqlMapper enumMapper( rootToQueryItem); } - // Previously transformer code from here down - // TODO inline later - protected QueryTableMapping mapping() { - return this; - } - @Override public S toSchemaObject(R row) { throw new UnsupportedOperationException("Use toSchemaObject(Tuple,...)"); @@ -238,7 +232,7 @@ protected ObjectReferenceType objectReferenceType( return new ObjectReferenceType() .oid(oid) - .type(SqaleTransformerSupport.getInstance() + .type(SqaleSupportService.getInstance() .schemaClassToQName(repoObjectType.getSchemaType())) .description(targetName) .targetName(targetName); @@ -257,12 +251,12 @@ protected ObjectReferenceType objectReferenceType( } protected @NotNull Integer searchCachedRelationId(QName qName) { - return SqaleTransformerSupport.getInstance().searchCachedRelationId(qName); + return SqaleSupportService.getInstance().searchCachedRelationId(qName); } /** Returns ID for cached URI without going to the database. */ protected Integer resolveUriToId(String uri) { - return SqaleTransformerSupport.getInstance().resolveUriToId(uri); + return SqaleSupportService.getInstance().resolveUriToId(uri); } /** @@ -271,20 +265,20 @@ protected Integer resolveUriToId(String uri) { * Never returns null, returns default ID for configured default relation. */ protected Integer processCacheableRelation(QName qName) { - return SqaleTransformerSupport.getInstance().processCacheableRelation(qName); + return SqaleSupportService.getInstance().processCacheableRelation(qName); } /** Returns ID for URI creating new cache row in DB as needed. */ protected Integer processCacheableUri(String uri) { return uri != null - ? SqaleTransformerSupport.getInstance().processCacheableUri(uri) + ? SqaleSupportService.getInstance().processCacheableUri(uri) : null; } /** Returns ID for URI creating new cache row in DB as needed. */ protected Integer processCacheableUri(QName qName) { return qName != null - ? SqaleTransformerSupport.getInstance() + ? SqaleSupportService.getInstance() .processCacheableUri(QNameUtil.qNameToUri(qName)) : null; } @@ -309,7 +303,7 @@ protected Integer[] processCacheableUris(List uris) { protected MObjectType schemaTypeToObjectType(QName schemaType) { return schemaType == null ? null : MObjectType.fromSchemaType( - SqaleTransformerSupport.getInstance().qNameToSchemaClass(schemaType)); + SqaleSupportService.getInstance().qNameToSchemaClass(schemaType)); } protected void setPolyString(PolyStringType polyString, @@ -347,7 +341,7 @@ protected String[] arrayFor(List strings) { /** Convenient insert shortcut when the row is fully populated. */ protected void insert(R row, JdbcSession jdbcSession) { - jdbcSession.newInsert(mapping().defaultAlias()) + jdbcSession.newInsert(defaultAlias()) .populate(row) .execute(); } diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java deleted file mode 100644 index a50f328a136..00000000000 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/TransformerForOwnedBy.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2010-2021 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.repo.sqale.qmodel; - -import com.evolveum.midpoint.repo.sqlbase.JdbcSession; - -/** - * Declares capability to insert row for the provided schema object owned by provided row. - * - * @param schema type - * @param target type of the transformation, a row bean - * @param row type of the reference owner - */ -public interface TransformerForOwnedBy { - - /** Contract for insertion of row of type {@link R} owned by {@link OR}. */ -} diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java index a8da39f7a7d..f6d7928c836 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/assignment/QAssignmentMapping.java @@ -144,7 +144,7 @@ public MAssignment newRowObject(OR ownerRow) { return row; } - // about duplication see the comment in ObjectSqlTransformer.toRowObjectWithoutFullObject + // about duplication see the comment in QObjectMapping.toRowObjectWithoutFullObject @SuppressWarnings("DuplicatedCode") @Override public MAssignment insert(AssignmentType assignment, OR ownerRow, JdbcSession jdbcSession) { diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java index e8d43b9abb4..1c34ee9a277 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/qmodel/object/QObjectMapping.java @@ -22,14 +22,14 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.SerializationOptions; -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleSupportService; import com.evolveum.midpoint.repo.sqale.SqaleUtils; import com.evolveum.midpoint.repo.sqale.qmodel.SqaleTableMapping; import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignmentMapping; import com.evolveum.midpoint.repo.sqale.qmodel.common.QUri; import com.evolveum.midpoint.repo.sqale.qmodel.ref.QObjectReferenceMapping; import com.evolveum.midpoint.repo.sqlbase.JdbcSession; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -198,8 +198,8 @@ public S toSchemaObject(Tuple row, Q entityPath, PrismObject prismObject; String serializedForm = new String(fullObject, StandardCharsets.UTF_8); try { - SqlTransformerSupport.ParseResult result = - SqaleTransformerSupport.getInstance().parsePrismObject(serializedForm); + SqlSupportService.ParseResult result = + SqaleSupportService.getInstance().parsePrismObject(serializedForm); prismObject = result.prismObject; if (result.parsingContext.hasWarnings()) { logger.warn("Object {} parsed with {} warnings", @@ -253,7 +253,7 @@ public R toRowObjectWithoutFullObject(S schemaObject, JdbcSession jdbcSession) { // repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext)); // TODO extensions stored inline (JSON) - that is ext column - // This is duplicate code with AssignmentSqlTransformer.toRowObject, but making interface + // This is duplicate code with QAssignmentMapping.insert, but making interface // and needed setters (fields are not "interface-able") would create much more code. MetadataType metadata = schemaObject.getMetadata(); if (metadata != null) { @@ -354,7 +354,7 @@ public byte[] createFullObject(S schemaObject) throws SchemaException { "Serialized object must have assigned OID and version: " + schemaObject); } - return SqaleTransformerSupport.getInstance().createStringSerializer() + return SqaleSupportService.getInstance().createStringSerializer() .itemsToSkip(fullObjectItemsToSkip()) .options(SerializationOptions .createSerializeReferenceNamesForNullOids() diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java index d30e5677846..adacfc59bb8 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/RootUpdateContext.java @@ -18,7 +18,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; import com.evolveum.midpoint.repo.sqale.ContainerValueIdGenerator; -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleSupportService; import com.evolveum.midpoint.repo.sqale.SqaleUtils; import com.evolveum.midpoint.repo.sqale.delta.DelegatingItemDeltaProcessor; import com.evolveum.midpoint.repo.sqale.qmodel.object.MObject; @@ -49,12 +49,12 @@ public class RootUpdateContext, R ext private ContainerValueIdGenerator cidGenerator; - public RootUpdateContext(SqaleTransformerSupport transformerSupport, + public RootUpdateContext(SqaleSupportService supportService, JdbcSession jdbcSession, S object, R rootRow) { - super(transformerSupport, jdbcSession, rootRow); + super(supportService, jdbcSession, rootRow); this.object = object; - mapping = transformerSupport.sqlRepoContext() + mapping = supportService.sqlRepoContext() .getMappingBySchemaType(SqaleUtils.getClass(object)); rootPath = mapping.defaultAlias(); objectVersion = objectVersionAsInt(object); @@ -101,7 +101,7 @@ public QueryTableMapping mapping() { } } - transformerSupport.normalizeAllRelations(prismObject); + supportService.normalizeAllRelations(prismObject); finishExecution(); return modifications; diff --git a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java index fd2422fe226..0f419fc2786 100644 --- a/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java +++ b/repo/repo-sqale/src/main/java/com/evolveum/midpoint/repo/sqale/update/SqaleUpdateContext.java @@ -14,7 +14,7 @@ import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.repo.sqale.SqaleTransformerSupport; +import com.evolveum.midpoint.repo.sqale.SqaleSupportService; import com.evolveum.midpoint.repo.sqale.delta.ItemDeltaValueProcessor; import com.evolveum.midpoint.repo.sqale.delta.item.UriItemDeltaProcessor; import com.evolveum.midpoint.repo.sqale.qmodel.QOwnedByMapping; @@ -60,7 +60,7 @@ public abstract class SqaleUpdateContext> subcontexts = new LinkedHashMap<>(); public SqaleUpdateContext( - SqaleTransformerSupport sqlTransformerSupport, + SqaleSupportService supportService, JdbcSession jdbcSession, R row) { - this.transformerSupport = sqlTransformerSupport; + this.supportService = supportService; this.jdbcSession = jdbcSession; this.row = row; @@ -93,21 +93,21 @@ public SqaleUpdateContext( R row) { this.parentContext = parentContext; // registering this with parent context must happen outside of constructor! - this.transformerSupport = parentContext.transformerSupport; + this.supportService = parentContext.supportService; this.jdbcSession = parentContext.jdbcSession(); this.row = row; } - public SqaleTransformerSupport transformerSupport() { - return transformerSupport; + public SqaleSupportService supportService() { + return supportService; } public Integer processCacheableRelation(QName relation) { - return transformerSupport.processCacheableRelation(relation); + return supportService.processCacheableRelation(relation); } public Integer processCacheableUri(String uri) { - return transformerSupport.processCacheableUri(uri); + return supportService.processCacheableUri(uri); } public JdbcSession jdbcSession() { diff --git a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java index 5c4fcca0a18..fe9751bbce5 100644 --- a/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java +++ b/repo/repo-sqale/src/test/java/com/evolveum/midpoint/repo/sqale/func/SqaleRepoAddDeleteObjectTest.java @@ -378,7 +378,7 @@ public void test291DuplicateCidInDifferentContainersIsCaughtByRepo() { // region insertion of various types - // this test covers function of ObjectSqlTransformer and all the basic object fields + // this test covers function of QObjectMapping and all the basic object fields @Test public void test800SystemConfigurationBasicObjectAttributes() throws Exception { OperationResult result = createOperationResult(); @@ -900,7 +900,7 @@ public void test818Shadow() throws Exception { assertThat(row.synchronizationTimestamp).isEqualTo(Instant.ofEpochMilli(2)); } - // This covers mapping of attributes in FocusSqlTransformer + GenericObject. + // This covers mapping of attributes in QFocusMapping + GenericObject. @Test public void test820GenericObject() throws Exception { OperationResult result = createOperationResult(); @@ -975,7 +975,7 @@ public void test820GenericObject() throws Exception { } // This covers mapping of attributes in AbstractRole + Archetype + inducement mapping. - // There is no focus on FocusSqlTransformer that is covered above. + // There is no focus on QFocusMapping that is covered above. @Test public void test821ArchetypeAndInducement() throws Exception { OperationResult result = createOperationResult(); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditTest.java index f207ca63f16..11f91808e79 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditTest.java @@ -153,7 +153,7 @@ private MAuditEventRecord getAuditEventRecord(int expectedCount, int index) throws QueryException { // "create" does not actually create a new audit service, but returns the existing one SqlRepoContext sqlRepoContext = auditServiceFactory.createAuditService().getSqlRepoContext(); - SqlTransformerSupport transformerSupport = new SqlTransformerSupport(schemaService, sqlRepoContext); + SqlSupportService transformerSupport = new SqlSupportService(schemaService, sqlRepoContext); SqlQueryContext context = AuditSqlQueryContext.from( AuditEventRecordType.class, transformerSupport, sqlRepoContext); diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java index 488d48bbd60..1898d2735ac 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java @@ -363,7 +363,7 @@ protected , R> long count( /** Creates new {@link JdbcSession} based on {@link #baseHelper} setup. */ protected JdbcSession createJdbcSession() { - return new SqlRepoContext(baseHelper.getConfiguration(), baseHelper.dataSource(), null) + return new SqlRepoContext(baseHelper.getConfiguration(), baseHelper.dataSource(), schemaService, null) .newJdbcSession(); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceFactory.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceFactory.java index a77c277647d..3cb7af8244f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceFactory.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceFactory.java @@ -98,7 +98,7 @@ private SqlRepoContext createSqlRepoContext(Configuration configuration) // in SqlBaseService. Perhaps the base class is useless and these factories can provide // PerformanceMonitor for the services. return new SqlRepoContext(defaultBaseHelper.getConfiguration(), - defaultBaseHelper.dataSource(), auditModelMapping); + defaultBaseHelper.dataSource(), schemaService, auditModelMapping); } LOGGER.info("Configuring SQL audit service to use a different datasource"); @@ -110,7 +110,7 @@ private SqlRepoContext createSqlRepoContext(Configuration configuration) DataSourceFactory dataSourceFactory = new DataSourceFactory(config); DataSource dataSource = dataSourceFactory.createDataSource(); - return new SqlRepoContext(config, dataSource, auditModelMapping); + return new SqlRepoContext(config, dataSource, schemaService, auditModelMapping); } private void initCustomColumns( diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index 2629cbdac40..e4995e88a30 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -104,7 +104,7 @@ public class SqlAuditServiceImpl extends SqlBaseService implements AuditService private final SchemaService schemaService; private final SqlQueryExecutor sqlQueryExecutor; - private final SqlTransformerSupport transformerSupport; + private final SqlSupportService transformerSupport; private volatile SystemConfigurationAuditType auditConfiguration; @@ -116,7 +116,7 @@ public SqlAuditServiceImpl( this.sqlRepoContext = sqlRepoContext; this.schemaService = schemaService; this.sqlQueryExecutor = new SqlQueryExecutor(sqlRepoContext); - this.transformerSupport = new SqlTransformerSupport(schemaService, sqlRepoContext); + this.transformerSupport = new SqlSupportService(schemaService, sqlRepoContext); } public SqlRepoContext getSqlRepoContext() { @@ -179,7 +179,7 @@ private Long insertAuditEventRecord( JdbcSession jdbcSession, AuditEventRecord record) { QAuditEventRecordMapping aerMapping = QAuditEventRecordMapping.INSTANCE; QAuditEventRecord aer = aerMapping.defaultAlias(); - MAuditEventRecord aerBean = aerMapping.from(record); + MAuditEventRecord aerBean = aerMapping.toRowObject(record); SQLInsertClause insert = jdbcSession.newInsert(aer).populate(aerBean); Map customColumns = aerMapping.getExtensionColumns(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java index 7656a79d106..080a52b9c60 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/AuditSqlQueryContext.java @@ -10,7 +10,7 @@ import com.evolveum.midpoint.repo.sqlbase.SqlQueryContext; import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; @@ -24,7 +24,7 @@ public class AuditSqlQueryContext, R> // Type parameters the same as in the class documentation. public static , R> AuditSqlQueryContext from( - Class schemaType, SqlTransformerSupport transformerSupport, SqlRepoContext sqlRepoContext) { + Class schemaType, SqlSupportService sqlSupportService, SqlRepoContext sqlRepoContext) { QueryTableMapping rootMapping = sqlRepoContext.getMappingBySchemaType(schemaType); Q rootPath = rootMapping.defaultAlias(); @@ -34,22 +34,22 @@ public static , R> AuditSqlQueryConte query.getMetadata().setValidate(true); return new AuditSqlQueryContext<>( - rootPath, rootMapping, sqlRepoContext, transformerSupport, query); + rootPath, rootMapping, sqlRepoContext, sqlSupportService, query); } private AuditSqlQueryContext( Q entityPath, QueryTableMapping mapping, SqlRepoContext sqlRepoContext, - SqlTransformerSupport transformerSupport, + SqlSupportService sqlSupportService, SQLQuery query) { - super(entityPath, mapping, sqlRepoContext, transformerSupport, query); + super(entityPath, mapping, sqlSupportService, query); } @Override protected , TR> SqlQueryContext deriveNew(TQ newPath, QueryTableMapping newMapping) { return new AuditSqlQueryContext<>( - newPath, newMapping, sqlRepoContext, transformerSupport, sqlQuery); + newPath, newMapping, sqlRepoContext, sqlSupportService, sqlQuery); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java index 5ce8221f693..3fc847bcc75 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/AuditTableMapping.java @@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -63,7 +63,7 @@ protected ObjectReferenceType objectReferenceType( return new ObjectReferenceType() .oid(oid) - .type(SqlTransformerSupport.getInstance() + .type(SqlSupportService.getInstance() .schemaClassToQName(repoObjectType.getJaxbClass())) .description(targetName) .targetName(targetName); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java index 40042910e00..e1b45b5102f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditDeltaMapping.java @@ -15,7 +15,7 @@ import com.evolveum.midpoint.repo.sql.audit.beans.MAuditDelta; import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditDelta; import com.evolveum.midpoint.repo.sql.util.RUtil; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectDeltaOperationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; @@ -45,7 +45,7 @@ protected QAuditDelta newAliasInstance(String alias) { public ObjectDeltaOperationType toSchemaObject(MAuditDelta row) { ObjectDeltaOperationType odo = new ObjectDeltaOperationType(); SQLTemplates querydslTemplates = - SqlTransformerSupport.getInstance().sqlRepoContext().getQuerydslTemplates(); + SqlSupportService.getInstance().sqlRepoContext().getQuerydslTemplates(); boolean usingSqlServer = querydslTemplates instanceof SQLServerTemplates; odo.setObjectDelta(parseBytes(row.delta, usingSqlServer, ObjectDeltaType.class)); @@ -70,7 +70,7 @@ private T parseBytes(byte[] bytes, boolean usingSqlServer, Class clazz) { } try { - return SqlTransformerSupport.getInstance() + return SqlSupportService.getInstance() .createStringParser(RUtil.getSerializedFormFromBytes(bytes, usingSqlServer)) .compat() .parseRealValue(clazz); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java index 04c8fcf0ec4..67e6d7839a4 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditEventRecordMapping.java @@ -28,7 +28,7 @@ import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventType; import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; -import com.evolveum.midpoint.repo.sqlbase.SqlTransformerSupport; +import com.evolveum.midpoint.repo.sqlbase.SqlSupportService; import com.evolveum.midpoint.repo.sqlbase.filtering.item.CanonicalItemPathItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.DetailTableItemFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.item.EnumOrdinalItemFilterProcessor; @@ -149,7 +149,7 @@ public AuditEventRecordType toSchemaObject(MAuditEventRecord row) { private AuditEventRecordType mapSimpleAttributes(MAuditEventRecord row) { // prismContext in constructor ensures complex type definition - return new AuditEventRecordType(SqlTransformerSupport.getInstance().prismContext()) + return new AuditEventRecordType(SqlSupportService.getInstance().prismContext()) .repoId(row.id) .channel(row.channel) .eventIdentifier(row.eventIdentifier) @@ -194,7 +194,6 @@ private void mapDeltas(AuditEventRecordType record, List deltas) { } } - // the rest of sub-entities do not deserve the dedicated transformer classes (yet) private void mapChangedItems(AuditEventRecordType record, List changedItemPaths) { if (changedItemPaths == null) { return; @@ -275,11 +274,8 @@ private OperationResultStatusType operationResultStatusTypeFromRepo(Integer ordi /** * Transforms {@link AuditEventRecord} to {@link MAuditEventRecord} without any subentities. - *

- * Design notes: Arguably, this code could be in {@link MAuditEventRecord}. - * Also the */ - public MAuditEventRecord from(AuditEventRecord record) { + public MAuditEventRecord toRowObject(AuditEventRecord record) { MAuditEventRecord bean = new MAuditEventRecord(); bean.id = record.getRepoId(); // this better be null if we want to insert bean.eventIdentifier = record.getEventIdentifier(); @@ -330,7 +326,7 @@ public MAuditEventRecord from(AuditEventRecord record) { private Integer targetTypeToRepoOrdinal(PrismReferenceValue targetOwner) { //noinspection rawtypes - Class objectClass = SqlTransformerSupport.getInstance() + Class objectClass = SqlSupportService.getInstance() .qNameToSchemaClass(targetOwner.getTargetType()); //noinspection unchecked return MiscUtil.enumOrdinal(RObjectType.getByJaxbType(objectClass)); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java index a912d94ce62..34898aed5bf 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/audit/mapping/QAuditResourceMapping.java @@ -12,7 +12,7 @@ import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditResource; /** - * Mapping for {@link QAuditResource}, no transformation supported. + * Mapping for {@link QAuditResource}. */ public class QAuditResourceMapping extends AuditTableMapping { diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java index d7304ad77d0..ea3df4f487b 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryContext.java @@ -28,8 +28,8 @@ import com.evolveum.midpoint.repo.sqlbase.filtering.FilterProcessor; import com.evolveum.midpoint.repo.sqlbase.filtering.ObjectFilterProcessor; import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; +import com.evolveum.midpoint.repo.sqlbase.mapping.RepositoryMappingException; import com.evolveum.midpoint.repo.sqlbase.mapping.SqlDetailFetchMapper; -import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformationException; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; @@ -74,23 +74,22 @@ public abstract class SqlQueryContext protected final Q entityPath; protected final QueryTableMapping entityPathMapping; protected final SqlRepoContext sqlRepoContext; - protected final SqlTransformerSupport transformerSupport; + protected final SqlSupportService sqlSupportService; protected boolean notFilterUsed = false; - // options stored to modify select clause and also to affect transformation + // options stored to modify select clause and also to affect mapping protected Collection> options; protected SqlQueryContext( Q entityPath, QueryTableMapping mapping, - SqlRepoContext sqlRepoContext, - SqlTransformerSupport transformerSupport, + SqlSupportService sqlSupportService, SQLQuery query) { this.entityPath = entityPath; this.entityPathMapping = mapping; - this.sqlRepoContext = sqlRepoContext; - this.transformerSupport = transformerSupport; + this.sqlSupportService = sqlSupportService; + this.sqlRepoContext = sqlSupportService.sqlRepoContext(); this.sqlQuery = query; } @@ -297,7 +296,7 @@ public PageOf transformToSchemaType(PageOf result) throws SchemaException, QueryException { try { return result.map(row -> entityPathMapping.toSchemaObjectSafe(row, root(), options)); - } catch (SqlTransformationException e) { + } catch (RepositoryMappingException e) { Throwable cause = e.getCause(); if (cause instanceof SchemaException) { throw (SchemaException) cause; @@ -344,20 +343,20 @@ public SqlRepoContext sqlRepoContext() { } public PrismContext prismContext() { - return transformerSupport.prismContext(); + return sqlSupportService.prismContext(); } public Class qNameToSchemaClass(@NotNull QName qName) { - return transformerSupport.qNameToSchemaClass(qName); + return sqlSupportService.qNameToSchemaClass(qName); } public CanonicalItemPath createCanonicalItemPath(@NotNull ItemPath itemPath) { - return transformerSupport.prismContext().createCanonicalItemPath(itemPath); + return sqlSupportService.prismContext().createCanonicalItemPath(itemPath); } @NotNull public QName normalizeRelation(QName qName) { - return transformerSupport.normalizeRelation(qName); + return sqlSupportService.normalizeRelation(qName); } public FilterProcessor createInOidFilter(SqlQueryContext context) { diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryExecutor.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryExecutor.java index 63cb7773667..4476d443838 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryExecutor.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlQueryExecutor.java @@ -68,8 +68,7 @@ public , R> SearchResultList list( result = context.executeQuery(jdbcSession.connection()); } - PageOf map = context.transformToSchemaType(result); - return createSearchResultList(map); + return createSearchResultList(context.transformToSchemaType(result)); } @NotNull diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlRepoContext.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlRepoContext.java index 518d015aadb..f991327184e 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlRepoContext.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlRepoContext.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.repo.sqlbase.mapping.QueryTableMapping; import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase; import com.evolveum.midpoint.repo.sqlbase.querydsl.QuerydslUtils; +import com.evolveum.midpoint.schema.SchemaService; import com.evolveum.midpoint.util.exception.SystemException; /** @@ -31,6 +32,8 @@ */ public class SqlRepoContext { + private static SqlRepoContext instance; + private final JdbcRepositoryConfiguration jdbcRepositoryConfiguration; protected final Configuration querydslConfig; private final QueryModelMappingRegistry mappingRegistry; @@ -39,12 +42,19 @@ public class SqlRepoContext { public SqlRepoContext( JdbcRepositoryConfiguration jdbcRepositoryConfiguration, DataSource dataSource, - QueryModelMappingRegistry mappingRegistry) { + SchemaService schemaService, QueryModelMappingRegistry mappingRegistry) { this.jdbcRepositoryConfiguration = jdbcRepositoryConfiguration; this.querydslConfig = QuerydslUtils.querydslConfiguration( jdbcRepositoryConfiguration.getDatabaseType()); this.mappingRegistry = mappingRegistry; this.dataSource = dataSource; + + // TODO later inject directly into mappers + instance = this; + } + + public static SqlRepoContext getInstance() { + return instance; } public SQLQuery newQuery() { diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlSupportService.java similarity index 88% rename from repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java rename to repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlSupportService.java index 9710f9c2643..cabc9e9347a 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlTransformerSupport.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/SqlSupportService.java @@ -16,24 +16,26 @@ import com.evolveum.midpoint.util.exception.SchemaException; /** - * Holds various component dependencies that are used during schema to DB transformations. + * Holds various component dependencies that are for query and update contexts and in mappers. * Components can be obtained to execute calls on them, but preferably the needed logic * can be implemented here (better abstraction). + * + * TODO: Unify/merge with SqlRepoContext and let it provide all the "services". */ -public class SqlTransformerSupport { +public class SqlSupportService { - private static SqlTransformerSupport instance; + private static SqlSupportService instance; protected final SchemaService schemaService; protected final SqlRepoContext sqlRepoContext; - public SqlTransformerSupport(SchemaService schemaService, SqlRepoContext sqlRepoContext) { + public SqlSupportService(SchemaService schemaService, SqlRepoContext sqlRepoContext) { this.schemaService = schemaService; this.sqlRepoContext = sqlRepoContext; instance = this; } - public static SqlTransformerSupport getInstance() { + public static SqlSupportService getInstance() { return instance; } diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java index 961282f4912..110f0dd41fc 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/QueryTableMapping.java @@ -46,7 +46,6 @@ * The main goal of this type is to map object query conditions and ORDER BY to SQL. * Mappings also takes care of transformation between schema/prism objects and repository objects * (row beans or tuples). - * Objects of various {@link QueryTableMapping} subclasses are factories for the transformer. * * Other important functions of mapping: * @@ -338,7 +337,7 @@ public S toSchemaObjectSafe(Tuple tuple, Q entityPath, try { return toSchemaObject(tuple, entityPath, options); } catch (SchemaException e) { - throw new SqlTransformationException(e); + throw new RepositoryMappingException(e); } } diff --git a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/RepositoryMappingException.java similarity index 77% rename from repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java rename to repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/RepositoryMappingException.java index 35028b6b7fb..bec86faba69 100644 --- a/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/SqlTransformationException.java +++ b/repo/repo-sqlbase/src/main/java/com/evolveum/midpoint/repo/sqlbase/mapping/RepositoryMappingException.java @@ -10,9 +10,9 @@ * Runtime exception wrapping other exception that occurred during object transformation * inside mapping (e.g. tuple to schema object). */ -public class SqlTransformationException extends RuntimeException { +public class RepositoryMappingException extends RuntimeException { - public SqlTransformationException(Throwable cause) { + public RepositoryMappingException(Throwable cause) { super(cause); } }