From ef7c0a3ccdec239e32f7f2e6b80aae40f9811fde Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 19 Jun 2015 16:14:35 +0200 Subject: [PATCH] When applyingDefinition to a container, definitions for dynamically-defined items are looked for as well. --- .../prism/PrismContainerDefinition.java | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java index 1e969fa8668..e4fb898e497 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java @@ -154,6 +154,14 @@ public void revive(PrismContext prismContext) { } } + /* + * TODO clean this up: There are three definition-finding algorithms: + * - findItemDefinition (QName ...) + * - findItemDefinition (ItemPath ...) + * - findPropertyDefinition (ItemPath ...) + * + * This has to be replaced by a single algorithm. + */ public D findItemDefinition(QName name, Class clazz) { return findItemDefinition(name, clazz, false); } @@ -165,13 +173,38 @@ public D findItemDefinition(QName name, Class claz if (name == null) { throw new IllegalArgumentException("name not specified while searching in " + this); } - - if (complexTypeDefinition == null) { + + D itemDefinition; + if (complexTypeDefinition != null) { + itemDefinition = complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); + } else { // xsd:any and similar dynamic definitions - return null; + itemDefinition = null; + } + + if (itemDefinition == null && isRuntimeSchema()) { + itemDefinition = findRuntimeItemDefinition(name, null, clazz); // TODO what about case insensitive? } + return itemDefinition; + } - return complexTypeDefinition.findItemDefinition(name, clazz, caseInsensitive); + private D findRuntimeItemDefinition(QName firstName, ItemPath rest, Class clazz) { + if (prismContext == null) { + return null; // should not occur + } + ItemDefinition definition = prismContext.getSchemaRegistry().findItemDefinitionByElementName(firstName); + if (definition == null) { + return null; + } + if (rest != null && !rest.isEmpty()) { + return (D) definition.findItemDefinition(rest, clazz); + } + // this is the last step of search + if (clazz.isAssignableFrom(definition.getClass())) { + return (D) definition; + } else { + return null; + } } public ID findItemDefinition(ItemPath path, Class clazz) { @@ -183,6 +216,7 @@ public ID findItemDefinition(ItemPath path, Class ID findItemDefinition(ItemPath path, Class