Skip to content

Commit

Permalink
Add support for ObjectSetType.archetypeRef
Browse files Browse the repository at this point in the history
(Plus minor code improvements.)
  • Loading branch information
mederly committed Aug 2, 2023
1 parent 0ea99f6 commit 4fe443f
Show file tree
Hide file tree
Showing 22 changed files with 170 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -731,4 +731,13 @@ public static ObjectPaging convertToObjectPaging(PagingType pagingType, PrismCon
query.setFilter(filter);
return query;
}

@SuppressWarnings("ReplaceNullCheck")
public static @NotNull ObjectQuery emptyIfNull(ObjectQuery objectQuery) {
if (objectQuery != null) {
return objectQuery;
} else {
return PrismContext.get().queryFactory().createQuery();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public static void applyDefaultObjectType(@NotNull ObjectSetType set, @NotNull Q
}
}

public static @NotNull ObjectSetType fromConfiguration(ObjectSetType configured) {
public static @NotNull ObjectSetType emptyIfNull(ObjectSetType configured) {
return configured != null ? configured : new ObjectSetType();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,12 @@ public static class MyWorkDefinition extends AbstractWorkDefinition implements O

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (ShadowRefreshWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getShadows());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getShadows());
ObjectSetUtil.assumeObjectType(objects, ShadowType.COMPLEX_TYPE);
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,12 @@ static class MyWorkDefinition extends AbstractWorkDefinition implements ObjectSe

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (ObjectIntegrityCheckWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
histogramColumns = MoreObjects.firstNonNull(typedDefinition.getHistogramColumns(), DEFAULT_HISTOGRAM_COLUMNS);
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class ShadowIntegrityCheckWorkDefinition extends AbstractWorkDefinition i

ShadowIntegrityCheckWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (ShadowIntegrityCheckWorkDefinitionType) source.getBean();
shadows = ObjectSetUtil.fromConfiguration(typedDefinition.getShadows());
shadows = ObjectSetUtil.emptyIfNull(typedDefinition.getShadows());
ObjectSetUtil.assumeObjectType(shadows, ShadowType.COMPLEX_TYPE);
aspectsToDiagnose = new HashSet<>(typedDefinition.getDiagnose());
aspectsToFix = new HashSet<>(typedDefinition.getFix());
Expand All @@ -57,7 +57,7 @@ public class ShadowIntegrityCheckWorkDefinition extends AbstractWorkDefinition i
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return shadows;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,12 @@ private void executeScriptOnObject(ObjectType object, RunningTask workerTask, Op

public static class MyWorkDefinition extends AbstractWorkDefinition implements ObjectSetSpecificationProvider {

private final ObjectSetType objects;
private final ExecuteScriptType scriptExecutionRequest;
@NotNull private final ObjectSetType objects;
@NotNull private final ExecuteScriptType scriptExecutionRequest;

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (IterativeScriptingWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
scriptExecutionRequest = typedDefinition.getScriptExecutionRequest();
argCheck(scriptExecutionRequest != null, "No script execution request provided");
argCheck(scriptExecutionRequest.getScriptingExpression() != null, "No scripting expression provided");
Expand All @@ -135,11 +135,11 @@ public static class MyWorkDefinition extends AbstractWorkDefinition implements O
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

public ExecuteScriptType getScriptExecutionRequest() {
public @NotNull ExecuteScriptType getScriptExecutionRequest() {
return scriptExecutionRequest;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ public static class MyWorkDefinition extends AbstractWorkDefinition implements O

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (DeletionWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects()); // Can contain search options.
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects()); // Can contain search options.
executionOptions = Objects.requireNonNullElseGet(
fromModelExecutionOptionsType(typedDefinition.getExecutionOptions()),
ModelExecuteOptions::create);
Expand All @@ -265,7 +265,7 @@ public static class MyWorkDefinition extends AbstractWorkDefinition implements O
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.model.api.ModelExecuteOptions;
Expand Down Expand Up @@ -131,28 +132,28 @@ public boolean processItem(@NotNull ObjectType object,

public static class MyWorkDefinition extends AbstractWorkDefinition implements ObjectSetSpecificationProvider {

private final ObjectSetType objects;
private final ObjectDeltaType delta;
private final ModelExecuteOptions executionOptions;
@NotNull private final ObjectSetType objects;
@NotNull private final ObjectDeltaType delta;
@Nullable private final ModelExecuteOptions executionOptions;

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (IterativeChangeExecutionWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
delta = typedDefinition.getDelta();
argCheck(delta != null, "No delta specified");
executionOptions = fromModelExecutionOptionsType(typedDefinition.getExecutionOptions());
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

public ObjectDeltaType getDelta() {
public @NotNull ObjectDeltaType getDelta() {
return delta;
}

ModelExecuteOptions getExecutionOptions() {
@Nullable ModelExecuteOptions getExecutionOptions() {
return executionOptions;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,15 @@ public static class MyWorkDefinition extends AbstractWorkDefinition implements O

MyWorkDefinition(WorkDefinitionBean source) {
var typedDefinition = (RecomputationWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
ObjectSetUtil.applyDefaultObjectType(objects, DEFAULT_OBJECT_TYPE_FOR_NEW_SPEC);
executionOptions = java.util.Objects.requireNonNullElseGet(
fromModelExecutionOptionsType(typedDefinition.getExecutionOptions()),
() -> ModelExecuteOptions.create().reconcile()); // Default for compatibility reasons
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,15 @@ private void reindexObject(ObjectType object, OperationResult result) throws Com

public static class MyWorkDefinition extends AbstractWorkDefinition implements ObjectSetSpecificationProvider {

private final ObjectSetType objects;
@NotNull private final ObjectSetType objects;

MyWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (ReindexingWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@

public class AutoScalingWorkDefinition extends AbstractWorkDefinition implements ObjectSetSpecificationProvider {

private final ObjectSetType tasks;
@NotNull private final ObjectSetType tasks;
private final Duration minReconciliationInterval;
private final Duration maxReconciliationInterval;
private final boolean skipInitialReconciliation;

AutoScalingWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (ActivityAutoScalingWorkDefinitionType) source.getBean();

tasks = ObjectSetUtil.fromConfiguration(typedDefinition.getTasks());
tasks = ObjectSetUtil.emptyIfNull(typedDefinition.getTasks());
ObjectSetUtil.assumeObjectType(tasks, TaskType.COMPLEX_TYPE);

minReconciliationInterval = typedDefinition.getMinReconciliationInterval();
Expand All @@ -39,7 +39,7 @@ public class AutoScalingWorkDefinition extends AbstractWorkDefinition implements
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return tasks;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class FocusValidityScanWorkDefinition extends AbstractWorkDefinition impl
FocusValidityScanWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (FocusValidityScanWorkDefinitionType) source.getBean();

objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
// We allow user to use types above FocusType if he needs to check e.g. assignments validity
// on AssignmentHolderType objects.
ObjectSetUtil.applyDefaultObjectType(objects, FocusType.COMPLEX_TYPE);
Expand All @@ -38,7 +38,7 @@ public class FocusValidityScanWorkDefinition extends AbstractWorkDefinition impl
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ public class TriggerScanWorkDefinition extends AbstractWorkDefinition implements

TriggerScanWorkDefinition(@NotNull WorkDefinitionBean source) {
var typedDefinition = (TriggerScanWorkDefinitionType) source.getBean();
objects = ObjectSetUtil.fromConfiguration(typedDefinition.getObjects());
objects = ObjectSetUtil.emptyIfNull(typedDefinition.getObjects());
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return objects;
}

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

import java.io.File;
import java.util.List;

import com.evolveum.midpoint.test.*;

import jakarta.xml.bind.JAXBElement;

import org.springframework.test.annotation.DirtiesContext;
Expand All @@ -34,9 +37,6 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.IntegrationTestTools;
import com.evolveum.midpoint.test.TestResource;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
Expand Down Expand Up @@ -67,6 +67,12 @@ public class TestRecomputeTask extends AbstractInitializedModelIntegrationTest {
private static final TestResource<ArchetypeType> ARCHETYPE_TASK_RECOMPUTATION =
new TestResource<>(TEST_DIR, "archetype-task-recomputation.xml", "77615e4c-b82e-4b3a-b265-5487a6ac016b");

private static final TestObject<ArchetypeType> ARCHETYPE_EMPLOYEE = TestObject.file(
TEST_DIR, "archetype-employee.xml", "e3a9a6b9-17f6-4239-b935-6f88a655b9d7");

private static final TestTask TASK_USER_RECOMPUTE_EMPLOYEES = new TestTask(
TEST_DIR, "task-user-recompute-employees.xml", "fb1b8d77-d2a6-4bc3-b771-ba2a4159dae7");

@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
Expand All @@ -78,6 +84,10 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
}

assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL);

initTestObjects(initTask, initResult,
ARCHETYPE_EMPLOYEE,
TASK_USER_RECOMPUTE_EMPLOYEES);
}

@Test
Expand Down Expand Up @@ -458,4 +468,31 @@ public void test130RecomputeLight() throws Exception {

assertUsers(7);
}

@Test
public void test140RecomputeEmployees() throws CommonException {
var task = getTestTask();
var result = task.getResult();

given("an employee exists");
UserType user = new UserType()
.name(getTestNameShort())
.assignment(ARCHETYPE_EMPLOYEE.assignmentTo());
addObject(user, task, result);

try {
when("recomputing employees");
TASK_USER_RECOMPUTE_EMPLOYEES.rerun(result);

then("only the employee is recomputed");
TASK_USER_RECOMPUTE_EMPLOYEES.assertAfter()
.display()
.assertProgress(1)
.rootActivityState()
.itemProcessingStatistics()
.assertLastSuccessObjectName(user.getName().getOrig());
} finally {
deleteObject(UserType.class, user.getOid());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2017 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<task xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
oid="fb1b8d77-d2a6-4bc3-b771-ba2a4159dae7">
<name>user-recompute-employees</name>
<assignment>
<targetRef oid="77615e4c-b82e-4b3a-b265-5487a6ac016b" type="ArchetypeType"/>
</assignment>
<ownerRef oid="00000000-0000-0000-0000-000000000002"/>
<executionState>closed</executionState> <!-- run on demand -->
<activity>
<work>
<recomputation>
<objects>
<type>UserType</type>
<archetypeRef oid="e3a9a6b9-17f6-4239-b935-6f88a655b9d7"/>
</objects>
</recomputation>
</work>
</activity>
</task>
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,16 @@

public class MultiPropagationWorkDefinition extends AbstractWorkDefinition implements ObjectSetSpecificationProvider {

private final ObjectSetType resources;
@NotNull private final ObjectSetType resources;

MultiPropagationWorkDefinition(@NotNull WorkDefinitionBean source) {
resources = ((MultiPropagationWorkDefinitionType) source.getBean()).getResources();
resources = ObjectSetUtil.emptyIfNull(
((MultiPropagationWorkDefinitionType) source.getBean()).getResources());
ObjectSetUtil.assumeObjectType(resources, ResourceType.COMPLEX_TYPE);
}

public ObjectSetType getResources() {
return resources;
}

@Override
public ObjectSetType getObjectSetSpecification() {
public @NotNull ObjectSetType getObjectSetSpecification() {
return resources;
}

Expand Down

0 comments on commit 4fe443f

Please sign in to comment.