diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/delta/ItemDeltaUtil.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/delta/ItemDeltaUtil.java index 3faa2c37b77..1dce158d629 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/delta/ItemDeltaUtil.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/delta/ItemDeltaUtil.java @@ -33,13 +33,13 @@ public static PrismValueDeltaS ItemDelta delta, PrismContext prismContext) throws SchemaException { if (item == null && delta == null) { return null; - } - if (delta == null) { + } else if (delta == null) { PrismValueDeltaSetTriple triple = prismContext.deltaFactory().createPrismValueDeltaSetTriple(); triple.addAllToZeroSet(PrismValueCollectionsUtil.cloneCollection(item.getValues())); return triple; + } else { + return delta.toDeltaSetTriple(item); } - return delta.toDeltaSetTriple(item); } // TODO move to Item diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluator.java index 62463348d9a..69080b15b26 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ConstExpressionEvaluator.java @@ -17,10 +17,7 @@ import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; import com.evolveum.midpoint.repo.common.expression.evaluator.AbstractExpressionEvaluator; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstExpressionEvaluatorType; import org.jetbrains.annotations.NotNull; @@ -44,7 +41,8 @@ public class ConstExpressionEvaluator evaluate(ExpressionEvaluationContext context, OperationResult result) - throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException { + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException, + CommunicationException, ConfigurationException { checkEvaluatorProfile(context); String constName = expressionEvaluatorBean.getValue(); @@ -62,7 +60,9 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, "Can only provide values of property, not " + output.getClass()); } - return ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); + PrismValueDeltaSetTriple outputTriple = ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); + applyValueMetadata(outputTriple, context, result); + return outputTriple; } @Override diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluator.java index 3f936754e52..19f7740aca6 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluator.java @@ -74,7 +74,9 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, String stringValue = generateStringValue(valuePolicy, context, outputPath, result); addValueToOutputProperty(output, stringValue); - return ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); + PrismValueDeltaSetTriple outputTriple = ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); + applyValueMetadata(outputTriple, context, result); + return outputTriple; } @NotNull diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluator.java index 4b6d3d6d964..53b1a5c81bd 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluator.java @@ -9,11 +9,11 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ItemDeltaUtil; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.repo.common.expression.evaluator.AbstractExpressionEvaluator; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -27,23 +27,18 @@ * @author skublik */ public class ProportionalExpressionEvaluator - implements ExpressionEvaluator { + extends AbstractExpressionEvaluator { - private final ProportionalExpressionEvaluatorType proportionalEvaluatorType; - private final D outputDefinition; - private final PrismContext prismContext; - - ProportionalExpressionEvaluator(ProportionalExpressionEvaluatorType proportionalEvaluatorType, D outputDefinition, PrismContext prismContext) { - this.proportionalEvaluatorType = proportionalEvaluatorType; - this.outputDefinition = outputDefinition; - this.prismContext = prismContext; + ProportionalExpressionEvaluator(QName elementName, ProportionalExpressionEvaluatorType proportionalEvaluatorBean, + D outputDefinition, Protector protector, PrismContext prismContext) { + super(elementName, proportionalEvaluatorBean, outputDefinition, protector, prismContext); } @Override public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { - ProportionalStyleType style = proportionalEvaluatorType.getStyle(); + ProportionalStyleType style = expressionEvaluatorBean.getStyle(); IntegerStatType integerStatType = context.getVariables().getValue(ExpressionConstants.VAR_INPUT, IntegerStatType.class); if(integerStatType == null) { @@ -111,11 +106,6 @@ private void validateInputNumbers(Integer totalItems, Integer actualItems, Propo @Override public String shortDebugDump() { - return "const:"+proportionalEvaluatorType.getStyle(); - } - - @Override - public QName getElementName() { - return SchemaConstantsGenerated.C_PROPORTIONAL; + return "const:"+expressionEvaluatorBean.getStyle(); } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluatorFactory.java index 03df2c25932..aa36b1a2520 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ProportionalExpressionEvaluatorFactory.java @@ -11,6 +11,7 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +36,7 @@ public class ProportionalExpressionEvaluatorFactory extends AbstractAutowiredExpressionEvaluatorFactory { @Autowired private PrismContext prismContext; + @Autowired private Protector protector; @Override public QName getElementName() { @@ -49,6 +51,6 @@ public ExpressionEvaluator cr ProportionalExpressionEvaluatorType evaluatorBean = getSingleEvaluatorBeanRequired(evaluatorElements, ProportionalExpressionEvaluatorType.class, contextDescription); - return new ProportionalExpressionEvaluator<>(evaluatorBean, outputDefinition, prismContext); + return new ProportionalExpressionEvaluator<>(getElementName(), evaluatorBean, outputDefinition, protector, prismContext); } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluation.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluation.java index e7d7f76bed8..7c359fa51c4 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluation.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluation.java @@ -13,10 +13,9 @@ import com.evolveum.midpoint.prism.util.DefinitionResolver; import com.evolveum.midpoint.prism.util.ItemDeltaItem; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.evaluator.ExpressionEvaluatorUtil; import com.evolveum.midpoint.schema.expression.TypedValue; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.exception.*; import org.jetbrains.annotations.Nullable; @@ -44,15 +43,16 @@ class PathExpressionEvaluation { this.context = context; } - PrismValueDeltaSetTriple evaluate() throws ExpressionEvaluationException, SchemaException { - pathToResolve = evaluator.path; + PrismValueDeltaSetTriple evaluate(OperationResult result) throws ExpressionEvaluationException, SchemaException, + ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { + pathToResolve = evaluator.getPath(); resolutionContext = determineInitialResolveContext(); if (resolutionContext == null) { return null; } stepAlongResolvePath(); - return prepareOutputTriple(); + return prepareOutputTriple(result); } private ResolutionContext determineInitialResolveContext() throws ExpressionEvaluationException { @@ -75,7 +75,7 @@ private ResolutionContext getInitialResolveContextFromVariable() throws Expressi String variableName = ItemPath.toVariableName(pathToResolve.first()).getLocalPart(); pathToResolve = pathToResolve.rest(); - TypedValue variableValueAndDefinition = ExpressionEvaluatorUtil.findInSourcesAndVariables(context, variableName); + TypedValue variableValueAndDefinition = evaluator.findInSourcesAndVariables(context, variableName); if (variableValueAndDefinition == null) { throw new ExpressionEvaluationException("No variable with name "+variableName+" in "+ context.getContextDescription()); } @@ -93,14 +93,12 @@ private ResolutionContext getInitialResolveContextFromVariable() throws Expressi } @Nullable - private PrismValueDeltaSetTriple prepareOutputTriple() throws SchemaException { - PrismValueDeltaSetTriple outputTriple = resolutionContext.createOutputTriple(evaluator.prismContext); - if (outputTriple == null) { - return null; - } else { - return ExpressionEvaluatorUtil.toOutputTriple(outputTriple, evaluator.outputDefinition, - context.getAdditionalConvertor(), null, evaluator.protector, evaluator.prismContext); - } + private PrismValueDeltaSetTriple prepareOutputTriple(OperationResult result) throws SchemaException, + ConfigurationException, ObjectNotFoundException, CommunicationException, SecurityViolationException, + ExpressionEvaluationException { + PrismValueDeltaSetTriple outputTriple = resolutionContext.createOutputTriple(evaluator.getPrismContext()); + evaluator.applyValueMetadata(outputTriple, context, result); + return evaluator.finishOutputTriple(outputTriple, context.getAdditionalConvertor(), null); } private void stepAlongResolvePath() throws SchemaException, ExpressionEvaluationException { @@ -113,7 +111,7 @@ private void stepAlongResolvePath() throws SchemaException, ExpressionEvaluation // Those may not have a definition. In that case just assume strings. // In fact, this is a HACK. All such schemas should have a definition. // Otherwise there may be problems with parameter types for caching compiles scripts and so on. - return evaluator.prismContext.definitionFactory().createPropertyDefinition(path.firstName(), PrimitiveType.STRING.getQname()); + return evaluator.getPrismContext().definitionFactory().createPropertyDefinition(path.firstName(), PrimitiveType.STRING.getQname()); } else { return null; } @@ -128,13 +126,13 @@ private void stepAlongResolvePath() throws SchemaException, ExpressionEvaluation } if (resolutionContext == null) { - throw new ExpressionEvaluationException("Cannot find item using path "+evaluator.path+" in "+ + throw new ExpressionEvaluationException("Cannot find item using path "+evaluator.getPath()+" in "+ context.getContextDescription()); } } else if (resolutionContext.isStructuredProperty()) { resolutionContext = resolutionContext.resolveStructuredProperty(pathToResolve, - (PrismPropertyDefinition) evaluator.outputDefinition, evaluator.prismContext); + (PrismPropertyDefinition) evaluator.getOutputDefinition(), evaluator.getPrismContext()); pathToResolve = ItemPath.EMPTY_PATH; } else if (resolutionContext.isNull()) { diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluator.java index 1f85099bf7e..52ae11a634c 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluator.java @@ -15,51 +15,41 @@ import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; +import com.evolveum.midpoint.repo.common.expression.evaluator.AbstractExpressionEvaluator; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; /** * Returns value set triple derived from specified (or default) source by resolving specified path. * * @author Radovan Semancik */ -public class PathExpressionEvaluator implements ExpressionEvaluator { +public class PathExpressionEvaluator + extends AbstractExpressionEvaluator { - private final QName elementName; - final ItemPath path; - final PrismContext prismContext; - final D outputDefinition; - final Protector protector; - - PathExpressionEvaluator(QName elementName, ItemPath path, D outputDefinition, Protector protector, + PathExpressionEvaluator(QName elementName, ItemPathType path, D outputDefinition, Protector protector, PrismContext prismContext) { - this.elementName = elementName; - this.path = path; - this.outputDefinition = outputDefinition; - this.prismContext = prismContext; - this.protector = protector; - } - - @Override - public QName getElementName() { - return elementName; + super(elementName, path, outputDefinition, protector, prismContext); } @Override public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, OperationResult result) - throws SchemaException, ExpressionEvaluationException, SecurityViolationException { + throws SchemaException, ExpressionEvaluationException, SecurityViolationException, + ConfigurationException, ObjectNotFoundException, CommunicationException { ExpressionUtil.checkEvaluatorProfileSimple(this, context); return new PathExpressionEvaluation<>(this, context) - .evaluate(); + .evaluate(result); + } + + public ItemPath getPath() { + return expressionEvaluatorBean.getItemPath(); } @Override public String shortDebugDump() { - return "path: "+path; + return "path: " + getPath(); } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluatorFactory.java index 3e3433a8940..e476cca4027 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/path/PathExpressionEvaluatorFactory.java @@ -66,6 +66,6 @@ public ExpressionEvaluator c ItemPathType path = Objects.requireNonNull( getSingleEvaluatorBean(evaluatorElements, ItemPathType.class, contextDescription), () -> "missing path specification in " + contextDescription); - return new PathExpressionEvaluator<>(ELEMENT_NAME, path.getItemPath(), outputDefinition, protector, prismContext); + return new PathExpressionEvaluator<>(ELEMENT_NAME, path, outputDefinition, protector, prismContext); } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java index 7712984d25f..fcb53a12b41 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionReturnTypeType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Executes specified script written e.g. in Groovy, JavaScript, Python, etc. Velocity template language is supported as well. @@ -60,22 +61,29 @@ protected void checkEvaluatorProfile(ExpressionEvaluationContext context) { protected List transformSingleValue(ExpressionVariables variables, PlusMinusZero valueDestination, boolean useNew, ExpressionEvaluationContext eCtx, String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { - ScriptExpressionReturnTypeType returnType = expressionEvaluatorBean.getReturnType(); - if (returnType == null && isRelative()) { - returnType = ScriptExpressionReturnTypeType.SCALAR; - } scriptExpression.setAdditionalConvertor(eCtx.getAdditionalConvertor()); ScriptExpressionEvaluationContext sCtx = new ScriptExpressionEvaluationContext(); sCtx.setVariables(variables); - sCtx.setSuggestedReturnType(returnType); + sCtx.setSuggestedReturnType(getReturnType()); sCtx.setEvaluateNew(useNew); sCtx.setContextDescription(contextDescription); sCtx.setAdditionalConvertor(eCtx.getAdditionalConvertor()); sCtx.setTask(task); sCtx.setResult(result); - //noinspection unchecked - return (List) scriptExpression.evaluate(sCtx); + return scriptExpression.evaluate(sCtx); + } + + @Nullable + private ScriptExpressionReturnTypeType getReturnType() { + ScriptExpressionReturnTypeType explicitReturnType = expressionEvaluatorBean.getReturnType(); + if (explicitReturnType != null) { + return explicitReturnType; + } else if (isRelative()) { + return ScriptExpressionReturnTypeType.SCALAR; + } else { + return null; + } } @Override diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java index 90331829f44..c1c1221dcf4 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/AbstractMappingImpl.java @@ -1382,12 +1382,12 @@ void traceTimeTo(XMLGregorianCalendar timeTo) { } } - // TEMPORARY - List getMetadataMappings() { - return mappingBean instanceof MappingType ? - ((MappingType) mappingBean).getMetadataMapping() : null; - } - +// // TEMPORARY +// List getMetadataMappings() { +// return mappingBean instanceof MappingType ? +// ((MappingType) mappingBean).getMetadataMapping() : null; +// } +// @NotNull public ModelCommonBeans getBeans() { return beans; diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingMetadata.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingMetadata.java index cdac33b1bd6..1b356f69f5a 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingMetadata.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/mapping/TestMappingMetadata.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.evolveum.midpoint.model.common.expression.ExpressionTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import org.jetbrains.annotations.NotNull; @@ -56,6 +57,11 @@ public class TestMappingMetadata extends AbstractModelCommonTest { private static final String MAPPING_SCRIPT_FULLNAME_METADATA_XML = "mapping-script-fullname-metadata.xml"; + private static final String MAPPING_ASIS_FULLNAME_METADATA_XML = "mapping-asis-fullname-metadata.xml"; + private static final String MAPPING_PATH_FULLNAME_METADATA_XML = "mapping-path-fullname-metadata.xml"; + private static final String MAPPING_CONST_FULLNAME_METADATA_XML = "mapping-const-fullname-metadata.xml"; + private static final String MAPPING_GENERATE_FULLNAME_METADATA_XML = "mapping-generate-fullname-metadata.xml"; + private static final String MAPPING_VALUE_FULLNAME_METADATA_XML = "mapping-value-fullname-metadata.xml"; private MappingTestEvaluator evaluator; private static final TestResource TEMPLATE_PROVENANCE = new TestResource<>(TEST_DIR, "template-provenance.xml", "0ca5cef4-6df3-42c3-82b6-daae691e960d"); @@ -84,7 +90,8 @@ public void setupFactory() throws SAXException, IOException, SchemaException { @Test public void testUserAdd() throws Exception { PrismObject user = evaluator.getUserOld(); - MappingImpl, PrismPropertyDefinition> mapping = evaluate(MAPPING_SCRIPT_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_SCRIPT_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); displayDumpable("output triple", outputTriple); @@ -478,6 +485,124 @@ public void testReplaceJackieHrReplaceSparrowHr() throws Exception { assertNoMetadata(MiscUtil.extractSingleton(outputTriple.getMinusSet())); } + /** + * Now testing asIs evaluator (givenName -> fullName) + * + * Jack has acquisition origins: user, rest + * + * Delta: ADD object + * + * Expected result: user, rest (in plus set) + * + */ + @Test + public void testAsIsUserAdd() throws Exception { + PrismObject user = evaluator.getUserOld(); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_ASIS_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + + PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); + displayDumpable("output triple", outputTriple); + PrismAsserts.assertTripleNoZero(outputTriple); + PrismAsserts.assertTriplePlus(outputTriple, PrismTestUtil.createPolyString("Jack")); + PrismAsserts.assertTripleNoMinus(outputTriple); + + assertOrigins(MiscUtil.extractSingleton(outputTriple.getPlusSet()), "user", "rest"); + } + + /** + * Now testing path evaluator ($user/givenName -> fullName) + * + * Jack has acquisition origins: user, rest + * + * Delta: ADD object + * + * Expected result: user, rest (in plus set) + * + */ + @Test + public void testPathUserAdd() throws Exception { + PrismObject user = evaluator.getUserOld(); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_PATH_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + + PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); + displayDumpable("output triple", outputTriple); + PrismAsserts.assertTripleNoZero(outputTriple); + PrismAsserts.assertTriplePlus(outputTriple, PrismTestUtil.createPolyString("Jack")); + PrismAsserts.assertTripleNoMinus(outputTriple); + + assertOrigins(MiscUtil.extractSingleton(outputTriple.getPlusSet()), "user", "rest"); + } + + /** + * Now testing const evaluator (const:foo -> fullName) + * + * Delta: ADD object + * + * Expected result: (no origins but mapping spec) (in zero set) + * + */ + @Test + public void testConstUserAdd() throws Exception { + PrismObject user = evaluator.getUserOld(); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_CONST_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + + PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); + displayDumpable("output triple", outputTriple); + PrismAsserts.assertTripleNoPlus(outputTriple); + PrismAsserts.assertTripleZero(outputTriple, PrismTestUtil.createPolyString(ExpressionTestUtil.CONST_FOO_VALUE)); + PrismAsserts.assertTripleNoMinus(outputTriple); + + assertOrigins(MiscUtil.extractSingleton(outputTriple.getZeroSet())); + } + + /** + * Now testing literal (value) evaluator (Jack Sparrow -> fullName) + * + * Delta: ADD object + * + * Expected result: (no origins but mapping spec) (in zero set) + * + */ + @Test + public void testValueUserAdd() throws Exception { + PrismObject user = evaluator.getUserOld(); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_VALUE_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + + PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); + displayDumpable("output triple", outputTriple); + PrismAsserts.assertTripleNoPlus(outputTriple); + PrismAsserts.assertTripleZero(outputTriple, PrismTestUtil.createPolyString("Jack Sparrow")); + PrismAsserts.assertTripleNoMinus(outputTriple); + + assertOrigins(MiscUtil.extractSingleton(outputTriple.getZeroSet())); + } + + /** + * Now testing generate evaluator (UUID -> fullName) + * + * Delta: ADD object + * + * Expected result: (no origins but mapping spec) (in zero set) + * + */ + @Test + public void testGenerateUserAdd() throws Exception { + PrismObject user = evaluator.getUserOld(); + MappingImpl, PrismPropertyDefinition> mapping = + evaluate(MAPPING_GENERATE_FULLNAME_METADATA_XML, DeltaFactory.Object.createAddDelta(user)); + + PrismValueDeltaSetTriple> outputTriple = mapping.getOutputTriple(); + displayDumpable("output triple", outputTriple); + PrismAsserts.assertTripleNoPlus(outputTriple); + PrismAsserts.assertTripleNoMinus(outputTriple); + + assertOrigins(MiscUtil.extractSingleton(outputTriple.getZeroSet())); + } + public MappingImpl, PrismPropertyDefinition> evaluate(String filename, ObjectDelta delta) throws Exception { MappingImpl, PrismPropertyDefinition> mapping = evaluator.createMapping(filename, getTestNameShort(), "fullName", delta); @@ -489,8 +614,14 @@ public MappingImpl, PrismPropertyDefinition(lensContext, null, task, result)); - // WHEN - mapping.evaluate(task, result); + try { + + // WHEN + mapping.evaluate(task, result); + + } finally { + ModelExpressionThreadLocalHolder.popExpressionEnvironment(); + } // THEN return mapping; @@ -507,6 +638,8 @@ private void assertOrigins(PrismValue value, String... origins) { assertThat(metadataContainer.size()).isEqualTo(1); ValueMetadataType metadata = (ValueMetadataType) metadataContainer.getValue().asContainerable(); assertThat(metadata.getProvenance()).isNotNull(); + assertThat(metadata.getProvenance().getMappingSpec()).as("mapping spec").isNotNull(); + assertThat(metadata.getProvenance().getMappingSpec().getMappingName()).as("mapping name").isEqualTo("mapping"); assertThat(metadata.getProvenance().getAcquisition().size()).isEqualTo(origins.length); Set realOrigins = metadata.getProvenance().getAcquisition().stream() .map(acq -> acq.getOriginRef().getOid()) diff --git a/model/model-common/src/test/resources/mapping/mapping-asis-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-asis-fullname-metadata.xml new file mode 100644 index 00000000000..87100f5569e --- /dev/null +++ b/model/model-common/src/test/resources/mapping/mapping-asis-fullname-metadata.xml @@ -0,0 +1,17 @@ + + + + + mapping + + givenName + + + fullName + + diff --git a/model/model-common/src/test/resources/mapping/mapping-const-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-const-fullname-metadata.xml new file mode 100644 index 00000000000..40118177806 --- /dev/null +++ b/model/model-common/src/test/resources/mapping/mapping-const-fullname-metadata.xml @@ -0,0 +1,17 @@ + + + + + mapping + + foo + + + fullName + + diff --git a/model/model-common/src/test/resources/mapping/mapping-generate-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-generate-fullname-metadata.xml new file mode 100644 index 00000000000..a44817f410d --- /dev/null +++ b/model/model-common/src/test/resources/mapping/mapping-generate-fullname-metadata.xml @@ -0,0 +1,19 @@ + + + + + mapping + + + uuid + + + + fullName + + diff --git a/model/model-common/src/test/resources/mapping/mapping-path-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-path-fullname-metadata.xml new file mode 100644 index 00000000000..d3a32001566 --- /dev/null +++ b/model/model-common/src/test/resources/mapping/mapping-path-fullname-metadata.xml @@ -0,0 +1,17 @@ + + + + + mapping + + $user/givenName + + + fullName + + diff --git a/model/model-common/src/test/resources/mapping/mapping-script-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-script-fullname-metadata.xml index 9af6ea30659..9196473b630 100644 --- a/model/model-common/src/test/resources/mapping/mapping-script-fullname-metadata.xml +++ b/model/model-common/src/test/resources/mapping/mapping-script-fullname-metadata.xml @@ -7,6 +7,7 @@ --> + mapping givenName diff --git a/model/model-common/src/test/resources/mapping/mapping-value-fullname-metadata.xml b/model/model-common/src/test/resources/mapping/mapping-value-fullname-metadata.xml new file mode 100644 index 00000000000..f4baae33615 --- /dev/null +++ b/model/model-common/src/test/resources/mapping/mapping-value-fullname-metadata.xml @@ -0,0 +1,17 @@ + + + + + mapping + + Jack Sparrow + + + fullName + + diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java index 168a7cab132..c2145b0b38d 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java @@ -1024,12 +1024,12 @@ public void test240ChangeGivenName() throws Exception { * Blaise is imported from HR anew. * * After: - * - name: blaise (hr) - * - givenName: Blaise (hr) - * - familyName: Pascal (hr) + * - name: blaise (m:hr) + * - givenName: Blaise (m:hr) + * - familyName: Pascal (m:hr) * - fullName: Blaise Pascal (m:hr) - * - org: Department of Hydrostatics (hr) - * - org: Binomial Club (hr) + * - org: Department of Hydrostatics (m:hr) + * - org: Binomial Club (m:hr) */ @Test public void test300ImportBlaiseFromHr() throws Exception { @@ -1058,6 +1058,7 @@ public void test300ImportBlaiseFromHr() throws Exception { .valueMetadataSingle(UserType.F_NAME) .display() .provenance() + .assertMappingSpec(RESOURCE_HR.oid) .singleAcquisition() .assertOriginRef(ORIGIN_HR_FEED.oid) .assertResourceRef(RESOURCE_HR.oid) @@ -1069,6 +1070,7 @@ public void test300ImportBlaiseFromHr() throws Exception { .assertGivenName("Blaise") .valueMetadataSingle(UserType.F_GIVEN_NAME) .provenance() + .assertMappingSpec(RESOURCE_HR.oid) .singleAcquisition() .assertOriginRef(ORIGIN_HR_FEED.oid) .assertResourceRef(RESOURCE_HR.oid) @@ -1080,6 +1082,7 @@ public void test300ImportBlaiseFromHr() throws Exception { .assertFamilyName("Pascal") .valueMetadataSingle(UserType.F_FAMILY_NAME) .provenance() + .assertMappingSpec(RESOURCE_HR.oid) .singleAcquisition() .assertOriginRef(ORIGIN_HR_FEED.oid) .assertResourceRef(RESOURCE_HR.oid) @@ -1103,6 +1106,7 @@ public void test300ImportBlaiseFromHr() throws Exception { .assertOrganizations("Department of Hydrostatics", "Binomial Club") .valueMetadataSingle(UserType.F_ORGANIZATION, ValueSelector.origEquals("Department of Hydrostatics")) .provenance() + .assertMappingSpec(RESOURCE_HR.oid) .singleAcquisition() .assertOriginRef(ORIGIN_HR_FEED.oid) .assertResourceRef(RESOURCE_HR.oid) @@ -1112,6 +1116,7 @@ public void test300ImportBlaiseFromHr() throws Exception { .end() .valueMetadataSingle(UserType.F_ORGANIZATION, ValueSelector.origEquals("Binomial Club")) .provenance() + .assertMappingSpec(RESOURCE_HR.oid) .singleAcquisition() .assertOriginRef(ORIGIN_HR_FEED.oid) .assertResourceRef(RESOURCE_HR.oid) diff --git a/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-crm.xml b/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-crm.xml index ec73540f966..d1f396729b7 100644 --- a/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-crm.xml +++ b/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-crm.xml @@ -77,11 +77,6 @@ ri:firstname strong - - - givenName @@ -91,11 +86,6 @@ ri:lastname strong - - - familyName @@ -105,11 +95,6 @@ ri:organization strong - - - organization diff --git a/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-hr.xml b/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-hr.xml index 4590450b32a..53fbd73248c 100644 --- a/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-hr.xml +++ b/model/model-intest/src/test/resources/metadata/provenance-metadata-recording/resource-hr.xml @@ -82,11 +82,6 @@ ri:firstname strong - - - givenName @@ -96,11 +91,6 @@ ri:lastname strong - - - familyName @@ -110,11 +100,6 @@ ri:organization strong - - - organization diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AbstractExpressionEvaluator.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AbstractExpressionEvaluator.java index 5fef696a57b..ace8f3fb2df 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AbstractExpressionEvaluator.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AbstractExpressionEvaluator.java @@ -8,17 +8,24 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.crypto.Protector; +import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.repo.common.expression.Source; +import com.evolveum.midpoint.schema.expression.TypedValue; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.exception.*; import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.function.Function; + /** * @param evaluator bean (configuration) type * @author Radovan Semancik @@ -62,7 +69,7 @@ public AbstractExpressionEvaluator(@NotNull QName elementName, E expressionEvalu /** * Check expression profile. Throws security exception if the execution is not allowed by the profile. - * + *

* This implementation works only for simple evaluators that do not have any profile settings. * Complex evaluators should override this method. * @@ -75,4 +82,103 @@ protected void checkEvaluatorProfile(ExpressionEvaluationContext context) throws public @NotNull PrismContext getPrismContext() { return prismContext; } + + public D getOutputDefinition() { + return outputDefinition; + } + + public Protector getProtector() { + return protector; + } + + /** + * Converts intermediate expression result triple to the final output triple + * according to expected Java type and additional convertor. + * + * TODO why it is used only for some evaluators? + */ + public PrismValueDeltaSetTriple finishOutputTriple(PrismValueDeltaSetTriple resultTriple, + Function additionalConvertor, ItemPath residualPath) { + + if (resultTriple == null) { + return null; + } + + final Class resultTripleValueClass = resultTriple.getRealValueClass(); + if (resultTripleValueClass == null) { + // triple is empty. type does not matter. + return resultTriple; + } + Class expectedJavaType = getClassForType(outputDefinition.getTypeName()); + if (resultTripleValueClass == expectedJavaType) { + return resultTriple; + } + + resultTriple.accept(visitable -> { + if (visitable instanceof PrismPropertyValue) { + //noinspection unchecked + PrismPropertyValue pval = (PrismPropertyValue) visitable; + Object realVal = pval.getValue(); + if (realVal != null) { + if (Structured.class.isAssignableFrom(resultTripleValueClass)) { + if (residualPath != null && !residualPath.isEmpty()) { + realVal = ((Structured) realVal).resolve(residualPath); + } + } + if (expectedJavaType != null) { + Object convertedVal = ExpressionUtil.convertValue(expectedJavaType, additionalConvertor, realVal, protector, prismContext); + pval.setValue(convertedVal); + } + } + } + }); + return resultTriple; + } + + // TODO this should be a standard method + private Class getClassForType(@NotNull QName typeName) { + Class aClass = XsdTypeMapper.toJavaType(typeName); + if (aClass != null) { + return aClass; + } else { + return prismContext.getSchemaRegistry().getCompileTimeClass(typeName); + } + } + + public TypedValue findInSourcesAndVariables(ExpressionEvaluationContext context, String variableName) { + for (Source source : context.getSources()) { + if (variableName.equals(source.getName().getLocalPart())) { + return new TypedValue<>(source, source.getDefinition()); + } + } + + if (context.getVariables() != null) { + return context.getVariables().get(variableName); + } else { + return null; + } + } + + public void applyValueMetadata(PrismValueDeltaSetTriple triple, ExpressionEvaluationContext context, + OperationResult result) throws CommunicationException, ObjectNotFoundException, SchemaException, + SecurityViolationException, ConfigurationException, ExpressionEvaluationException { + if (triple != null && context.getValueMetadataComputer() != null) { + for (V value : triple.getPlusSet()) { + applyValueMetadata(value, context, result); + } + for (V value : triple.getZeroSet()) { + applyValueMetadata(value, context, result); + } + } + } + + private void applyValueMetadata(PrismValue value, ExpressionEvaluationContext context, OperationResult result) + throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, + ConfigurationException, ExpressionEvaluationException { + if (value != null) { + value.setValueMetadata( + context.getValueMetadataComputer() + .compute(Collections.singletonList(value), result)); + } + } } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AsIsExpressionEvaluator.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AsIsExpressionEvaluator.java index a593a9a4c58..d0e5a10c55f 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AsIsExpressionEvaluator.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/AsIsExpressionEvaluator.java @@ -17,10 +17,7 @@ import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.repo.common.expression.Source; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.AsIsExpressionEvaluatorType; /** @@ -37,7 +34,8 @@ public class AsIsExpressionEvaluator evaluate(ExpressionEvaluationContext context, OperationResult result) - throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException { + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException, + CommunicationException, ConfigurationException { checkEvaluatorProfile(context); @@ -58,14 +56,11 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, //noinspection unchecked source = (Source) context.getSources().iterator().next(); } - PrismValueDeltaSetTriple sourceTriple = ItemDeltaUtil.toDeltaSetTriple(source.getItemOld(), source.getDelta(), + PrismValueDeltaSetTriple outputTriple = ItemDeltaUtil.toDeltaSetTriple(source.getItemOld(), source.getDelta(), prismContext); - if (sourceTriple == null) { - return null; - } - return ExpressionEvaluatorUtil.toOutputTriple(sourceTriple, outputDefinition, context.getAdditionalConvertor(), - source.getResidualPath(), protector, prismContext); + applyValueMetadata(outputTriple, context, result); + return finishOutputTriple(outputTriple, context.getAdditionalConvertor(), source.getResidualPath()); } @Override diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/ExpressionEvaluatorUtil.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/ExpressionEvaluatorUtil.java deleted file mode 100644 index a8cd53e2395..00000000000 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/ExpressionEvaluatorUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2020 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.repo.common.expression.evaluator; - -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; - -import com.evolveum.midpoint.repo.common.expression.Source; -import com.evolveum.midpoint.schema.expression.TypedValue; - -import org.jetbrains.annotations.NotNull; - -import javax.xml.namespace.QName; -import java.util.function.Function; - -/** - * Utilities that are used by expression evaluators only. - * (In contrast with ExpressionUtil that are used system-wide.) - */ -public class ExpressionEvaluatorUtil { - - /** - * Converts intermediate expression result triple to the final output triple. - */ - public static PrismValueDeltaSetTriple toOutputTriple( - PrismValueDeltaSetTriple resultTriple, ItemDefinition outputDefinition, - Function additionalConvertor, - ItemPath residualPath, Protector protector, PrismContext prismContext) { - - PrismValueDeltaSetTriple clonedTriple = resultTriple.clone(); - - final Class resultTripleValueClass = resultTriple.getRealValueClass(); - if (resultTripleValueClass == null) { - // triple is empty. type does not matter. - return clonedTriple; - } - Class expectedJavaType = getClassForType(outputDefinition.getTypeName(), prismContext); - if (resultTripleValueClass == expectedJavaType) { - return clonedTriple; - } - - clonedTriple.accept((Visitor) visitable -> { - if (visitable instanceof PrismPropertyValue) { - //noinspection unchecked - PrismPropertyValue pval = (PrismPropertyValue) visitable; - Object realVal = pval.getValue(); - if (realVal != null) { - if (Structured.class.isAssignableFrom(resultTripleValueClass)) { - if (residualPath != null && !residualPath.isEmpty()) { - realVal = ((Structured) realVal).resolve(residualPath); - } - } - if (expectedJavaType != null) { - Object convertedVal = ExpressionUtil.convertValue(expectedJavaType, additionalConvertor, realVal, protector, prismContext); - pval.setValue(convertedVal); - } - } - } - }); - return clonedTriple; - } - - // TODO this should be a standard method - private static Class getClassForType(@NotNull QName typeName, PrismContext prismContext) { - Class aClass = XsdTypeMapper.toJavaType(typeName); - if (aClass != null) { - return aClass; - } else { - return prismContext.getSchemaRegistry().getCompileTimeClass(typeName); - } - } - - public static TypedValue findInSourcesAndVariables(ExpressionEvaluationContext context, String variableName) { - for (Source source : context.getSources()) { - if (variableName.equals(source.getName().getLocalPart())) { - return new TypedValue<>(source, source.getDefinition()); - } - } - - if (context.getVariables() != null) { - return context.getVariables().get(variableName); - } else { - return null; - } - } -} diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluator.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluator.java index 72895ff4fb1..50867806095 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluator.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluator.java @@ -6,49 +6,54 @@ */ package com.evolveum.midpoint.repo.common.expression.evaluator; +import java.util.Collection; +import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; +import com.evolveum.midpoint.common.StaticExpressionUtil; +import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.crypto.Protector; +import com.evolveum.midpoint.prism.delta.ItemDeltaUtil; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; -import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; /** * Always returns zero set with literal value (values) specified in the evaluator. Plus and minus sets are empty. * - * @author Radovan Semancik + * Note: using evaluatorElements as "expressionEvaluatorBean" is a bit strange. It is because I am too lazy to find more + * appropriate name for the field. Moreover, for all other uses it really _is_ the expression evaluator bean. So leaving + * fixing this to the future. [pmed] */ -public class LiteralExpressionEvaluator implements ExpressionEvaluator { +public class LiteralExpressionEvaluator + extends AbstractExpressionEvaluator>> { - private final QName elementName; - private final PrismValueDeltaSetTriple outputTriple; - - LiteralExpressionEvaluator(QName elementName, PrismValueDeltaSetTriple outputTriple) { - this.elementName = elementName; - this.outputTriple = outputTriple; + LiteralExpressionEvaluator(QName elementName, Collection> evaluatorElements, + D outputDefinition, Protector protector, PrismContext prismContext) { + super(elementName, evaluatorElements, outputDefinition, protector, prismContext); } @Override public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context, OperationResult result) - throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException { + throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, SecurityViolationException, + CommunicationException, ConfigurationException { + ExpressionUtil.checkEvaluatorProfileSimple(this, context); - return outputTriple != null ? outputTriple.clone() : null; - } - @Override - public QName getElementName() { - return elementName; + Item output = StaticExpressionUtil.parseValueElements(expressionEvaluatorBean, outputDefinition, context.getContextDescription()); + + PrismValueDeltaSetTriple outputTriple = ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); + applyValueMetadata(outputTriple, context, result); + return outputTriple; } @Override public String shortDebugDump() { - return "literal: "+outputTriple; + return "literal: "+expressionEvaluatorBean; // TODO } } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java index d9329b32db1..ec26b6ee7b4 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java @@ -7,30 +7,25 @@ package com.evolveum.midpoint.repo.common.expression.evaluator; import java.util.Collection; - import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.delta.ItemDeltaUtil; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; -import com.evolveum.midpoint.task.api.Task; - import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.common.StaticExpressionUtil; -import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; +import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.repo.common.expression.AbstractAutowiredExpressionEvaluatorFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.expression.ExpressionProfile; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; /** @@ -42,6 +37,7 @@ public class LiteralExpressionEvaluatorFactory extends AbstractAutowiredExpressi private static final QName ELEMENT_NAME = SchemaConstantsGenerated.C_VALUE; @Autowired private PrismContext prismContext; + @Autowired private Protector protector; @SuppressWarnings("unused") // Used by Spring public LiteralExpressionEvaluatorFactory() { @@ -64,10 +60,6 @@ public ExpressionEvaluator cr Validate.notNull(outputDefinition, "output definition must be specified for literal expression evaluator"); - Item output = StaticExpressionUtil.parseValueElements(evaluatorElements, outputDefinition, contextDescription); - - PrismValueDeltaSetTriple deltaSetTriple = ItemDeltaUtil.toDeltaSetTriple(output, null, prismContext); - - return new LiteralExpressionEvaluator<>(ELEMENT_NAME, deltaSetTriple); + return new LiteralExpressionEvaluator<>(ELEMENT_NAME, evaluatorElements, outputDefinition, protector, prismContext); } }