diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestAudit.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestAudit.java index e0e481a01ea..09e7c75c7ed 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestAudit.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestAudit.java @@ -550,7 +550,7 @@ public void test300ConcurrentAudits() throws Exception { OperationResult threadResult = threadTask.getResult(); for (int iteration = 0; iteration < ITERATIONS; iteration++) { display("Executing iteration " + iteration + " on user " + index); - ObjectDelta delta = prismContext.deltaFor(UserType.class) + ObjectDelta delta = prismContext.deltaFor(UserType.class) .item(UserType.F_FULL_NAME).replace(PolyString.fromOrig("User " + index + " iteration " + iteration)) .asObjectDelta(oids.get(index)); executeChangesAssertSuccess(delta, null, threadTask, threadResult); @@ -620,11 +620,11 @@ public void test310ConcurrentAuditsRaw() throws Exception { AuditEventRecord record = new AuditEventRecord(AuditEventType.MODIFY_OBJECT, AuditEventStage.EXECUTION); record.setEventIdentifier( iteration + ":" + System.currentTimeMillis() + "-" + (int) (Math.random() * 1_000_000)); - ObjectDelta delta = prismContext.deltaFor(UserType.class) + ObjectDelta delta = prismContext.deltaFor(UserType.class) .item(UserType.F_FULL_NAME).replace(PolyString.fromOrig("Hi" + iteration)) .item(UserType.F_METADATA, MetadataType.F_MODIFY_TIMESTAMP).replace(XmlTypeConverter.createXMLGregorianCalendar(new Date())) .asObjectDelta("oid" + index); - record.addDelta(new ObjectDeltaOperation(delta)); + record.addDelta(new ObjectDeltaOperation<>(delta)); modelAuditService.audit(record, threadTask, threadResult); if (failed.get()) { results.set(index, new IllegalStateException("Some other thread failed")); diff --git a/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java b/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java index 71a12b0d73a..1ce93b0b8ff 100644 --- a/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java +++ b/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java @@ -526,6 +526,7 @@ public void checkConsistence() { ObjectDeltaOperation.checkConsistence(deltas); } + @Deprecated // should go away with the old audit listRecord public AuditEventRecordType createAuditEventRecordType() { return createAuditEventRecordType(false); } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditSearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditSearchTest.java index c5335807960..0fab0d4e95f 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditSearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/AuditSearchTest.java @@ -86,9 +86,10 @@ public void initSystem() throws Exception { record1.setTarget(target, prismContext); record1.setTargetOwner(targetOwner, prismContext); record1.addDelta(createDelta(UserType.F_FULL_NAME)); // values are not even necessary - record1.addDelta(createDelta(UserType.F_FAMILY_NAME)); + record1.addDelta(createDelta(UserType.F_FAMILY_NAME, PolyString.fromOrig("familyNameVal"))); record1.addDelta(createDelta(ItemPath.create( - ObjectType.F_METADATA, MetadataType.F_REQUEST_TIMESTAMP))); + ObjectType.F_METADATA, MetadataType.F_REQUEST_TIMESTAMP), + MiscUtil.asXMLGregorianCalendar(System.currentTimeMillis()))); // just want to see two values, that's all record1.addReferenceValue("ref1", ObjectTypeUtil.createObjectRef(targetOid, ObjectTypes.USER).asReferenceValue()); @@ -143,7 +144,7 @@ private ObjectDeltaOperation createDelta(ItemPath itemPath, Object... throws SchemaException { ObjectDeltaOperation delta = new ObjectDeltaOperation<>(); delta.setObjectDelta(deltaFor(UserType.class) - .item(itemPath).add(values) + .item(itemPath).replace(values) .asObjectDelta("any-oid-we-don't-care-here")); return delta; } @@ -873,7 +874,8 @@ public void test300SearchReturnsMappedToManyAttributes() throws SchemaException assertThat(prop1.getValue()).containsExactly("val1"); // for other attributes we just use the size check, fetch mechanism is similar assertThat(record1.getChangedItem()).hasSize(4); - assertThat(record1.getDelta()).hasSize(1); + assertThat(record1.getDelta()).hasSize(3) + .allMatch(d -> d.getObjectDelta() != null); assertThat(record1.getReference()).hasSize(2); assertThat(record1.getResourceOid()).hasSize(3); // we also want to be sure that returned objects have prism definitions diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlQueryContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlQueryContext.java index 11a8ece3d16..c61fa9fdd65 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlQueryContext.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlQueryContext.java @@ -262,7 +262,8 @@ public void processOptions(Collection> opti public PageOf transformToSchemaType(PageOf result) throws SchemaException, QueryException { try { - SqlTransformer transformer = mapping().createTransformer(prismContext()); + SqlTransformer transformer = mapping() + .createTransformer(prismContext(), querydslConfiguration); return result.map(row -> transformer.toSchemaObjectSafe(row, root())); } catch (SqlTransformer.SqlTransformationException e) { Throwable cause = e.getCause(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlTransformer.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlTransformer.java index 73954833200..344553bbafb 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlTransformer.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/SqlTransformer.java @@ -8,6 +8,7 @@ import com.querydsl.core.Tuple; import com.querydsl.sql.ColumnMetadata; +import com.querydsl.sql.Configuration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,10 +29,13 @@ public abstract class SqlTransformer, protected final PrismContext prismContext; protected final QueryModelMapping mapping; + protected final Configuration querydslConfiguration; - protected SqlTransformer(PrismContext prismContext, QueryModelMapping mapping) { + protected SqlTransformer(PrismContext prismContext, + QueryModelMapping mapping, Configuration querydslConfiguration) { this.prismContext = prismContext; this.mapping = mapping; + this.querydslConfiguration = querydslConfiguration; } /** diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/mapping/QueryModelMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/mapping/QueryModelMapping.java index 72c0018fd0b..d36535b4fbe 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/mapping/QueryModelMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/mapping/QueryModelMapping.java @@ -15,6 +15,7 @@ import com.querydsl.core.types.Path; import com.querydsl.core.types.Predicate; import com.querydsl.sql.ColumnMetadata; +import com.querydsl.sql.Configuration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -219,7 +220,8 @@ public synchronized Q defaultAlias() { /** * Creates {@link SqlTransformer} of row bean to schema type, override if provided. */ - public SqlTransformer createTransformer(PrismContext prismContext) { + public SqlTransformer createTransformer( + PrismContext prismContext, Configuration querydslConfiguration) { throw new UnsupportedOperationException("Bean transformer not supported for " + queryType); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditDeltaSqlTransformer.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditDeltaSqlTransformer.java index 066e592fdc9..232781bf6bd 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditDeltaSqlTransformer.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditDeltaSqlTransformer.java @@ -6,14 +6,20 @@ */ package com.evolveum.midpoint.repo.sql.pure.querymodel.mapping; +import com.querydsl.sql.Configuration; +import com.querydsl.sql.SQLServerTemplates; + import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.repo.sql.pure.SqlTransformer; import com.evolveum.midpoint.repo.sql.pure.querymodel.QAuditDelta; import com.evolveum.midpoint.repo.sql.pure.querymodel.beans.MAuditDelta; -import com.evolveum.midpoint.schema.ObjectDeltaOperation; +import com.evolveum.midpoint.repo.sql.util.RUtil; 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.ObjectType; +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; /** * Simple class with methods for audit event transformation between repo and Prism world. @@ -21,28 +27,40 @@ public class AuditDeltaSqlTransformer extends SqlTransformer { - public AuditDeltaSqlTransformer(PrismContext prismContext, QAuditDeltaMapping mapping) { - super(prismContext, mapping); + public AuditDeltaSqlTransformer(PrismContext prismContext, + QAuditDeltaMapping mapping, Configuration querydslConfiguration) { + super(prismContext, mapping, querydslConfiguration); } public ObjectDeltaOperationType toSchemaObject(MAuditDelta row) throws SchemaException { - ObjectDeltaOperation delta = new ObjectDeltaOperation<>(); - ObjectDeltaOperationType odo = new ObjectDeltaOperationType(); + boolean usingSqlServer = querydslConfiguration.getTemplates() instanceof SQLServerTemplates; + if (row.delta != null) { + String serializedDelta = + RUtil.getSerializedFormFromBytes(row.delta, usingSqlServer); + + ObjectDeltaType delta = prismContext.parserFor(serializedDelta) + .parseRealValue(ObjectDeltaType.class); + odo.setObjectDelta(delta); + } + if (row.fullResult != null) { + String serializedResult = + RUtil.getSerializedFormFromBytes(row.fullResult, usingSqlServer); + + OperationResultType resultType = prismContext.parserFor(serializedResult) + .parseRealValue(OperationResultType.class); + odo.setExecutionResult(resultType); + } + 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; - /* - TODO MID-6319 - DeltaConversionOptions options = DeltaConversionOptions.createSerializeReferenceNames(); - // This can be tricky because it can create human-readable but machine-unprocessable - // data, see MID-6262. But in current context the results of this method are to be - // used only in GUI and reports, so we are safe here. - // THIS ^^ is taken originally from AuditEventRecord#createAuditEventRecordType(boolean) - options.setEscapeInvalidCharacters(true); - DeltaConvertor.toObjectDeltaOperationType(delta, odo, options); - auditRecordType.getDelta().add(odo); - - objectDeltaOperation.; - record.delta(objectDeltaOperation); - */ } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditEventRecordSqlTransformer.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditEventRecordSqlTransformer.java index 22f98fdca45..31ccd42ba67 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditEventRecordSqlTransformer.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/AuditEventRecordSqlTransformer.java @@ -13,6 +13,7 @@ import javax.xml.namespace.QName; import com.querydsl.core.Tuple; +import com.querydsl.sql.Configuration; import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.prism.PrismContext; @@ -38,14 +39,14 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** - * Simple class with methods for audit event transformation between repo and Prism world. + * Transformation of audit event records between repo and Prism world. */ public class AuditEventRecordSqlTransformer extends SqlTransformer { - public AuditEventRecordSqlTransformer( - PrismContext prismContext, QAuditEventRecordMapping mapping) { - super(prismContext, mapping); + public AuditEventRecordSqlTransformer(PrismContext prismContext, + QAuditEventRecordMapping mapping, Configuration querydslConfiguration) { + super(prismContext, mapping, querydslConfiguration); } public AuditEventRecordType toSchemaObject(MAuditEventRecord row) throws SchemaException { @@ -100,10 +101,10 @@ private void mapDeltas(AuditEventRecordType record, List deltas) return; } - SqlTransformer transformer = - QAuditDeltaMapping.INSTANCE.createTransformer(prismContext); + SqlTransformer deltaTransformer = + QAuditDeltaMapping.INSTANCE.createTransformer(prismContext, querydslConfiguration); for (MAuditDelta delta : deltas) { - record.delta(transformer.toSchemaObject(delta)); + record.delta(deltaTransformer.toSchemaObject(delta)); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditDeltaMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditDeltaMapping.java index cffa61821da..b650ffc4da5 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditDeltaMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditDeltaMapping.java @@ -8,6 +8,8 @@ import static com.evolveum.midpoint.repo.sql.pure.querymodel.QAuditItem.TABLE_NAME; +import com.querydsl.sql.Configuration; + import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.sql.pure.SqlTransformer; import com.evolveum.midpoint.repo.sql.pure.mapping.QueryModelMapping; @@ -37,7 +39,7 @@ protected QAuditDelta newAliasInstance(String alias) { @Override public SqlTransformer createTransformer( - PrismContext prismContext) { - return new AuditDeltaSqlTransformer(prismContext, this); + PrismContext prismContext, Configuration querydslConfiguration) { + return new AuditDeltaSqlTransformer(prismContext, this, querydslConfiguration); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditEventRecordMapping.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditEventRecordMapping.java index f071b373e82..5361a4b03dc 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditEventRecordMapping.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/pure/querymodel/mapping/QAuditEventRecordMapping.java @@ -9,6 +9,8 @@ import static com.evolveum.midpoint.repo.sql.pure.querymodel.QAuditEventRecord.TABLE_NAME; import static com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType.*; +import com.querydsl.sql.Configuration; + import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventStage; import com.evolveum.midpoint.repo.sql.data.audit.RAuditEventType; @@ -108,7 +110,8 @@ protected QAuditEventRecord newAliasInstance(String alias) { } @Override - public AuditEventRecordSqlTransformer createTransformer(PrismContext prismContext) { - return new AuditEventRecordSqlTransformer(prismContext, this); + public AuditEventRecordSqlTransformer createTransformer( + PrismContext prismContext, Configuration querydslConfiguration) { + return new AuditEventRecordSqlTransformer(prismContext, this, querydslConfiguration); } }