/** * Shallow clone */ @NotNull @Override public PrismContainerDefinitionImpl<C> clone() { PrismContainerDefinitionImpl<C> clone = new PrismContainerDefinitionImpl<>(name, complexTypeDefinition, prismContext, compileTimeClass); copyDefinitionData(clone); return clone; }
@Override public ItemDefinition deepClone(Map<QName,ComplexTypeDefinition> ctdMap, Map<QName,ComplexTypeDefinition> onThisPath, Consumer<ItemDefinition> postCloneAction) { PrismContainerDefinitionImpl<C> clone = clone(); ComplexTypeDefinition ctd = getComplexTypeDefinition(); if (ctd != null) { ctd = ctd.deepClone(ctdMap, onThisPath, postCloneAction); clone.setComplexTypeDefinition(ctd); } return clone; }
public MutablePrismContainerDefinition<?> createContainerDefinition(QName name, ComplexTypeDefinition complexTypeDefinition, int minOccurs, int maxOccurs) { PrismContainerDefinitionImpl<C> def = new PrismContainerDefinitionImpl<>(name, complexTypeDefinition, prismContext); def.setMinOccurs(minOccurs); def.setMaxOccurs(maxOccurs); addDefinition(def); return def; }
@Override public PrismContainerDefinition<C> cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { PrismContainerDefinitionImpl<C> clone = clone(); clone.replaceDefinition(itemName, newDefinition); return clone; }
private PrismContainerDefinition<?> createAdHocContainerDefinition(QName elementName, ComplexTypeDefinition ctd, int minOccurs, int maxOccurs) { PrismContainerDefinitionImpl<?> def = new PrismContainerDefinitionImpl<>(elementName, ctd, prismContext); def.setMinOccurs(minOccurs); def.setMaxOccurs(maxOccurs); return def; }
public <ID extends ItemDefinition> ID findItemDefinition(@NotNull ItemPath path, @NotNull Class<ID> clazz) { for (;;) { if (path.isEmpty()) { if (clazz.isAssignableFrom(PrismContainerDefinition.class)) { return (ID) this; } else { return null; } } Object first = path.first(); if (ItemPath.isName(first)) { return findNamedItemDefinition(ItemPath.toName(first), path.rest(), clazz); } else if (ItemPath.isId(first)) { path = path.rest(); } else if (ItemPath.isParent(first)) { ItemPath rest = path.rest(); ComplexTypeDefinition parent = getSchemaRegistry().determineParentDefinition(getComplexTypeDefinition(), rest); if (rest.isEmpty()) { // requires that the parent is defined as an item (container, object) return (ID) getSchemaRegistry().findItemDefinitionByType(parent.getTypeName()); } else { return parent.findItemDefinition(rest, clazz); } } else if (ItemPath.isObjectReference(first)) { throw new IllegalStateException("Couldn't use '@' path segment in this context. PCD=" + getTypeName() + ", path=" + path); } else { throw new IllegalStateException("Unexpected path segment: " + first + " in " + path); } } }
@Override public void replaceDefinition(QName itemName, ItemDefinition newDefinition) { ComplexTypeDefinition originalComplexTypeDefinition = getComplexTypeDefinition(); ComplexTypeDefinition cloneComplexTypeDefinition = originalComplexTypeDefinition.clone(); setComplexTypeDefinition(cloneComplexTypeDefinition); ((ComplexTypeDefinitionImpl) cloneComplexTypeDefinition).replaceDefinition(itemName, newDefinition); }
/** * Returns a single-valued container (with a single-valued definition) holding just this value. * @param itemName Item name for newly-created container. * @return */ public PrismContainer<C> asSingleValuedContainer(@NotNull QName itemName) throws SchemaException { PrismContext prismContext = getPrismContext(); Validate.notNull(prismContext, "Prism context is null"); PrismContainerDefinitionImpl<C> definition = new PrismContainerDefinitionImpl<>(itemName, getComplexTypeDefinition(), prismContext); definition.setMaxOccurs(1); PrismContainer<C> pc = definition.instantiate(); pc.add(clone()); return pc; }
/** * Creates new instance of property definition and adds it to the container. * <p> * This is the preferred method of creating a new definition. * * @param localName name of the property (element name) relative to the schema namespace * @param typeName XSD type of the property * @return created property definition */ public MutablePrismPropertyDefinition<?> createPropertyDefinition(String localName, QName typeName) { QName name = new QName(getSchemaNamespace(), localName); return createPropertyDefinition(name, typeName); }
@Override public ObjectClassComplexTypeDefinition getComplexTypeDefinition() { return (ObjectClassComplexTypeDefinition)super.getComplexTypeDefinition(); }
protected void copyDefinitionData(ResourceAttributeContainerDefinitionImpl clone) { super.copyDefinitionData(clone); }
public <C extends Containerable> PrismContainerDefinitionImpl<C> createContainerDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, Class<C> compileTimeClass) throws SchemaException { return new PrismContainerDefinitionImpl<>(elementName, complexTypeDefinition, prismContext, compileTimeClass); }
@SuppressWarnings("unchecked") Item<?, ?> parseItem(@NotNull RootXNodeImpl root, ItemDefinition<?> itemDefinition, QName itemName, QName typeName, Class<?> typeClass, @NotNull ParsingContext pc) throws SchemaException { ItemInfo itemInfo = ItemInfo.determine(itemDefinition, root.getRootElementName(), itemName, ARTIFICIAL_OBJECT_NAME, root.getTypeQName(), typeName, typeClass, ItemDefinition.class, pc, getSchemaRegistry()); ItemDefinition realDefinition; if (itemInfo.getItemDefinition() == null && itemInfo.getComplexTypeDefinition() != null) { // let's create container definition dynamically QName actualTypeName = itemInfo.getComplexTypeDefinition().getTypeName(); if (getSchemaRegistry().isContainer(actualTypeName)) { // TODO what about objects? PrismContainerDefinitionImpl def = new PrismContainerDefinitionImpl(itemInfo.getItemName(), itemInfo.getComplexTypeDefinition(), prismContext); def.setDynamic(true); realDefinition = def; } else { PrismPropertyDefinitionImpl def = new PrismPropertyDefinitionImpl(itemInfo.getItemName(), actualTypeName, prismContext); def.setDynamic(true); realDefinition = def; } } else { realDefinition = itemInfo.getItemDefinition(); } return parseItemInternal(root.getSubnode(), itemInfo.getItemName(), realDefinition, pc); }
public PrismPropertyDefinition createPropertyDefinition(QName name) { PrismPropertyDefinition propDef = new PrismPropertyDefinitionImpl(name, null, prismContext); addDefinition(propDef); return propDef; }
public PrismContainerDefinition createContainerDefinition(QName name, QName typeName) { return createContainerDefinition(name, typeName, 1, 1); }
@Override public PrismObjectDefinition<O> cloneWithReplacedDefinition(QName itemName, ItemDefinition newDefinition) { return (PrismObjectDefinition<O>) super.cloneWithReplacedDefinition(itemName, newDefinition); }
@Override public String debugDump(int indent) { return debugDump(indent, new IdentityHashMap<>()); }
@Override public boolean canBeDefinitionOf(PrismValue pvalue) { if (pvalue == null) { return false; } if (!(pvalue instanceof PrismContainerValue<?>)) { return false; } Itemable parent = pvalue.getParent(); if (parent != null) { if (!(parent instanceof PrismContainer<?>)) { return false; } return canBeDefinitionOf((PrismContainer)parent); } else { // TODO: maybe look at the subitems? return true; } }
/** * Creates new instance of property definition and adds it to the container. * <p> * This is the preferred method of creating a new definition. * * @param localName name of the property (element name) relative to the schema namespace * @param localTypeName XSD type of the property * @return created property definition */ public PrismPropertyDefinition createPropertyDefinition(String localName, String localTypeName) { QName name = new QName(getSchemaNamespace(), localName); QName typeName = new QName(getSchemaNamespace(), localTypeName); return createPropertyDefinition(name, typeName); }
@Override public MutablePrismContainerDefinition<?> createContainerDefinition(QName name, ComplexTypeDefinition ctd) { return new PrismContainerDefinitionImpl<>(name, ctd, prismContext); }