@Override public <D extends ItemDefinition> D findLocalItemDefinition(@NotNull QName name, @NotNull Class<D> clazz, boolean caseInsensitive) { if (complexTypeDefinition != null) { return complexTypeDefinition.findLocalItemDefinition(name, clazz, caseInsensitive); } else { return null; // xsd:any and similar dynamic definitions } }
@Override public ItemDefinition locateItemDefinition(@NotNull QName itemName, @Nullable ComplexTypeDefinition complexTypeDefinition, @Nullable Function<QName, ItemDefinition> dynamicDefinitionProvider) throws SchemaException { if (complexTypeDefinition != null) { ItemDefinition def = complexTypeDefinition.findLocalItemDefinition(itemName); if (def != null) { return def; } } // not sure about this: shouldn't extension schemas have xsdAnyMarker set? if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker() || complexTypeDefinition.getExtensionForType() != null) { ItemDefinition def = resolveGlobalItemDefinition(itemName, complexTypeDefinition); if (def != null) { return def; } } if (dynamicDefinitionProvider != null) { ItemDefinition def = dynamicDefinitionProvider.apply(itemName); if (def != null) { return def; } } return null; } //endregion
private <C extends Containerable> ItemDefinition getItemDefinition(PrismContainerValue<C> cval, Item<?, ?> item) { if (item.getDefinition() != null) { return item.getDefinition(); } ComplexTypeDefinition ctd = cval.getComplexTypeDefinition(); if (ctd == null) { return null; } return ctd.findLocalItemDefinition(item.getElementName()); }
/** * This method can both return null and throws exception. It returns null in case there is no definition * but it is OK (e.g. runtime schema). It throws exception if there is no definition and it is not OK. */ @SuppressWarnings("unchecked") private <ID extends ItemDefinition> ID determineItemDefinition(QName itemName, @Nullable ComplexTypeDefinition ctd) throws SchemaException { ID itemDefinition = ctd != null ? ctd.findLocalItemDefinition(itemName) : null; if (itemDefinition != null) { return itemDefinition; } if (ctd == null || ctd.isXsdAnyMarker() || ctd.isRuntimeSchema()) { // If we have prism context, try to locate global definition. But even if that is not // found it is still OK. This is runtime container. We tolerate quite a lot here. PrismContext prismContext = getPrismContext(); if (prismContext != null) { return (ID) prismContext.getSchemaRegistry().resolveGlobalItemDefinition(itemName, ctd); } else { return null; } } else { throw new SchemaException("No definition for item " + itemName + " in " + getParent()); } }