Skip to content

Commit

Permalink
Migrate non-iterative bulk actions to activities
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Oct 21, 2021
1 parent e6c203e commit 1d9ef3c
Show file tree
Hide file tree
Showing 8 changed files with 276 additions and 234 deletions.
86 changes: 44 additions & 42 deletions infra/common/src/test/resources/crypto/task-add-jack.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,52 +6,54 @@
-->

<task xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" oid="9de76345-0f02-48de-86bf-e7a887cb374a">
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
oid="9de76345-0f02-48de-86bf-e7a887cb374a">
<name>Task 1555581798624-0-1</name>
<extension xmlns:se="http://midpoint.evolveum.com/xml/ns/public/model/scripting/extension-3">
<se:executeScript xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3">
<s:pipeline list="true">
<s:search>
<s:type>c:UserType</s:type>
<s:searchFilter>
<q:equal>
<q:path>c:name</q:path>
<q:value>jack</q:value>
</q:equal>
</s:searchFilter>
</s:search>
<s:action>
<s:type>modify</s:type>
<s:parameter>
<s:name>delta</s:name>
<!-- this delta doesn't make sense but we use this only to check password encryption in "objectToAdd" item -->
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="t:ObjectDeltaType">
<t:changeType>add</t:changeType>
<t:objectType>UserType</t:objectType>
<t:objectToAdd xsi:type="c:UserType">
<name>jack</name>
<credentials>
<password>
<value>pass1234word</value>
</password>
</credentials>
</t:objectToAdd>
</value>
</s:parameter>
</s:action>
</s:pipeline>
</se:executeScript>
</extension>
<taskIdentifier>1555581798624-0-1</taskIdentifier>
<ownerRef oid="00000000-0000-0000-0000-000000000002" relation="org:default" type="c:UserType">
<!-- administrator -->
</ownerRef>
<executionState>runnable</executionState>
<category>BulkActions</category>
<handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3</handlerUri>
<recurrence>single</recurrence>
<binding>tight</binding>
<activity>
<work>
<nonIterativeScripting>
<scriptExecutionRequest>
<s:pipeline list="true">
<s:search>
<s:type>c:UserType</s:type>
<s:searchFilter>
<q:equal>
<q:path>c:name</q:path>
<q:value>jack</q:value>
</q:equal>
</s:searchFilter>
</s:search>
<s:action>
<s:type>modify</s:type>
<s:parameter>
<s:name>delta</s:name>
<!-- this delta doesn't make sense but we use this only to check password encryption in "objectToAdd" item -->
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="t:ObjectDeltaType">
<t:changeType>add</t:changeType>
<t:objectType>UserType</t:objectType>
<t:objectToAdd xsi:type="c:UserType">
<name>jack</name>
<credentials>
<password>
<value>pass1234word</value>
</password>
</credentials>
</t:objectToAdd>
</value>
</s:parameter>
</s:action>
</s:pipeline>
</scriptExecutionRequest>
</nonIterativeScripting>
</work>
</activity>
</task>
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public static List<WorkDefinitionWrapper> getWorkDefinitions(WorkDefinitionsType
addTypedParameters(values, definitions.getReportImport());
addTypedParameters(values, definitions.getDistributedReportExport());
addTypedParameters(values, definitions.getIterativeScripting());
addTypedParameters(values, definitions.getNonIterativeScripting());
addTypedParameters(values, definitions.getFocusValidityScan());
addTypedParameters(values, definitions.getTriggerScan());
addTypedParameters(values, definitions.getShadowRefresh());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1679,7 +1679,8 @@ public TaskType submitTaskFromTemplate(String templateTaskOid, List<Item<?, ?>>
newTask.setExecutionState(RUNNABLE);
newTask.setSchedulingState(READY);
for (Item<?, ?> extensionItem : extensionItems) {
newTask.asPrismObject().getExtension().add(extensionItem.clone());
newTask.asPrismObject().getOrCreateExtension()
.add(extensionItem.clone());
}
ObjectDelta<TaskType> taskAddDelta = DeltaFactory.Object.createAddDelta(newTask.asPrismObject());
Collection<ObjectDeltaOperation<? extends ObjectType>> executedChanges = modelService.executeChanges(singleton(taskAddDelta), null, opTask, result);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
* Copyright (c) 2010-2019 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.model.impl.scripting;

import static com.evolveum.midpoint.util.MiscUtil.argCheck;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.model.api.ModelPublicConstants;
import com.evolveum.midpoint.model.api.ScriptExecutionResult;
import com.evolveum.midpoint.model.api.ScriptingService;
import com.evolveum.midpoint.model.impl.tasks.ModelActivityHandler;
import com.evolveum.midpoint.repo.common.activity.ActivityExecutionException;
import com.evolveum.midpoint.repo.common.activity.definition.AbstractWorkDefinition;
import com.evolveum.midpoint.repo.common.activity.execution.AbstractActivityExecution;
import com.evolveum.midpoint.repo.common.activity.execution.ActivityExecutionResult;
import com.evolveum.midpoint.repo.common.activity.execution.ExecutionInstantiationContext;
import com.evolveum.midpoint.repo.common.activity.execution.LocalActivityExecution;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.task.work.LegacyWorkDefinitionSource;
import com.evolveum.midpoint.schema.util.task.work.WorkDefinitionSource;
import com.evolveum.midpoint.schema.util.task.work.WorkDefinitionWrapper.TypedWorkDefinitionWrapper;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractActivityWorkStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.NonIterativeScriptingWorkDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType;

/**
* This is a handler for "old", non-iterative (single) bulk actions.
*/
@Component
public class NonIterativeScriptingActivityHandler
extends ModelActivityHandler<
NonIterativeScriptingActivityHandler.MyWorkDefinition,
NonIterativeScriptingActivityHandler> {

@Autowired private ScriptingService scriptingService;

private static final String LEGACY_HANDLER_URI = ModelPublicConstants.SCRIPT_EXECUTION_TASK_HANDLER_URI;
private static final Trace LOGGER = TraceManager.getTrace(NonIterativeScriptingActivityHandler.class);

@PostConstruct
public void register() {
handlerRegistry.register(NonIterativeScriptingWorkDefinitionType.COMPLEX_TYPE, LEGACY_HANDLER_URI,
MyWorkDefinition.class, MyWorkDefinition::new, this);
}

@PreDestroy
public void unregister() {
handlerRegistry.unregister(NonIterativeScriptingWorkDefinitionType.COMPLEX_TYPE, LEGACY_HANDLER_URI,
MyWorkDefinition.class);
}

@Override
public String getIdentifierPrefix() {
return "non-iterative-scripting";
}

@Override
public String getDefaultArchetypeOid() {
return SystemObjectsType.ARCHETYPE_SINGLE_BULK_ACTION_TASK.value();
}

@Override
public AbstractActivityExecution<MyWorkDefinition, NonIterativeScriptingActivityHandler, ?> createExecution(
@NotNull ExecutionInstantiationContext<MyWorkDefinition, NonIterativeScriptingActivityHandler> context,
@NotNull OperationResult result) {
return new MyActivityExecution(context);
}

static class MyActivityExecution
extends LocalActivityExecution<MyWorkDefinition, NonIterativeScriptingActivityHandler, AbstractActivityWorkStateType> {

MyActivityExecution(
@NotNull ExecutionInstantiationContext<MyWorkDefinition, NonIterativeScriptingActivityHandler> context) {
super(context);
}

@Override
public boolean doesSupportStatistics() {
return false;
}

@Override
protected @NotNull ActivityExecutionResult executeLocal(OperationResult result)
throws ActivityExecutionException, CommonException {
ExecuteScriptType executeScriptRequest = getWorkDefinition().getScriptExecutionRequest().clone();
ScriptExecutionResult executionResult = getActivityHandler().scriptingService
.evaluateExpression(executeScriptRequest,
VariablesMap.emptyMap(), false, getRunningTask(), result);
LOGGER.debug("Execution output: {} item(s)", executionResult.getDataOutput().size());
LOGGER.debug("Execution result:\n{}", executionResult.getConsoleOutput());
return standardExecutionResult();
}
}

public static class MyWorkDefinition extends AbstractWorkDefinition {

private final ExecuteScriptType scriptExecutionRequest;

MyWorkDefinition(WorkDefinitionSource source) {
if (source instanceof LegacyWorkDefinitionSource) {
scriptExecutionRequest = ((LegacyWorkDefinitionSource) source)
.getExtensionItemRealValue(SchemaConstants.SE_EXECUTE_SCRIPT, ExecuteScriptType.class);
} else {
NonIterativeScriptingWorkDefinitionType typedDefinition = (NonIterativeScriptingWorkDefinitionType)
((TypedWorkDefinitionWrapper) source).getTypedDefinition();
scriptExecutionRequest = typedDefinition.getScriptExecutionRequest();
}
argCheck(scriptExecutionRequest != null, "No script execution request provided");
argCheck(scriptExecutionRequest.getScriptingExpression() != null, "No scripting expression provided");
}

public ExecuteScriptType getScriptExecutionRequest() {
return scriptExecutionRequest;
}

@Override
protected void debugDumpContent(StringBuilder sb, int indent) {
DebugUtil.debugDumpWithLabelLn(sb, "scriptExecutionRequest", String.valueOf(scriptExecutionRequest), indent+1);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
~ and European Union Public License. See LICENSE file for details.
-->

<!-- This task is a legacy one in two aspects: (1) using pre-4.2 version of bulk actions, (2) using pre-4.4 version of tasks. -->
<task xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3"
Expand Down

0 comments on commit 1d9ef3c

Please sign in to comment.