public PrismContainerDefinitionImpl(@NotNull QName name, ComplexTypeDefinition complexTypeDefinition, @NotNull PrismContext prismContext, Class<C> compileTimeClass) { super(name, determineTypeName(complexTypeDefinition), prismContext); this.complexTypeDefinition = complexTypeDefinition; if (complexTypeDefinition == null) { isRuntimeSchema = true; super.setDynamic(true); // todo is this really ok? } else { isRuntimeSchema = complexTypeDefinition.isXsdAnyMarker(); super.setDynamic(isRuntimeSchema); // todo is this really ok? } this.compileTimeClass = compileTimeClass; }
@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
@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; }
/** * 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()); } }
if (definition.isXsdAnyMarker()) { addXsdAnyDefinition(sequence);
if (complexTypeDefinition == null || complexTypeDefinition.isXsdAnyMarker() || complexTypeDefinition.isRuntimeSchema()) { PrismSchema itemSchema = getSchemaRegistry().findSchemaByNamespace(itemName.getNamespaceURI()); if (itemSchema != null) {