@Override public <ID extends ItemDefinition> ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class<ID> clazz) { for (ItemDefinition def : getDefinitions()) { if (QNameUtil.match(firstName, def.getName())) { return (ID) def.findItemDefinition(rest, clazz); } } if (complexTypeDefinition != null && complexTypeDefinition.isXsdAnyMarker()) { SchemaRegistry schemaRegistry = getSchemaRegistry(); if (schemaRegistry != null) { ItemDefinition def = schemaRegistry.findItemDefinitionByElementName(firstName); if (def != null) { return (ID) def.findItemDefinition(rest, clazz); } } } return null; }
@Override public <T extends ItemDefinition> T findItemDefinitionByFullPath(Class<? extends Objectable> objectClass, Class<T> defClass, QName... itemNames) throws SchemaException { PrismObjectDefinition objectDefinition = findObjectDefinitionByCompileTimeClass(objectClass); if (objectDefinition == null) { throw new SchemaException("No object definition for " + objectClass); } return (T) ((ItemDefinition) objectDefinition).findItemDefinition(ItemPath.create(itemNames), defClass); }
@Override public <T extends ItemDefinition> T findItemDefinition(@NotNull ItemPath path, @NotNull Class<T> clazz) { if (!path.startsWithObjectReference()) { return super.findItemDefinition(path, clazz); } else { ItemPath rest = path.rest(); PrismObjectDefinition referencedObjectDefinition = getSchemaRegistry().determineReferencedObjectDefinition(targetTypeName, rest); return (T) ((ItemDefinition) referencedObjectDefinition).findItemDefinition(rest, clazz); } }
public <ID extends ItemDefinition> ID findNamedItemDefinition(@NotNull QName firstName, @NotNull ItemPath rest, @NotNull Class<ID> clazz) { ID found = null; for (ItemDefinition def : getDefinitions()) { if (def.isValidFor(firstName, clazz, false)) { if (found != null) { throw new IllegalStateException("More definitions found for " + firstName + "/" + rest + " in " + this); } found = (ID) def.findItemDefinition(rest, clazz); if (QNameUtil.hasNamespace(firstName)) { return found; // if qualified then there's no risk of matching more entries } } } if (found != null) { return found; } if (isXsdAnyMarker()) { SchemaRegistry schemaRegistry = getSchemaRegistry(); if (schemaRegistry != null) { ItemDefinition def = schemaRegistry.findItemDefinitionByElementName(firstName); if (def != null) { return (ID) def.findItemDefinition(rest, clazz); } } } return null; } //endregion
public static void applyDefinitionIfPresent(Collection<? extends ItemDelta> deltas, PrismObjectDefinition definition, boolean tolerateNoDefinition) throws SchemaException { for (ItemDelta itemDelta : deltas) { ItemPath path = itemDelta.getPath(); ItemDefinition itemDefinition = ((ItemDefinition) definition).findItemDefinition(path, ItemDefinition.class); if (itemDefinition != null) { itemDelta.applyDefinition(itemDefinition); } else if (!tolerateNoDefinition) { throw new SchemaException("Object type " + definition.getTypeName() + " doesn't contain definition for path " + path); } } }