diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index 9fdb271b608..5d621a44011 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -331,18 +331,8 @@ private ResourceType resolveTarget(String sourceDescription, Task task, Operatio if (assignmentPathVariables == null) { assignmentPathVariables = LensUtil.computeAssignmentPathVariables(assignmentPath); } - - if (assignmentPathVariables != null) { - variables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ROLE, - assignmentPathVariables.getImmediateRole()); - variables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ASSIGNMENT, - assignmentPathVariables.getImmediateAssignment()); - variables.addVariableDefinition(ExpressionConstants.VAR_THIS_ASSIGNMENT, - assignmentPathVariables.getThisAssignment()); - variables.addVariableDefinition(ExpressionConstants.VAR_FOCUS_ASSIGNMENT, - assignmentPathVariables.getFocusAssignment()); - } - LOGGER.info("Expression valriables for filter evaluation: {}", variables); + Utils.addAssignmentPathVariables(assignmentPathVariables, variables); + LOGGER.info("Expression variables for filter evaluation: {}", variables); ObjectFilter origFilter = QueryConvertor.parseFilter(constructionType.getResourceRef().getFilter(), ResourceType.class, prismContext); @@ -358,27 +348,21 @@ private ResourceType resolveTarget(String sourceDescription, Task task, Operatio } final Collection> results = new ArrayList<>(); - ResultHandler handler = new ResultHandler() { - - @Override - public boolean handle(PrismObject object, OperationResult parentResult) { - LOGGER.info("Found object {}", object); - return results.add(object); - } + ResultHandler handler = (object, parentResult) -> { + LOGGER.info("Found object {}", object); + return results.add(object); }; objectResolver.searchIterative(ResourceType.class, ObjectQuery.createObjectQuery(evaluatedFilter), null, handler, task, result); if (org.apache.commons.collections.CollectionUtils.isEmpty(results)) { - throw new IllegalArgumentException("Got null target from repository, filter:" + evaluatedFilter - + ", class:" + ResourceType.class + " (should not happen, probably a bug) in " - + sourceDescription); + throw new IllegalArgumentException("Got no target from repository, filter:" + evaluatedFilter + + ", class:" + ResourceType.class + " in " + sourceDescription); } if (results.size() > 1) { throw new IllegalArgumentException("Got more than one target from repository, filter:" - + evaluatedFilter + ", class:" + ResourceType.class - + " (should not happen, probably a bug) in " + sourceDescription); + + evaluatedFilter + ", class:" + ResourceType.class + " in " + sourceDescription); } PrismObject target = results.iterator().next(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 3b7ce49d567..3d3964c55e4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRuleTrigger; import com.evolveum.midpoint.model.common.expression.*; +import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; @@ -975,19 +976,9 @@ private static void mergeExtension(PrismContainer magicExtension, } public static Mapping.Builder addAssignmentPathVariables(Mapping.Builder builder, AssignmentPathVariables assignmentPathVariables) { - if (assignmentPathVariables != null ) { - return builder - .addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT_PATH, assignmentPathVariables.getAssignmentPath()) - .addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT, assignmentPathVariables.getMagicAssignment()) - .addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ASSIGNMENT, assignmentPathVariables.getImmediateAssignment()) - .addVariableDefinition(ExpressionConstants.VAR_THIS_ASSIGNMENT, assignmentPathVariables.getThisAssignment()) - .addVariableDefinition(ExpressionConstants.VAR_FOCUS_ASSIGNMENT, assignmentPathVariables.getFocusAssignment()) - .addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ROLE, assignmentPathVariables.getImmediateRole()); - } else { - // to avoid "no such variable" exceptions in boundary cases - // for null/empty paths we might consider creating empty AssignmentPathVariables objects to keep null/empty path distinction - return builder.addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT_PATH, (Object) null); - } + ExpressionVariables expressionVariables = new ExpressionVariables(); + Utils.addAssignmentPathVariables(assignmentPathVariables, expressionVariables); + return builder.addVariableDefinitions(expressionVariables.getMap()); } public static void checkContextSanity(LensContext context, String activityDescription, diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index 55347364e37..acea98e6fe0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -570,11 +570,18 @@ public static void addDefaultExpressionVariables(Expressi } public static void addAssignmentPathVariables(AssignmentPathVariables assignmentPathVariables, ExpressionVariables expressionVariables) { - expressionVariables.addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT, assignmentPathVariables.getMagicAssignment()); - expressionVariables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ASSIGNMENT, assignmentPathVariables.getImmediateAssignment()); - expressionVariables.addVariableDefinition(ExpressionConstants.VAR_THIS_ASSIGNMENT, assignmentPathVariables.getThisAssignment()); - expressionVariables.addVariableDefinition(ExpressionConstants.VAR_FOCUS_ASSIGNMENT, assignmentPathVariables.getFocusAssignment()); - expressionVariables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ROLE, assignmentPathVariables.getImmediateRole()); + if (assignmentPathVariables != null) { + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT, assignmentPathVariables.getMagicAssignment()); + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT_PATH, assignmentPathVariables.getAssignmentPath()); + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ASSIGNMENT, assignmentPathVariables.getImmediateAssignment()); + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_THIS_ASSIGNMENT, assignmentPathVariables.getThisAssignment()); + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_FOCUS_ASSIGNMENT, assignmentPathVariables.getFocusAssignment()); + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_IMMEDIATE_ROLE, assignmentPathVariables.getImmediateRole()); + } else { + // to avoid "no such variable" exceptions in boundary cases + // for null/empty paths we might consider creating empty AssignmentPathVariables objects to keep null/empty path distinction + expressionVariables.addVariableDefinition(ExpressionConstants.VAR_ASSIGNMENT_PATH, null); + } } public static String getPolicyDesc(ObjectSynchronizationType synchronizationPolicy) { diff --git a/model/model-impl/src/test/resources/lens/role-corp-contractor.xml b/model/model-impl/src/test/resources/lens/role-corp-contractor.xml index 7747afb9d69..e3e87ad09f8 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-contractor.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-contractor.xml @@ -25,9 +25,6 @@ xmlns:ext="http://midpoint.evolveum.com/xml/ns/samples/piracy" - - - diff --git a/model/model-impl/src/test/resources/lens/role-corp-employee.xml b/model/model-impl/src/test/resources/lens/role-corp-employee.xml index 0a1e075796a..80c4243b6eb 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-employee.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-employee.xml @@ -25,9 +25,6 @@ - - - diff --git a/model/model-impl/src/test/resources/lens/role-corp-engineer.xml b/model/model-impl/src/test/resources/lens/role-corp-engineer.xml index c17f6ccc809..2ee93e6404c 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-engineer.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-engineer.xml @@ -26,9 +26,6 @@ xmlns:ext="http://midpoint.evolveum.com/xml/ns/samples/piracy" - - - diff --git a/model/model-impl/src/test/resources/lens/role-corp-generic-metarole-dynamic.xml b/model/model-impl/src/test/resources/lens/role-corp-generic-metarole-dynamic.xml index 9562ece5a70..95a43808c9e 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-generic-metarole-dynamic.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-generic-metarole-dynamic.xml @@ -51,7 +51,10 @@ metaroles: name - $immediateRole/extension/ext:resourceName + $assignment/extension/ext:resourceName + diff --git a/model/model-impl/src/test/resources/lens/role-corp-generic-metarole.xml b/model/model-impl/src/test/resources/lens/role-corp-generic-metarole.xml index d46907ed508..cdca3f97d9b 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-generic-metarole.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-generic-metarole.xml @@ -35,6 +35,14 @@ metaroles: - Generic Metarole: assigned to Visitor and Customer - Job Metarole (induces Generic Metarole): assigned to Contractor, Employee, Engineer, Manager + Job Metarole ========[I]===========> Generic Metarole + ^^ ^ ^ ^ + || | | | + +=========|| | | | + | | +=======|==+===[I]====+ | | + | | | | | | | | + | | | | | V | | + Contractor Engineer Manager Employee Visitor Customer --> Job Metarole Dynamic Metarole for all job roles - - - + + - - + diff --git a/model/model-impl/src/test/resources/lens/role-corp-job-metarole.xml b/model/model-impl/src/test/resources/lens/role-corp-job-metarole.xml index 88d18ba8c3c..6c5caf89852 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-job-metarole.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-job-metarole.xml @@ -19,13 +19,11 @@ xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"> Job Metarole Metarole for all job roles - - - + + - - + diff --git a/model/model-impl/src/test/resources/lens/role-corp-manager.xml b/model/model-impl/src/test/resources/lens/role-corp-manager.xml index 34235935ac5..cdcc12af6a7 100644 --- a/model/model-impl/src/test/resources/lens/role-corp-manager.xml +++ b/model/model-impl/src/test/resources/lens/role-corp-manager.xml @@ -26,9 +26,6 @@ - - -