Skip to content

Commit

Permalink
Respect activities "order" property
Browse files Browse the repository at this point in the history
The "order" property of sub-activities of a custom composite activity
is now respected.

Also:

- Artefacts referencing "pure composite" activity were changed
to "custom composite" (now-official term for such activities).

This resolves MID-8166.
  • Loading branch information
mederly committed Nov 25, 2022
1 parent f0e2302 commit 6a61180
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7396,10 +7396,14 @@
<xsd:annotation>
<xsd:documentation>
Work state for a pure composite activity.
Replaced by CustomCompositeWorkStateType.
</xsd:documentation>
<xsd:appinfo>
<a:container>true</a:container>
<a:since>4.4</a:since>
<a:deprecated>true</a:deprecated>
<a:deprecatedSince>4.7</a:deprecatedSince>
<a:deprecatedSince>4.4.4</a:deprecatedSince>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
Expand All @@ -7408,6 +7412,23 @@
</xsd:complexType>
<xsd:element name="pureCompositeWorkState" type="tns:PureCompositeWorkStateType" />

<xsd:complexType name="CustomCompositeWorkStateType">
<xsd:annotation>
<xsd:documentation>
Work state for a custom composite activity.
</xsd:documentation>
<xsd:appinfo>
<a:container>true</a:container>
<a:since>4.7</a:since>
<a:since>4.4.4</a:since>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="tns:AbstractActivityWorkStateType"/>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="customCompositeWorkState" type="tns:CustomCompositeWorkStateType" />

<xsd:complexType name="ScanWorkStateType">
<xsd:annotation>
<xsd:documentation>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,13 @@ public static <WD extends AbstractWorkDefinition> ActivityDefinition<WD> createR
}

/**
* Creates a definition for a child of a pure-composite activity.
* Creates a definition for a child of a custom composite activity.
*
* It is taken from the "activity" bean, combined with (compatible) information from "defaultWorkDefinition"
* beans all the way up.
*/
public static ActivityDefinition<?> createChild(@NotNull ActivityDefinitionType bean,
@NotNull WorkDefinitionFactory workDefinitionFactory) {
public static ActivityDefinition<?> createChild(
@NotNull ActivityDefinitionType bean, @NotNull WorkDefinitionFactory workDefinitionFactory) {
try {
AbstractWorkDefinition definition = createFromBean(bean, workDefinitionFactory);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public ActivityReportingDefinition(@NotNull ActivityReportingDefinitionType bean
}

/**
* The task can be null for children of pure-composite activities.
* The task can be null for children of custom composite activities.
*/
@NotNull
public static ActivityReportingDefinition create(@Nullable ActivityDefinitionType definitionBean, @Nullable Task task) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@
import com.evolveum.midpoint.repo.common.activity.run.ActivityRunInstantiationContext;
import com.evolveum.midpoint.repo.common.activity.definition.CompositeWorkDefinition;

import com.evolveum.midpoint.util.exception.SchemaException;

import com.evolveum.midpoint.xml.ns._public.common.common_3.PureCompositeWorkStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivityDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CustomCompositeWorkStateType;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -31,13 +30,15 @@
import com.evolveum.midpoint.schema.result.OperationResult;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Collectors;

/**
* TODO
* Handles custom composite activities, see
* https://docs.evolveum.com/midpoint/reference/tasks/activities/#configuring-custom-composite-activities.
*/
@Component
public class PureCompositeActivityHandler implements ActivityHandler<CompositeWorkDefinition, PureCompositeActivityHandler> {
public class CustomCompositeActivityHandler implements ActivityHandler<CompositeWorkDefinition, CustomCompositeActivityHandler> {

@Autowired ActivityHandlerRegistry handlerRegistry;
@Autowired WorkDefinitionFactory workDefinitionFactory;
Expand All @@ -53,16 +54,18 @@ public void unregister() {
}

@Override
public @NotNull AbstractActivityRun<CompositeWorkDefinition, PureCompositeActivityHandler, ?> createActivityRun(
@NotNull ActivityRunInstantiationContext<CompositeWorkDefinition, PureCompositeActivityHandler> context,
public @NotNull AbstractActivityRun<CompositeWorkDefinition, CustomCompositeActivityHandler, ?> createActivityRun(
@NotNull ActivityRunInstantiationContext<CompositeWorkDefinition, CustomCompositeActivityHandler> context,
@NotNull OperationResult result) {
return new CompositeActivityRun<>(context);
}

@Override
public ArrayList<Activity<?, ?>> createChildActivities(Activity<CompositeWorkDefinition, PureCompositeActivityHandler> parent)
throws SchemaException {
public ArrayList<Activity<?, ?>> createChildActivities(Activity<CompositeWorkDefinition, CustomCompositeActivityHandler> parent) {
return parent.getWorkDefinition().getComposition().getActivity().stream()
.sorted(Comparator.comparing(
ActivityDefinitionType::getOrder,
Comparator.nullsLast(Comparator.naturalOrder())))
.map(definitionBean -> ActivityDefinition.createChild(definitionBean, workDefinitionFactory))
.map(definition -> createChildActivity(definition, parent))
.collect(Collectors.toCollection(ArrayList::new));
Expand All @@ -81,6 +84,6 @@ public String getIdentifierPrefix() {

@Override
public @NotNull ActivityStateDefinition<?> getRootActivityStateDefinition() {
return ActivityStateDefinition.normal(PureCompositeWorkStateType.COMPLEX_TYPE);
return ActivityStateDefinition.normal(CustomCompositeWorkStateType.COMPLEX_TYPE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
*
* 1. running simple mock activity ({@link #test100RunSimpleLegacyTask()}, {@link #test120RunSimpleTask()}),
* 2. running mock semi-composite activity ({@link #test110RunCompositeLegacyTask()}, {@link #test130RunCompositeTask()}),
* 3. running pure composite activity ({@link #test140RunPureCompositeTask()}),
* 3. running custom composite activity ({@link #test140RunCustomCompositeTask()}),
* 4. running mock iterative activity, including bucketing ({@link #test150RunMockIterativeTask()}, {@link #test155RunBucketedMockIterativeTask()}),
* 5. running mock search-based activity, including bucketing ({@link #test160RunMockSearchBasedTask()}, {@link #test170RunBucketedTask()}),
* 6. running tree of bucketed activities ({@link #test180RunBucketedTree()}),
Expand Down Expand Up @@ -95,7 +95,7 @@ public class TestActivities extends AbstractRepoCommonTest {
private static final TestResource<TaskType> TASK_120_MOCK_SIMPLE = new TestResource<>(TEST_DIR, "task-120-mock-simple.xml", "6a1a58fa-ce09-495d-893f-3093cdcc00b6");
private static final TestResource<TaskType> TASK_130_MOCK_COMPOSITE = new TestResource<>(TEST_DIR, "task-130-mock-composite.xml", "14a41fca-a664-450c-bc5d-d4ce35045346");
private static final TestResource<TaskType> TASK_135_NO_OP = new TestResource<>(TEST_DIR, "task-135-no-op.xml", "d1c750b0-eddc-445f-b907-d19c8ed754b5");
private static final TestResource<TaskType> TASK_140_PURE_COMPOSITE = new TestResource<>(TEST_DIR, "task-140-pure-composite.xml", "65866e01-73cd-4249-9b7b-03ebc4413bd0");
private static final TestResource<TaskType> TASK_140_CUSTOM_COMPOSITE = new TestResource<>(TEST_DIR, "task-140-custom-composite.xml", "65866e01-73cd-4249-9b7b-03ebc4413bd0");
private static final TestResource<TaskType> TASK_150_MOCK_ITERATIVE = new TestResource<>(TEST_DIR, "task-150-mock-iterative.xml", "c21785e9-1c67-492f-bc79-0c51f74561a1");
private static final TestResource<TaskType> TASK_155_MOCK_ITERATIVE_BUCKETED = new TestResource<>(TEST_DIR, "task-155-mock-iterative-bucketed.xml", "02a94071-2eff-4ca0-aa63-3fdf9d540064");
private static final TestResource<TaskType> TASK_160_MOCK_SEARCH_ITERATIVE = new TestResource<>(TEST_DIR, "task-160-mock-search-iterative.xml", "9d8384b3-a007-44e2-a9f7-084a64bdc285");
Expand Down Expand Up @@ -485,31 +485,31 @@ public void test135RunNoOpTask() throws Exception {
}

/**
* Pure composite activity.
* Custom composite activity.
*
* This test runs the task twice to check the activity state purger
* (it cleans up the state before second run).
*/
@Test
public void test140RunPureCompositeTask() throws Exception {
public void test140RunCustomCompositeTask() throws Exception {

given();

Task task = getTestTask();
OperationResult result = task.getResult();

recorder.reset();
Task root = taskAdd(TASK_140_PURE_COMPOSITE, result);
Task root = taskAdd(TASK_140_CUSTOM_COMPOSITE, result);
List<String> expectedExecutions1 = List.of("A:opening", "A:closing", "Hello", "B:opening", "B:closing", "C:closing");
List<String> expectedExecutions2 = ListUtils.union(expectedExecutions1, expectedExecutions1);

execute140RunPureCompositeTaskOnce(root, "run 1", 1, expectedExecutions1);
execute140RunCustomCompositeTaskOnce(root, "run 1", 1, expectedExecutions1);
restartTask(root.getOid(), result);

execute140RunPureCompositeTaskOnce(root, "run 2", 2, expectedExecutions2);
execute140RunCustomCompositeTaskOnce(root, "run 2", 2, expectedExecutions2);
}

private void execute140RunPureCompositeTaskOnce(Task root, String label, int runNumber,
private void execute140RunCustomCompositeTaskOnce(Task root, String label, int runNumber,
List<String> expectedExecutions) throws CommonException {

Task task = getTestTask();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,21 @@
<executionState>runnable</executionState>
<activity>
<composition>
<!-- The physical (list position) and logical ("order" property) ordering intentionally differ here - MID-8166. -->
<activity>
<order>1</order>
<order>4</order>
<work>
<extension>
<ext:compositeMock>
<ext:message>A</ext:message>
<ext:delay>100</ext:delay>
<ext:steps>3</ext:steps>
<ext:message>C</ext:message>
<ext:delay>200</ext:delay>
<ext:steps>1</ext:steps>
<ext:opening>false</ext:opening>
<ext:closing>true</ext:closing>
</ext:compositeMock>
</extension>
</work>
</activity>
<activity>
<order>2</order>
<work>
<extension>
<ext:simpleMock>
<ext:message>Hello</ext:message>
</ext:simpleMock>
</extension>
</work>
</activity>
<activity>
<order>3</order>
<work>
Expand All @@ -49,15 +42,23 @@
</work>
</activity>
<activity>
<order>3</order>
<order>2</order>
<work>
<extension>
<ext:simpleMock>
<ext:message>Hello</ext:message>
</ext:simpleMock>
</extension>
</work>
</activity>
<activity>
<order>1</order>
<work>
<extension>
<ext:compositeMock>
<ext:message>C</ext:message>
<ext:delay>200</ext:delay>
<ext:steps>1</ext:steps>
<ext:opening>false</ext:opening>
<ext:closing>true</ext:closing>
<ext:message>A</ext:message>
<ext:delay>100</ext:delay>
<ext:steps>3</ext:steps>
</ext:compositeMock>
</extension>
</work>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<task oid="694a5aae-d869-4b58-a6dc-aad4c5cc1e4d"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:ext="http://midpoint.evolveum.com/xml/ns/repo-common-test/extension">
<name>task-pure-composite-with-default-work</name>
<name>task-custom-composite-with-default-work</name>
<ownerRef oid="00000000-0000-0000-0000-000000000002"/>
<executionState>runnable</executionState>
<recurrence>single</recurrence>
Expand Down

0 comments on commit 6a61180

Please sign in to comment.