diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ItemDeltaItem.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ItemDeltaItem.java index ada8755d2f6..13365784d85 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ItemDeltaItem.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ItemDeltaItem.java @@ -206,7 +206,7 @@ public void recompute() throws SchemaException { } } - public ItemDeltaItem findIdi(ItemPath path) { + public ItemDeltaItem findIdi(ItemPath path) throws SchemaException { if (path.isEmpty()) { return (ItemDeltaItem) this; } diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ObjectDeltaObject.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ObjectDeltaObject.java index e36b7a5b287..3a5427ed60e 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ObjectDeltaObject.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/util/ObjectDeltaObject.java @@ -161,7 +161,7 @@ public Class getObjectCompileTimeClass() { } @Override - public ItemDeltaItem findIdi(@NotNull ItemPath path) { + public ItemDeltaItem findIdi(@NotNull ItemPath path) throws SchemaException { Item subItemOld = null; ItemPath subResidualPath = null; if (oldObject != null) { @@ -232,6 +232,19 @@ public ItemDeltaItem fi if (definition != null) { subDefinition = definition.findItemDefinition(path); } + if (subDefinition == null) { + // This may be a bit redundant, because IDI constructor does similar logic. + // But we want to know the situation here, so we can provide better error message. + if (subItemNew != null && subItemNew.getDefinition() != null) { + subDefinition = subItemNew.getDefinition(); + } else if (subItemOld != null && subItemOld.getDefinition() != null) { + subDefinition = subItemOld.getDefinition(); + } else if (itemDelta != null && itemDelta.getDefinition() != null) { + subDefinition = itemDelta.getDefinition(); + } else { + throw new SchemaException("Cannot find definition of a subitem "+path+" of "+this); + } + } ItemDeltaItem subIdi = new ItemDeltaItem<>(subItemOld, itemDelta, subItemNew, subDefinition); subIdi.setSubItemDeltas(subSubItemDeltas); subIdi.setResolvePath(path); 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 73957020b5a..e860f236109 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 @@ -454,13 +454,38 @@ private MappingImpl, ResourceAttributeDefinition> e outboundMappingType, "for attribute " + PrettyPrinter.prettyPrint(attrName) + " in " + getSource()); - MappingImpl, ResourceAttributeDefinition> evaluatedMapping = evaluateMapping( - builder, attrName, outputDefinition, null, task, result); + MappingImpl, ResourceAttributeDefinition> evaluatedMapping; + + try { + + evaluatedMapping = evaluateMapping(builder, attrName, outputDefinition, null, task, result); + + } catch (SchemaException e) { + throw new SchemaException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } catch (ExpressionEvaluationException e) { + throw new ExpressionEvaluationException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } catch (ObjectNotFoundException e) { + throw new ObjectNotFoundException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } catch (SecurityViolationException e) { + throw new SecurityViolationException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } catch (ConfigurationException e) { + throw new ConfigurationException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } catch (CommunicationException e) { + throw new CommunicationException(getAttributeEvaluationErrorMesssage(attrName, e), e); + } LOGGER.trace("Evaluated mapping for attribute " + attrName + ": " + evaluatedMapping); return evaluatedMapping; } + private String getAttributeEvaluationErrorMesssage(QName attrName, Exception e) { + return "Error evaluating mapping for attribute "+PrettyPrinter.prettyPrint(attrName)+" in "+getHumanReadableConstructionDescription()+": "+e.getMessage(); + } + + private String getHumanReadableConstructionDescription() { + return "construction for ("+resource+"/"+getKind()+"/"+getIntent()+") in "+getSource(); + } + public RefinedAttributeDefinition findAttributeDefinition(QName attributeName) { if (refinedObjectClassDefinition == null) { throw new IllegalStateException( diff --git a/model/model-intest/src/test/resources/common/role-pirate.xml b/model/model-intest/src/test/resources/common/role-pirate.xml index 8fe1599fe0a..5ce03e9b45b 100644 --- a/model/model-intest/src/test/resources/common/role-pirate.xml +++ b/model/model-intest/src/test/resources/common/role-pirate.xml @@ -1,5 +1,5 @@ + UserType account @@ -73,7 +79,7 @@ diff --git a/model/model-intest/src/test/resources/schema/piracy.xsd b/model/model-intest/src/test/resources/schema/piracy.xsd index bf67bad924c..c2d7dad61bb 100644 --- a/model/model-intest/src/test/resources/schema/piracy.xsd +++ b/model/model-intest/src/test/resources/schema/piracy.xsd @@ -209,5 +209,18 @@ + + + + + + + + + + + + + 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 a5bfa0018d1..ed9d98e4f57 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 @@ -376,14 +376,20 @@ private static ItemDefinition determineItemDefinition(PrismContainerDefinition c if (parentDef == null) { return null; } - if (!(parentDef instanceof PrismPropertyDefinition)) { - return null; - } - if (!PrismUtil.isStructuredType(parentDef.getTypeName())) { - return null; + if (parentDef instanceof PrismContainerDefinition) { + if (parentDef.isDynamic() && ((PrismContainerDefinition)parentDef).isEmpty()) { + // The case of dynamic schema for which there are no definitions + // E.g. assignment extension + // just default to single-value strings. Better than nothing. At least for now. + return parentDef.getPrismContext().definitionFactory().createPropertyDefinition(relativePath.lastName(), PrimitiveType.STRING.getQname()); + } + } else if ((parentDef instanceof PrismPropertyDefinition)) { + if (PrismUtil.isStructuredType(parentDef.getTypeName())) { + // All "subproperties" are hardcoded as singlevalue strings + return parentDef.getPrismContext().definitionFactory().createPropertyDefinition(relativePath.lastName(), PrimitiveType.STRING.getQname()); + } } - // All "subproperties" are hardcoded as singlevalue strings - return parentDef.getPrismContext().definitionFactory().createPropertyDefinition(relativePath.lastName(), PrimitiveType.STRING.getQname()); + return null; } private static TypedValue normalizeValuesToDelete(TypedValue root) { diff --git a/repo/security-enforcer-api/src/main/java/com/evolveum/midpoint/security/enforcer/api/AuthorizationParameters.java b/repo/security-enforcer-api/src/main/java/com/evolveum/midpoint/security/enforcer/api/AuthorizationParameters.java index 07d361313e7..5fd3bb90231 100644 --- a/repo/security-enforcer-api/src/main/java/com/evolveum/midpoint/security/enforcer/api/AuthorizationParameters.java +++ b/repo/security-enforcer-api/src/main/java/com/evolveum/midpoint/security/enforcer/api/AuthorizationParameters.java @@ -242,7 +242,10 @@ public static AuthorizationParameters build } public static AuthorizationParameters buildObject(PrismObject object) { - ObjectDeltaObject odo = new ObjectDeltaObject<>(object, null, object, object.getDefinition()); + ObjectDeltaObject odo = null; + if (object != null) { + odo = new ObjectDeltaObject<>(object, null, object, object.getDefinition()); + } return new AuthorizationParameters<>(odo, null, null, null); }