diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index b1ddb2288f8..47bbba89548 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -93,7 +93,8 @@ List getReviewersForCase(AccessCertificationCaseType _case, } for (ExpressionType reviewerExpression : reviewerSpec.getReviewerExpression()) { ExpressionVariables variables = new ExpressionVariables(); - variables.put(ExpressionConstants.VAR_CERTIFICATION_CASE, _case, _case.asPrismContainerValue().getDefinition()); + // The _case does NOT have definition here. Can we have it? + variables.put(ExpressionConstants.VAR_CERTIFICATION_CASE, _case, AccessCertificationCaseType.class); variables.putObject(ExpressionConstants.VAR_CAMPAIGN, campaign, AccessCertificationCampaignType.class); variables.put(ExpressionConstants.VAR_REVIEWER_SPECIFICATION, reviewerSpec, AccessCertificationReviewerSpecificationType.class); List refList = expressionHelper diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java index e21cb4a4e6e..f32d618fae0 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/expression/ExpressionUtil.java @@ -73,6 +73,7 @@ import com.evolveum.midpoint.prism.query.TypeFilter; import com.evolveum.midpoint.prism.query.UndefinedFilter; import com.evolveum.midpoint.prism.query.ValueFilter; +import com.evolveum.midpoint.prism.util.DefinitionResolver; import com.evolveum.midpoint.prism.util.ItemDeltaItem; import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.prism.util.ObjectDeltaObject; @@ -349,7 +350,19 @@ private static TypedValue determineTypedValue(PrismContext prismContext, private static TypedValue determineTypedValueOdo(PrismContext prismContext, String name, TypedValue root, ItemPath relativePath) throws SchemaException { ObjectDeltaObject rootOdo = (ObjectDeltaObject) root.getValue(); - ItemDeltaItem subValue = rootOdo.findIdi(relativePath); + DefinitionResolver, ItemDefinition> resolver = (rootDef,path) -> { + // We are called just before failure. Therefore all normal ways of resolving of definition did not work. + ItemDefinition parentDef = rootDef.findItemDefinition(path.allExceptLast()); + if (parentDef != null && parentDef.isDynamic()) { + // This is the case of dynamic schema extensions, such as assignment extension. + // 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 prismContext.definitionFactory().createPropertyDefinition(path.firstName(), PrimitiveType.STRING.getQname()); + } + return null; + }; + ItemDeltaItem subValue = rootOdo.findIdi(relativePath, resolver); PrismObjectDefinition rootDefinition = root.getDefinition(); if (rootDefinition == null) { rootDefinition = rootOdo.getDefinition();