diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java index 1b541819d3d..85eedc0fa4c 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java @@ -6,6 +6,8 @@ */ package com.evolveum.midpoint.prism; +import com.evolveum.midpoint.prism.path.ItemName; + import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; import javax.xml.namespace.QName; @@ -121,7 +123,7 @@ public class PrismConstants { public static final QName Q_RELATION = new QName(NS_QUERY, "relation"); public static final QName Q_VALUE = new QName(NS_QUERY, "value"); public static final QName Q_ORDER_BY = new QName(NS_QUERY, "orderBy"); - public static final QName Q_ANY = new QName(NS_QUERY, "any"); + public static final ItemName Q_ANY = new ItemName(NS_QUERY, "any"); // Path constants public static final String T_PARENT_LOCAL_PART = "parent"; diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/path/ItemName.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/path/ItemName.java index e5c9b78bc7e..a4e9e73c9d6 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/path/ItemName.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/path/ItemName.java @@ -178,7 +178,7 @@ public ItemPath subPath(int from, int to) { } } - public boolean matches(ItemName other) { + public boolean matches(QName other) { return QNameUtil.match(this, other); } diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java index a3236a7ff3b..3f4e8bb9494 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java @@ -35,6 +35,7 @@ import java.util.Map.Entry; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.ZipEntry; @@ -595,12 +596,16 @@ public static String getFirstNonNullString(Object... values) { } public static T extractSingleton(Collection collection) { + return extractSingleton(collection, () -> new IllegalArgumentException("Expected a collection with at most one item; got the one with " + collection.size() + " items")); + } + + public static T extractSingleton(Collection collection, Supplier exceptionSupplier) throws E { if (collection == null || collection.isEmpty()) { return null; } else if (collection.size() == 1) { return collection.iterator().next(); } else { - throw new IllegalArgumentException("Expected a collection with at most one item; got the one with " + collection.size() + " items"); + throw exceptionSupplier.get(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java index 0e863887967..896ef8a471f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java @@ -7,119 +7,25 @@ package com.evolveum.midpoint.model.impl.scripting.actions; -import com.evolveum.midpoint.model.api.ScriptExecutionException; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.schema.RelationRegistry; -import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; - -import javax.management.relation.RelationType; import javax.xml.namespace.QName; -/** - * @author mederly - */ -@Component -public class AssignExecutor extends AssignmentOperationsExecutor { - - private static final Trace LOGGER = TraceManager.getTrace(AssignExecutor.class); - - @Autowired - protected RelationRegistry relationRegistry; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -// private static final String NAME = "assign"; -// private static final String PARAM_RESOURCE = "resource"; -// private static final String PARAM_ROLE = "role"; -// private static final String PARAM_RELATION = "relation"; +import com.evolveum.midpoint.prism.PrismConstants; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -// @PostConstruct -// public void init() { -// scriptingExpressionEvaluator.registerActionExecutor(NAME, this); -// } +@Component +public class AssignExecutor extends AssignmentOperationsExecutor { -// @Override -// public PipelineData execute(ActionExpressionType expression, PipelineData input, ExecutionContext context, OperationResult globalResult) throws ScriptExecutionException { -// -// ModelExecuteOptions executionOptions = getOptions(expression, input, context, globalResult); -// boolean dryRun = getParamDryRun(expression, input, context, globalResult); -// -// ActionParameterValueType resourceParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_RESOURCE, false, false, NAME); -// ActionParameterValueType roleParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_ROLE, false, false, NAME); -// Collection relations = expressionHelper.getArgumentValues(expression.getParameter(), PARAM_RELATION, false, false, NAME, input, context, String.class, globalResult); -// -// Collection resources; -// try { -// if (resourceParameterValue != null) { -// PipelineData data = expressionHelper -// .evaluateParameter(resourceParameterValue, null, input, context, globalResult); -// resources = data.getDataAsReferences(ResourceType.COMPLEX_TYPE, ResourceType.class, context, globalResult); -// } else { -// resources = null; -// } -// } catch (CommonException e) { -// throw new ScriptExecutionException("Couldn't evaluate '" + PARAM_RESOURCE + "' parameter of a scripting expression: " + e.getMessage(), e); -// } -// -// Collection roles; -// try { -// if (roleParameterValue != null) { -// PipelineData data = expressionHelper.evaluateParameter(roleParameterValue, null, input, context, globalResult); -// roles = data.getDataAsReferences(RoleType.COMPLEX_TYPE, AbstractRoleType.class, context, globalResult); // if somebody wants to assign Org, he has to use full reference value (including object type) -// } else { -// roles = null; -// } -// } catch (CommonException e) { -// throw new ScriptExecutionException("Couldn't evaluate '" + PARAM_ROLE + "' parameter of a scripting expression: " + e.getMessage(), e); -// } -// -// if (resources == null && roles == null) { -// throw new ScriptExecutionException("Nothing to assign: neither resource nor role specified"); -// } -// -// if (CollectionUtils.isEmpty(resources) && CollectionUtils.isEmpty(roles)) { -// LOGGER.warn("No resources and no roles to assign in a scripting expression"); -// context.println("Warning: no resources and no roles to assign"); // TODO some better handling? -// return input; -// } -// -// for (PipelineItem item : input.getData()) { -// PrismValue value = item.getValue(); -// OperationResult result = operationsHelper.createActionResult(item, this, context, globalResult); -// context.checkTaskStop(); -// if (value instanceof PrismObjectValue && ((PrismObjectValue) value).asObjectable() instanceof FocusType) { -// @SuppressWarnings({"unchecked", "raw"}) -// PrismObject prismObject = ((PrismObjectValue) value).asPrismObject(); -// ObjectType objectType = prismObject.asObjectable(); -// long started = operationsHelper.recordStart(context, objectType); -// Throwable exception = null; -// try { -// operationsHelper.applyDelta(createDelta(objectType, resources, roles, relations), executionOptions, dryRun, context, result); -// operationsHelper.recordEnd(context, objectType, started, null); -// } catch (Throwable ex) { -// operationsHelper.recordEnd(context, objectType, started, ex); -// exception = processActionException(ex, NAME, value, context); -// } -// context.println((exception != null ? "Attempted to modify " : "Modified ") + prismObject.toString() + optionsSuffix(executionOptions, dryRun) + exceptionSuffix(exception)); -// } else { -// //noinspection ThrowableNotThrown -// processActionException(new ScriptExecutionException("Item is not a PrismObject of FocusType"), NAME, value, context); -// } -// operationsHelper.trimAndCloneResult(result, globalResult, context); -// } -// return input; // TODO updated objects? -// } + @Autowired protected RelationRegistry relationRegistry; @Override protected String getName() { @@ -127,60 +33,46 @@ protected String getName() { } @Override - protected ObjectDelta createDelta(AssignmentHolderType objectType, Collection resources, Collection roles, Collection relations) throws ScriptExecutionException { + protected ObjectDelta createDelta(AssignmentHolderType object, Collection resources, + Collection roles, Collection relationSpecifications) throws SchemaException { - String relation; + QName relationSpecification = MiscUtil.extractSingleton(relationSpecifications, + () -> new IllegalArgumentException("Couldn't use 'relation' as multivalue parameter")); - if (relations == null || relations.isEmpty()) { - QName defaultRelation = prismContext.getDefaultRelation() != null ? - prismContext.getDefaultRelation() : RelationTypes.MEMBER.getRelation(); - relation = QNameUtil.qNameToUri(defaultRelation); - } else if (relations.size() > 1) { - throw new IllegalArgumentException("Couldn't use relation as multivalue parameter"); - } else { - relation = relations.iterator().next(); + if (PrismConstants.Q_ANY.matches(relationSpecification)) { + throw new IllegalArgumentException("Using 'q:any' as relation specification is not allowed"); } - List assignments = new ArrayList<>(); + List assignmentsToAdd = new ArrayList<>(); if (roles != null) { List relationDefinitions = relationRegistry.getRelationDefinitions(); + QName matchingRelation = relationDefinitions.stream() + .filter(definition -> prismContext.relationMatches(relationSpecification, definition.getRef())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Relation matching '" + relationSpecification + "' not found")) + .getRef(); for (ObjectReferenceType roleRef : roles) { - AssignmentType assignmentType = new AssignmentType(); - RelationDefinitionType foundRelation = null; - for (RelationDefinitionType relationDefinitionType : relationDefinitions) { - if (prismContext.relationMatches(QNameUtil.uriToQName(relation, true), - relationDefinitionType.getRef())) { - foundRelation = relationDefinitionType; - break; - } - } - if(foundRelation == null) { - throw new IllegalArgumentException("Relation " + relation + " not found"); - } - roleRef.setRelation(foundRelation.getRef()); - assignmentType.setTargetRef(roleRef); - assignments.add(assignmentType); + assignmentsToAdd.add( + new AssignmentType(prismContext) + .targetRef(roleRef.clone() + .relation(matchingRelation))); } } if (resources != null) { for (ObjectReferenceType resourceRef : resources) { - AssignmentType assignmentType = new AssignmentType(); - ConstructionType constructionType = new ConstructionType(); - constructionType.setResourceRef(resourceRef); - assignmentType.setConstruction(constructionType); - assignments.add(assignmentType); + assignmentsToAdd.add( + new AssignmentType(prismContext) + .beginConstruction() + .resourceRef(resourceRef) // relation is ignored here + .end()); } } - ObjectDelta delta = prismContext.deltaFactory().object() - .createEmptyModifyDelta(objectType.getClass(), objectType.getOid()); - try { - delta.addModificationAddContainer(FocusType.F_ASSIGNMENT, assignments.toArray(new AssignmentType[0])); - } catch (SchemaException e) { - throw new ScriptExecutionException("Couldn't prepare modification to add resource/role assignments", e); - } - return delta; + return prismContext.deltaFor(object.getClass()) + .item(AssignmentHolderType.F_ASSIGNMENT) + .addRealValues(assignmentsToAdd) + .asObjectDelta(object.getOid()); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignmentOperationsExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignmentOperationsExecutor.java index 3f177e9a7d7..46870243902 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignmentOperationsExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignmentOperationsExecutor.java @@ -16,7 +16,6 @@ import com.evolveum.midpoint.prism.PrismObjectValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.constants.RelationTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.QNameUtil; @@ -28,15 +27,15 @@ import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.ObjectUtils; +import org.jetbrains.annotations.NotNull; import javax.annotation.PostConstruct; import javax.xml.namespace.QName; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; +import java.util.stream.Collectors; /** * @@ -45,11 +44,11 @@ public abstract class AssignmentOperationsExecutor extends BaseActionExecutor { private static final Trace LOGGER = TraceManager.getTrace(AssignmentOperationsExecutor.class); - protected static final String UNASSIGN_NAME = "unassign"; - protected static final String ASSIGN_NAME = "assign"; - protected static final String PARAM_RESOURCE = "resource"; - protected static final String PARAM_ROLE = "role"; - protected static final String PARAM_RELATION = "relation"; + static final String UNASSIGN_NAME = "unassign"; + static final String ASSIGN_NAME = "assign"; + private static final String PARAM_RESOURCE = "resource"; + private static final String PARAM_ROLE = "role"; + private static final String PARAM_RELATION = "relation"; @PostConstruct public void init() { @@ -66,7 +65,18 @@ public PipelineData execute(ActionExpressionType expression, PipelineData input, ActionParameterValueType resourceParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_RESOURCE, false, false, getName()); ActionParameterValueType roleParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_ROLE, false, false, getName()); - Collection relations = expressionHelper.getArgumentValues(expression.getParameter(), PARAM_RELATION, false, false, getName(), input, context, String.class, globalResult); + Collection relationSpecificationUris = expressionHelper.getArgumentValues(expression.getParameter(), PARAM_RELATION, false, false, getName(), input, context, String.class, globalResult); + + Collection relationSpecifications; + if (relationSpecificationUris.isEmpty()) { + QName defaultRelation = ObjectUtils.defaultIfNull(prismContext.getDefaultRelation(), RelationTypes.MEMBER.getRelation()); + relationSpecifications = Collections.singleton(defaultRelation); + } else { + relationSpecifications = relationSpecificationUris.stream() + .map(uri -> QNameUtil.uriToQName(uri, true)) + .collect(Collectors.toSet()); + } + assert !relationSpecifications.isEmpty(); Collection resources; try { @@ -114,13 +124,13 @@ public PipelineData execute(ActionExpressionType expression, PipelineData input, long started = operationsHelper.recordStart(context, objectType); Throwable exception = null; try { - operationsHelper.applyDelta(createDelta(objectType, resources, roles, relations), executionOptions, dryRun, context, result); + operationsHelper.applyDelta(createDelta(objectType, resources, roles, relationSpecifications), executionOptions, dryRun, context, result); operationsHelper.recordEnd(context, objectType, started, null); } catch (Throwable ex) { operationsHelper.recordEnd(context, objectType, started, ex); exception = processActionException(ex, getName(), value, context); } - context.println((exception != null ? "Attempted to modify " : "Modified ") + prismObject.toString() + optionsSuffix(executionOptions, dryRun) + exceptionSuffix(exception)); + context.println(createConsoleMessage(prismObject, executionOptions, dryRun, exception)); } else { //noinspection ThrowableNotThrown processActionException(new ScriptExecutionException("Item is not a PrismObject of AssignmentHolderType"), getName(), value, context); @@ -130,5 +140,13 @@ public PipelineData execute(ActionExpressionType expression, PipelineData input, return input; // TODO updated objects? } - protected abstract ObjectDelta createDelta(AssignmentHolderType object, Collection resources, Collection roles, Collection relations) throws ScriptExecutionException; + @NotNull + private String createConsoleMessage(PrismObject object, ModelExecuteOptions executionOptions, + boolean dryRun, Throwable exception) { + return (exception != null ? "Attempted to modify " : "Modified ") + object + + optionsSuffix(executionOptions, dryRun) + exceptionSuffix(exception); + } + + protected abstract ObjectDelta createDelta(AssignmentHolderType object, Collection resources, + Collection roles, Collection relationSpecifications) throws SchemaException; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/UnassignExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/UnassignExecutor.java index e81fbf8af4a..ad5c4cb42d3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/UnassignExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/UnassignExecutor.java @@ -7,36 +7,20 @@ package com.evolveum.midpoint.model.impl.scripting.actions; -import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.api.PipelineItem; -import com.evolveum.midpoint.model.api.ScriptExecutionException; -import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; -import com.evolveum.midpoint.model.impl.scripting.PipelineData; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.CommonException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.xml.namespace.QName; - import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; +import javax.xml.namespace.QName; + +import org.springframework.stereotype.Component; + +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; /** * @@ -44,115 +28,27 @@ @Component public class UnassignExecutor extends AssignmentOperationsExecutor { - private static final Trace LOGGER = TraceManager.getTrace(UnassignExecutor.class); - -// private static final String NAME = "unassign"; -// private static final String PARAM_RESOURCE = "resource"; -// private static final String PARAM_ROLE = "role"; -// private static final String PARAM_RELATION = "relation"; - -// @PostConstruct -// public void init() { -// scriptingExpressionEvaluator.registerActionExecutor(NAME, this); -// } - -// @Override -// public PipelineData execute(ActionExpressionType expression, PipelineData input, ExecutionContext context, OperationResult globalResult) throws ScriptExecutionException { -// -// ModelExecuteOptions executionOptions = getOptions(expression, input, context, globalResult); -// boolean dryRun = getParamDryRun(expression, input, context, globalResult); -// -// ActionParameterValueType resourceParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_RESOURCE, false, false, NAME); -// ActionParameterValueType roleParameterValue = expressionHelper.getArgument(expression.getParameter(), PARAM_ROLE, false, false, NAME); -// Collection relations = expressionHelper.getArgumentValues(expression.getParameter(), PARAM_RELATION, false, false, NAME, input, context, String.class, globalResult); -// -// Collection resources; -// try { -// if (resourceParameterValue != null) { -// PipelineData data = expressionHelper -// .evaluateParameter(resourceParameterValue, null, input, context, globalResult); -// resources = data.getDataAsReferences(ResourceType.COMPLEX_TYPE, ResourceType.class, context, globalResult); -// } else { -// resources = null; -// } -// } catch (CommonException e) { -// throw new ScriptExecutionException("Couldn't evaluate '" + PARAM_RESOURCE + "' parameter of a scripting expression: " + e.getMessage(), e); -// } -// -// Collection roles; -// try { -// if (roleParameterValue != null) { -// PipelineData data = expressionHelper.evaluateParameter(roleParameterValue, null, input, context, globalResult); -// roles = data.getDataAsReferences(RoleType.COMPLEX_TYPE, AbstractRoleType.class, context, globalResult); // if somebody wants to assign Org, he has to use full reference value (including object type) -// } else { -// roles = null; -// } -// } catch (CommonException e) { -// throw new ScriptExecutionException("Couldn't evaluate '" + PARAM_ROLE + "' parameter of a scripting expression: " + e.getMessage(), e); -// } -// -// if (resources == null && roles == null) { -// throw new ScriptExecutionException("Nothing to assign: neither resource nor role specified"); -// } -// -// if (CollectionUtils.isEmpty(resources) && CollectionUtils.isEmpty(roles)) { -// LOGGER.warn("No resources and no roles to unassign in a scripting expression"); -// context.println("Warning: no resources and no roles to unassign"); // TODO some better handling? -// return input; -// } -// -// for (PipelineItem item : input.getData()) { -// PrismValue value = item.getValue(); -// OperationResult result = operationsHelper.createActionResult(item, this, context, globalResult); -// context.checkTaskStop(); -// if (value instanceof PrismObjectValue && ((PrismObjectValue) value).asObjectable() instanceof AssignmentHolderType) { -// @SuppressWarnings({"unchecked", "raw"}) -// PrismObject prismObject = ((PrismObjectValue) value).asPrismObject(); -// AssignmentHolderType objectType = (AssignmentHolderType) prismObject.asObjectable(); -// long started = operationsHelper.recordStart(context, objectType); -// Throwable exception = null; -// try { -// operationsHelper.applyDelta(createDelta(objectType, resources, roles, relations), executionOptions, dryRun, context, result); -// operationsHelper.recordEnd(context, objectType, started, null); -// } catch (Throwable ex) { -// operationsHelper.recordEnd(context, objectType, started, ex); -// exception = processActionException(ex, NAME, value, context); -// } -// context.println((exception != null ? "Attempted to modify " : "Modified ") + prismObject.toString() + optionsSuffix(executionOptions, dryRun) + exceptionSuffix(exception)); -// } else { -// //noinspection ThrowableNotThrown -// processActionException(new ScriptExecutionException("Item is not a PrismObject of AssignmentHolderType"), NAME, value, context); -// } -// operationsHelper.trimAndCloneResult(result, globalResult, context); -// } -// return input; // TODO updated objects? -// } - @Override protected String getName() { return AssignmentOperationsExecutor.UNASSIGN_NAME; } @Override - protected ObjectDelta createDelta(AssignmentHolderType object, Collection resources, Collection roles, Collection relations) throws ScriptExecutionException { - if (relations == null || relations.isEmpty()) { - QName defaultRelation = prismContext.getDefaultRelation() != null ? - prismContext.getDefaultRelation() : RelationTypes.MEMBER.getRelation(); - relations = Collections.singletonList(QNameUtil.qNameToUri(defaultRelation)); - } - List assignmentsForDelete = new ArrayList<>(); + protected ObjectDelta createDelta(AssignmentHolderType object, Collection resources, + Collection roles, Collection relationSpecifications) throws SchemaException { + + List assignmentsToDelete = new ArrayList<>(); - List oldAssignments = object.getAssignment(); - for (AssignmentType oldAssignment : oldAssignments) { + for (AssignmentType oldAssignment : object.getAssignment()) { ObjectReferenceType targetRef = oldAssignment.getTargetRef(); if (targetRef != null) { if (roles != null) { outerloop: for (ObjectReferenceType roleRef : roles) { if (targetRef.getOid() != null && targetRef.getOid().equals(roleRef.getOid())) { - for (String relationQuery : relations) { - if (prismContext.relationMatches(QNameUtil.uriToQName(relationQuery, true), targetRef.getRelation())) { - assignmentsForDelete.add(oldAssignment.clone()); + for (QName relationSpecification : relationSpecifications) { + if (prismContext.relationMatches(relationSpecification, targetRef.getRelation())) { + assignmentsToDelete.add(oldAssignment.clone()); break outerloop; } } @@ -161,11 +57,11 @@ protected ObjectDelta createDelta(AssignmentHolderType obj } } else if (oldAssignment.getConstruction() != null) { if (resources != null) { - for (ObjectReferenceType resourceRef : resources) { - if (oldAssignment.getConstruction().getResourceRef() != null && - oldAssignment.getConstruction().getResourceRef().getOid() != null && - oldAssignment.getConstruction().getResourceRef().getOid().equals(resourceRef.getOid())) { - assignmentsForDelete.add(oldAssignment.clone()); + for (ObjectReferenceType resourceRefToUnassign : resources) { + ObjectReferenceType oldResourceRef = oldAssignment.getConstruction().getResourceRef(); + if (oldResourceRef != null && oldResourceRef.getOid() != null && + oldResourceRef.getOid().equals(resourceRefToUnassign.getOid())) { + assignmentsToDelete.add(oldAssignment.clone()); break; } } @@ -173,16 +69,9 @@ protected ObjectDelta createDelta(AssignmentHolderType obj } } - ObjectDelta delta; - - try { - delta = prismContext.deltaFor(object.getClass()) - .item(ItemPath.create(AssignmentHolderType.F_ASSIGNMENT)) - .deleteRealValues(assignmentsForDelete) - .asObjectDelta(object.getOid()); - } catch (SchemaException e) { - throw new ScriptExecutionException("Couldn't prepare modification to delete resource/role assignments", e); - } - return delta; + return prismContext.deltaFor(object.getClass()) + .item(ItemPath.create(AssignmentHolderType.F_ASSIGNMENT)) + .deleteRealValues(assignmentsToDelete) + .asObjectDelta(object.getOid()); } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index bb1ab8b053f..8dc4cd7d194 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -36,7 +36,6 @@ import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.crypto.EncryptionException; -import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemName; @@ -58,16 +57,13 @@ import com.evolveum.midpoint.xml.ns._public.model.scripting_3.*; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -/** - * @author mederly - */ @ContextConfiguration(locations = { "classpath:ctx-model-intest-test-main.xml" }) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestScriptingBasic extends AbstractInitializedModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/scripting"); - public static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); + private static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); private static final File LOG_FILE = new File(TEST_DIR, "log.xml"); private static final File SEARCH_FOR_USERS_FILE = new File(TEST_DIR, "search-for-users.xml"); @@ -182,7 +178,7 @@ public void test112Echo() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - ExecuteScriptType executeScript = parseRealValue(ECHO_FILE); + ExecuteScriptType executeScript = parseExecuteScript(ECHO_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(executeScript, VariablesMap.emptyMap(), false, task, result); @@ -201,14 +197,14 @@ public void test120Log() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty logAction = parseAnyData(LOG_FILE); + ScriptingExpressionType logAction = parseScriptingExpression(LOG_FILE); LogfileTestTailer tailer = new LogfileTestTailer(LoggingConfigurationManager.AUDIT_LOGGER_NAME); tailer.tail(); tailer.setExpecteMessage("Custom message:"); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(logAction.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(logAction, task, result); // THEN dumpOutput(output, result); @@ -219,12 +215,13 @@ public void test120Log() throws Exception { tailer.assertExpectedMessage(); } - private PrismProperty parseAnyData(File file) throws IOException, SchemaException { - return (PrismProperty) prismContext.parserFor(file).parseItem(); + private ScriptingExpressionType parseScriptingExpression(File file) throws IOException, SchemaException { + // we cannot specify explicit type parameter here, as the parsed files contain subtypes of ScriptingExpressionType + return prismContext.parserFor(file).parseRealValue(); } - private T parseRealValue(File file) throws IOException, SchemaException { - return prismContext.parserFor(file).parseRealValue(); + private ExecuteScriptType parseExecuteScript(File file) throws IOException, SchemaException { + return prismContext.parserFor(file).parseRealValue(ExecuteScriptType.class); } @Test @@ -232,10 +229,10 @@ public void test200SearchUser() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_USERS_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -264,7 +261,7 @@ public void test202SearchUserWithExpressions() throws Exception { assertEquals(2, output.getFinalOutput().getData().size()); assertEquals(new HashSet<>(Arrays.asList("administrator", "jack")), output.getFinalOutput().getData().stream() - .map(i -> ((PrismObjectValue) i.getValue()).getName().getOrig()) + .map(i -> ((PrismObjectValue) i.getValue()).getName().getOrig()) .collect(Collectors.toSet())); } @@ -273,10 +270,10 @@ public void test205SearchForResources() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_RESOURCES_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_RESOURCES_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -290,10 +287,10 @@ public void test206SearchForRoles() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_ROLES_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_ROLES_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -306,10 +303,10 @@ public void test210SearchForShadows() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_SHADOWS_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_SHADOWS_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -324,10 +321,10 @@ public void test215SearchForShadowsNoFetch() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_SHADOWS_NOFETCH_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -342,10 +339,10 @@ public void test220SearchForUsersAccounts() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_USERS_ACCOUNTS_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -360,10 +357,10 @@ public void test225SearchForUsersAccountsNoFetch() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -378,10 +375,10 @@ public void test300DisableJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(DISABLE_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(DISABLE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -397,10 +394,10 @@ public void test310EnableJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(ENABLE_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(ENABLE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -416,10 +413,10 @@ public void test320DeleteAndAddJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(DELETE_AND_ADD_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(DELETE_AND_ADD_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -435,10 +432,10 @@ public void test330ModifyJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(MODIFY_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(MODIFY_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -454,10 +451,10 @@ public void test340ModifyJackBack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(MODIFY_JACK_BACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(MODIFY_JACK_BACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -473,10 +470,10 @@ public void test350RecomputeJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(RECOMPUTE_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(RECOMPUTE_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -491,10 +488,10 @@ public void test360AssignToJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(ASSIGN_TO_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(ASSIGN_TO_JACK_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -512,12 +509,12 @@ public void test360AssignToJack() throws Exception { public void test370AssignToJackInBackground() throws Exception { // GIVEN OperationResult result = getTestOperationResult(); - PrismProperty expression = parseAnyData(ASSIGN_TO_JACK_2_FILE); + ScriptingExpressionType expression = parseScriptingExpression(ASSIGN_TO_JACK_2_FILE); // WHEN Task task = taskManager.createTaskInstance(); task.setOwner(getUser(USER_ADMINISTRATOR_OID)); - scriptingExpressionEvaluator.evaluateExpressionInBackground(expression.getAnyValue().getValue(), task, result); + scriptingExpressionEvaluator.evaluateExpressionInBackground(expression, task, result); waitForTaskFinish(task.getOid(), false); task.refresh(result); @@ -558,10 +555,10 @@ public void test390AssignToWill() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(ASSIGN_TO_WILL_FILE); + ScriptingExpressionType expression = parseScriptingExpression(ASSIGN_TO_WILL_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -578,10 +575,10 @@ public void test391UnassignFromWill() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(UNASSIGN_FROM_WILL_FILE); + ScriptingExpressionType expression = parseScriptingExpression(UNASSIGN_FROM_WILL_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -600,10 +597,10 @@ public void test392UnassignFromWill2() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(UNASSIGN_FROM_WILL_2_FILE); + ScriptingExpressionType expression = parseScriptingExpression(UNASSIGN_FROM_WILL_2_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -622,10 +619,10 @@ public void test393UnassignFromWill3() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(UNASSIGN_FROM_WILL_3_FILE); + ScriptingExpressionType expression = parseScriptingExpression(UNASSIGN_FROM_WILL_3_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -646,10 +643,10 @@ public void test394AssignToWill2() throws Exception { Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(ASSIGN_TO_WILL_2_FILE); + ScriptingExpressionType expression = parseScriptingExpression(ASSIGN_TO_WILL_2_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -666,10 +663,10 @@ public void test400PurgeSchema() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE); + ScriptingExpressionType expression = parseScriptingExpression(PURGE_DUMMY_BLACK_SCHEMA_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -687,10 +684,10 @@ public void test410TestResource() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(TEST_DUMMY_RESOURCE_FILE); + ScriptingExpressionType expression = parseScriptingExpression(TEST_DUMMY_RESOURCE_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -707,11 +704,11 @@ public void test420NotificationAboutJack() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(NOTIFICATION_ABOUT_JACK_FILE); + ScriptingExpressionType expression = parseScriptingExpression(NOTIFICATION_ABOUT_JACK_FILE); prepareNotifications(); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -732,11 +729,11 @@ public void test430NotificationAboutJackType2() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(NOTIFICATION_ABOUT_JACK_TYPE2_FILE); + ScriptingExpressionType expression = parseScriptingExpression(NOTIFICATION_ABOUT_JACK_TYPE2_FILE); prepareNotifications(); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -762,10 +759,10 @@ public void test500ScriptingUsers() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SCRIPTING_USERS_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SCRIPTING_USERS_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -776,8 +773,9 @@ public void test500ScriptingUsers() throws Exception { Set realOids = new HashSet<>(); for (PipelineItem item : data.getData()) { PrismValue value = item.getValue(); - PrismObject user = ((PrismObjectValue) value).asPrismObject(); - assertEquals("Description not set", "Test", user.asObjectable().getDescription()); + //noinspection unchecked + UserType user = ((PrismObjectValue) value).asObjectable(); + assertEquals("Description not set", "Test", user.getDescription()); realOids.add(user.getOid()); assertSuccess(item.getResult()); } @@ -869,7 +867,7 @@ public void test510GeneratePasswords() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(GENERATE_PASSWORDS_FILE); + ScriptingExpressionType expression = parseScriptingExpression(GENERATE_PASSWORDS_FILE); addObject(PASSWORD_POLICY_GLOBAL_FILE); @@ -881,7 +879,7 @@ public void test510GeneratePasswords() throws Exception { modifySystemObjectInRepo(SecurityPolicyType.class, SECURITY_POLICY_OID, itemDeltas, result); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -892,6 +890,7 @@ public void test510GeneratePasswords() throws Exception { Set realOids = new HashSet<>(); for (PipelineItem item : data.getData()) { PrismValue value = item.getValue(); + //noinspection unchecked UserType user = ((PrismObjectValue) value).asObjectable(); ProtectedStringType passwordValue = user.getCredentials().getPassword().getValue(); assertNotNull("clearValue for password not set", passwordValue.getClearValue()); @@ -907,7 +906,7 @@ public void test520GeneratePasswordsFullInput() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - ExecuteScriptType executeScript = parseRealValue(GENERATE_PASSWORDS_2_FILE); + ExecuteScriptType executeScript = parseExecuteScript(GENERATE_PASSWORDS_2_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(executeScript, VariablesMap.emptyMap(), false, task, result); @@ -930,7 +929,7 @@ public void test530GeneratePasswordsReally() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - ExecuteScriptType executeScript = parseRealValue(GENERATE_PASSWORDS_3_FILE); + ExecuteScriptType executeScript = parseExecuteScript(GENERATE_PASSWORDS_3_FILE); // WHEN ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(executeScript, VariablesMap.emptyMap(), false, task, result); @@ -969,10 +968,10 @@ public void test540SearchUserResolveNamesForRoleMembershipRef() throws Exception // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_RESOLVE_NAMES_FOR_ROLE_MEMBERSHIP_REF_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_USERS_RESOLVE_NAMES_FOR_ROLE_MEMBERSHIP_REF_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); @@ -982,8 +981,8 @@ public void test540SearchUserResolveNamesForRoleMembershipRef() throws Exception //assertEquals("administrator", ((PrismObject) output.getData().get(0)).asObjectable().getName().getOrig()); for (PipelineItem item : output.getFinalOutput().getData()) { - PrismAsserts.assertHasTargetName((PrismContainerValue) item.getValue(), UserType.F_ROLE_MEMBERSHIP_REF); - PrismAsserts.assertHasNoTargetName((PrismContainerValue) item.getValue(), UserType.F_LINK_REF); + PrismAsserts.assertHasTargetName((PrismContainerValue) item.getValue(), UserType.F_ROLE_MEMBERSHIP_REF); + PrismAsserts.assertHasNoTargetName((PrismContainerValue) item.getValue(), UserType.F_LINK_REF); } } @@ -992,21 +991,20 @@ public void test545SearchUserResolveRoleMembershipRef() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - PrismProperty expression = parseAnyData(SEARCH_FOR_USERS_RESOLVE_ROLE_MEMBERSHIP_REF_FILE); + ScriptingExpressionType expression = parseScriptingExpression(SEARCH_FOR_USERS_RESOLVE_ROLE_MEMBERSHIP_REF_FILE); // WHEN - ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), task, result); + ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression, task, result); // THEN dumpOutput(output, result); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals(2, output.getFinalOutput().getData().size()); - //assertEquals("administrator", ((PrismObject) output.getData().get(0)).asObjectable().getName().getOrig()); for (PipelineItem item : output.getFinalOutput().getData()) { - PrismAsserts.assertHasObject((PrismContainerValue) item.getValue(), UserType.F_ROLE_MEMBERSHIP_REF); - PrismAsserts.assertHasNoObject((PrismContainerValue) item.getValue(), UserType.F_LINK_REF); + PrismAsserts.assertHasObject((PrismContainerValue) item.getValue(), UserType.F_ROLE_MEMBERSHIP_REF); + PrismAsserts.assertHasNoObject((PrismContainerValue) item.getValue(), UserType.F_LINK_REF); } } @@ -1015,7 +1013,7 @@ public void test550UseVariables() throws Exception { // GIVEN Task task = getTestTask(); OperationResult result = task.getResult(); - ExecuteScriptType executeScript = parseRealValue(USE_VARIABLES_FILE); + ExecuteScriptType executeScript = parseExecuteScript(USE_VARIABLES_FILE); PrismContainer taskExtension = task.getOrCreateExtension(); taskExtension @@ -1130,7 +1128,7 @@ public void test575ResumeTask() throws Exception { assertEquals("Unexpected # of items in output", 1, output.getFinalOutput().getData().size()); PrismObject taskAfter = getObject(TaskType.class, taskToResume.getOid()); - assertTrue("Task is still suspended", taskAfter.asObjectable().getExecutionStatus() != TaskExecutionStatusType.SUSPENDED); + assertNotSame("Task is still suspended", taskAfter.asObjectable().getExecutionStatus(), TaskExecutionStatusType.SUSPENDED); } // MID-5359 @@ -1138,7 +1136,7 @@ public void test575ResumeTask() throws Exception { public void test600ModifyJackPasswordInBackground() throws Exception { // GIVEN OperationResult result = getTestOperationResult(); - PrismProperty expression = parseAnyData(MODIFY_JACK_PASSWORD_FILE); + ScriptingExpressionType expression = parseScriptingExpression(MODIFY_JACK_PASSWORD_FILE); prepareNotifications(); dummyAuditService.clear(); @@ -1146,7 +1144,7 @@ public void test600ModifyJackPasswordInBackground() throws Exception { // WHEN Task task = taskManager.createTaskInstance(); task.setOwner(getUser(USER_ADMINISTRATOR_OID)); - scriptingExpressionEvaluator.evaluateExpressionInBackground(expression.getAnyValue().getValue(), task, result); + scriptingExpressionEvaluator.evaluateExpressionInBackground(expression, task, result); waitForTaskFinish(task.getOid(), false); task.refresh(result); @@ -1246,6 +1244,7 @@ private void assertNoOutputData(ExecutionContext output) { assertTrue("Script returned unexpected data", output.getFinalOutput() == null || output.getFinalOutput().getData().isEmpty()); } + @SuppressWarnings("SameParameterValue") private void assertOutputData(ExecutionContext output, int size, OperationResultStatus status) { assertEquals("Wrong # of output items", size, output.getFinalOutput().getData().size()); for (PipelineItem item : output.getFinalOutput().getData()) { @@ -1258,6 +1257,7 @@ private void assertOutputData(ExecutionContext output, int size, OperationResult private void assertAttributesNotFetched(List data) { for (PipelineItem item : data) { PrismValue value = item.getValue(); + //noinspection unchecked if (((PrismObjectValue) value).asObjectable().getAttributes().getAny().size() > 2) { throw new AssertionError("There are some unexpected attributes present in " + value.debugDump()); } @@ -1267,6 +1267,7 @@ private void assertAttributesNotFetched(List data) { private void assertAttributesFetched(List data) { for (PipelineItem item : data) { PrismValue value = item.getValue(); + //noinspection unchecked if (((PrismObjectValue) value).asObjectable().getAttributes().getAny().size() <= 2) { throw new AssertionError("There are no attributes present in " + value.debugDump()); }