Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Sep 21, 2021
2 parents d2c3cfa + e688f48 commit 42dd7c8
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ private <T> T parseBytes(byte[] bytes, String identifier, Class<T> clazz) {
try {
return parseSchemaObject(bytes, identifier, clazz);
} catch (SchemaException e) {
logger.error("Cannot parse {}: {}", clazz.getSimpleName(), e.getMessage(), e);
// If it's "just" schema error, we ignore it. No reason not to return the audit record.
// Also, parseSchemaObject logs this on ERROR, so we don't need to do it here.
return null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,6 @@ public <C extends Containerable> byte[] createFullObject(C container) throws Sch
}

protected Collection<? extends QName> fullObjectItemsToSkip() {
// TODO extend later, things like FocusType.F_JPEG_PHOTO, see ObjectUpdater#updateFullObject
return Collections.emptyList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@

import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.*;

import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import java.util.function.Function;
import javax.xml.namespace.QName;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.ArrayPath;
import org.jetbrains.annotations.NotNull;

Expand All @@ -23,8 +28,11 @@
import com.evolveum.midpoint.repo.sqale.update.SqaleUpdateContext;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.util.task.TaskTypeUtil;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ScheduleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskAutoScalingType;
Expand Down Expand Up @@ -92,6 +100,15 @@ private QTaskMapping(@NotNull SqaleRepoContext repositoryContext) {
.addItemMapping(F_RECURRENCE, enumMapper(q -> q.recurrence));
}

@Override
public @NotNull Path<?>[] selectExpressions(
QTask entity, Collection<SelectorOptions<GetOperationOptions>> options) {
if (SelectorOptions.hasToLoadPath(F_RESULT, options)) {
return new Path[] { entity.oid, entity.fullObject, entity.fullResult };
}
return new Path[] { entity.oid, entity.fullObject };
}

@Override
protected QTask newAliasInstance(String alias) {
return new QTask(alias);
Expand All @@ -102,6 +119,11 @@ public MTask newRowObject() {
return new MTask();
}

@Override
protected Collection<? extends QName> fullObjectItemsToSkip() {
return Collections.singletonList(F_RESULT);
}

@Override
public @NotNull MTask toRowObjectWithoutFullObject(
TaskType task, JdbcSession jdbcSession) {
Expand Down Expand Up @@ -150,6 +172,20 @@ public MTask newRowObject() {
return row;
}

@Override
public TaskType toSchemaObject(
Tuple row, QTask entityPath, Collection<SelectorOptions<GetOperationOptions>> options)
throws SchemaException {
TaskType task = super.toSchemaObject(row, entityPath, options);
// No need to check options, if it's in the tuple, we use it.
byte[] fullResult = row.get(entityPath.fullResult);
if (fullResult != null) {
task.setResult(
parseSchemaObject(fullResult, "opResult", OperationResultType.class));
}
return task;
}

// Specific to Task, so we leave it as nested class right here.
public static class FullResultDeltaProcessor
extends SinglePathItemDeltaProcessor<byte[], ArrayPath<byte[], Byte>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Stream;
import javax.xml.namespace.QName;
Expand Down Expand Up @@ -44,10 +42,7 @@
import com.evolveum.midpoint.repo.sqlbase.perfmon.SqlPerformanceMonitorImpl;
import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;
import com.evolveum.midpoint.repo.sqlbase.querydsl.SqlRecorder;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RelationRegistry;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.test.util.AbstractSpringTest;
Expand Down Expand Up @@ -509,6 +504,21 @@ private <T extends Containerable> SearchResultList<T> searchContainers(
operationResult);
}

@NotNull
protected <T extends Objectable> T parseFullObject(byte[] fullObject) throws SchemaException {
//noinspection unchecked
return (T) prismContext.parseObject(
new String(fullObject, StandardCharsets.UTF_8)).asObjectable();
}

protected @NotNull Collection<SelectorOptions<GetOperationOptions>> retrieveGetOptions(ItemName... paths) {
GetOperationOptionsBuilder options = SchemaService.get().getOperationOptionsBuilder();
for (ItemName path : paths) {
options.item(path).retrieve();
}
return options.build();
}

/**
* Helper to make setting shadow attributes easier.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.testng.annotations.Test;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.path.ItemName;
Expand Down Expand Up @@ -1700,6 +1701,10 @@ public void test830Task() throws Exception {
assertThat(row.waitingReason).isEqualTo(TaskWaitingReasonType.OTHER_TASKS);
assertThat(row.dependentTaskIdentifiers)
.containsExactlyInAnyOrder("dep-task-1", "dep-task-2");

and("stored full object does not contain operation result");
TaskType parsedTask = parseFullObject(row.fullObject);
assertThat(parsedTask.getResult()).isNull();
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
import com.evolveum.midpoint.repo.sqale.qmodel.task.QTask;
import com.evolveum.midpoint.repo.sqlbase.JdbcSession;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SchemaService;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand Down Expand Up @@ -545,12 +544,18 @@ public void test125ChangeTaskFullResult()
.getObject(TaskType.class, task1Oid, null, result)
.asObjectable();
assertThat(task.getVersion()).isEqualTo(String.valueOf(originalRow.version + 1));
// TODO assert that full object DOES NOT contain fullResult
assertThat(task.getResult()).isNull(); // not stored as part of fullObject

and("externalized fullResult is updated");
MTask row = selectObjectByOid(QTask.class, task1Oid);
assertThat(row.version).isEqualTo(originalRow.version + 1);
assertThat(row.fullResult).isNotNull();

and("task with operation result can be obtained using options");
TaskType taskWithResult = repositoryService
.getObject(TaskType.class, task1Oid, retrieveGetOptions(TaskType.F_RESULT), result)
.asObjectable();
assertThat(taskWithResult.getResult()).isNotNull();
}

@Test
Expand Down Expand Up @@ -2771,9 +2776,7 @@ public void test322DeleteAssignmentWithItemPathEndingWithCidIsIllegal() {
}

private @NotNull Collection<SelectorOptions<GetOperationOptions>> retrieveWithCases() {
return SchemaService.get().getOperationOptionsBuilder()
.item(AccessCertificationCampaignType.F_CASE).retrieve()
.build();
return retrieveGetOptions(AccessCertificationCampaignType.F_CASE);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import static com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase.DEFAULT_SCHEMA_NAME;

import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Date;
import java.util.UUID;
Expand Down Expand Up @@ -265,8 +264,7 @@ public void test220PhotoPersistenceAdd()
then("photo is stored in row, but not in fullObject");
MUser row = selectObjectByOid(QUser.class, UUID.fromString(userOid));
assertThat(row.photo).isEqualTo(new byte[] { 0, 1, 2 });
UserType fullObjectUser = (UserType) prismContext.parseObject(
new String(row.fullObject, StandardCharsets.UTF_8)).asObjectable();
UserType fullObjectUser = parseFullObject(row.fullObject);
assertThat(fullObjectUser.getJpegPhoto()).isNull();

and("user obtained without special options does not have the photo");
Expand Down Expand Up @@ -306,15 +304,10 @@ public void test221PhotoPersistenceModify()
then("photo is stored in row, but not in fullObject");
MUser row = selectObjectByOid(QUser.class, UUID.fromString(userOid));
assertThat(row.photo).isEqualTo(new byte[] { 0, 1, 2 });
UserType fullObjectUser = (UserType) prismContext.parseObject(
new String(row.fullObject, StandardCharsets.UTF_8)).asObjectable();
UserType fullObjectUser = parseFullObject(row.fullObject);
assertThat(fullObjectUser.getJpegPhoto()).isNull();
}

// TODO test for getObject() with typical options (here or separate class?)
// - ObjectOperationOptions(jpegPhoto:retrieve=INCLUDE)
// - ObjectOperationOptions(/:resolveNames)

@Test
public void test300AddDiagnosticInformation() throws Exception {
OperationResult result = createOperationResult();
Expand Down

0 comments on commit 42dd7c8

Please sign in to comment.