effectivenodetype.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 1,125 行 · 第 1/3 页
JAVA
1,125 行
} ArrayList defs = new ArrayList(namedItemDefs.size()); Iterator iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (def.definesNode() && def.isAutoCreated()) { defs.add(def); } } } if (defs.size() == 0) { return NodeDef.EMPTY_ARRAY; } return (NodeDef[]) defs.toArray(new NodeDef[defs.size()]); } public PropDef[] getAllPropDefs() { if (namedItemDefs.size() == 0 && unnamedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size() + unnamedItemDefs.size()); Iterator iter = unnamedItemDefs.iterator(); while (iter.hasNext()) { ItemDef def = (ItemDef) iter.next(); if (!def.definesNode()) { defs.add(def); } } iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (!def.definesNode()) { defs.add(def); } } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public PropDef[] getNamedPropDefs() { if (namedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); Iterator iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (!def.definesNode()) { defs.add(def); } } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public PropDef[] getNamedPropDefs(QName name) { List list = (List) namedItemDefs.get(name); if (list == null || list.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(list.size()); Iterator iter = list.iterator(); while (iter.hasNext()) { ItemDef def = (ItemDef) iter.next(); if (!def.definesNode()) { defs.add(def); } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public PropDef[] getUnnamedPropDefs() { if (unnamedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(unnamedItemDefs.size()); Iterator iter = unnamedItemDefs.iterator(); while (iter.hasNext()) { ItemDef def = (ItemDef) iter.next(); if (!def.definesNode()) { defs.add(def); } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public PropDef[] getAutoCreatePropDefs() { // since auto-create items must have a name, // we're only searching the named item definitions if (namedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); Iterator iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (!def.definesNode() && def.isAutoCreated()) { defs.add(def); } } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public PropDef[] getMandatoryPropDefs() { // since mandatory items must have a name, // we're only searching the named item definitions if (namedItemDefs.size() == 0) { return PropDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); Iterator iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (!def.definesNode() && def.isMandatory()) { defs.add(def); } } } if (defs.size() == 0) { return PropDef.EMPTY_ARRAY; } return (PropDef[]) defs.toArray(new PropDef[defs.size()]); } public NodeDef[] getMandatoryNodeDefs() { // since mandatory items must have a name, // we're only searching the named item definitions if (namedItemDefs.size() == 0) { return NodeDef.EMPTY_ARRAY; } ArrayList defs = new ArrayList(namedItemDefs.size()); Iterator iter = namedItemDefs.values().iterator(); while (iter.hasNext()) { List list = (List) iter.next(); Iterator iter1 = list.iterator(); while (iter1.hasNext()) { ItemDef def = (ItemDef) iter1.next(); if (def.definesNode() && def.isMandatory()) { defs.add(def); } } } if (defs.size() == 0) { return NodeDef.EMPTY_ARRAY; } return (NodeDef[]) defs.toArray(new NodeDef[defs.size()]); } /** * Determines whether this effective node type representation includes * (either through inheritance or aggregation) the given node type. * * @param nodeTypeName name of node type * @return <code>true</code> if the given node type is included, otherwise * <code>false</code> */ public boolean includesNodeType(QName nodeTypeName) { return allNodeTypes.contains(nodeTypeName); } /** * Determines whether this effective node type representation includes * (either through inheritance or aggregation) all of the given node types. * * @param nodeTypeNames array of node type names * @return <code>true</code> if all of the given node types are included, * otherwise <code>false</code> */ public boolean includesNodeTypes(QName[] nodeTypeNames) { return allNodeTypes.containsAll(Arrays.asList(nodeTypeNames)); } /** * Tests if the value constraints defined in the property definition * <code>pd</code> are satisfied by the the specified <code>values</code>. * <p/> * Note that the <i>protected</i> flag is not checked. Also note that no * type conversions are attempted if the type of the given values does not * match the required type as specified in the given definition. * * @param pd The definiton of the property * @param values An array of <code>InternalValue</code> objects. * @throws ConstraintViolationException if the value constraints defined in * the property definition are satisfied * by the the specified values * @throws RepositoryException if another error occurs */ public static void checkSetPropertyValueConstraints(PropDef pd, InternalValue[] values) throws ConstraintViolationException, RepositoryException { // check multi-value flag if (!pd.isMultiple() && values != null && values.length > 1) { throw new ConstraintViolationException("the property is not multi-valued"); } ValueConstraint[] constraints = pd.getValueConstraints(); if (constraints == null || constraints.length == 0) { // no constraints to check return; } if (values != null && values.length > 0) { // check value constraints on every value for (int i = 0; i < values.length; i++) { // constraints are OR-ed together boolean satisfied = false; ConstraintViolationException cve = null; for (int j = 0; j < constraints.length; j++) { try { constraints[j].check(values[i]); satisfied = true; break; } catch (ConstraintViolationException e) { cve = e; } } if (!satisfied) { // re-throw last exception we encountered throw cve; } } } } /** * @param name * @throws ConstraintViolationException */ public void checkAddNodeConstraints(QName name) throws ConstraintViolationException { try { getApplicableChildNodeDef(name, null, null); } catch (NoSuchNodeTypeException nsnte) { String msg = "internal eror: inconsistent node type"; log.debug(msg); throw new ConstraintViolationException(msg, nsnte); } } /** * @param name * @param nodeTypeName * @param ntReg * @throws ConstraintViolationException * @throws NoSuchNodeTypeException */ public void checkAddNodeConstraints(QName name, QName nodeTypeName, NodeTypeRegistry ntReg) throws ConstraintViolationException, NoSuchNodeTypeException { NodeDef nd = getApplicableChildNodeDef(name, nodeTypeName, ntReg); if (nd.isProtected()) { throw new ConstraintViolationException(name + " is protected"); } if (nd.isAutoCreated()) { throw new ConstraintViolationException(name + " is auto-created and can not be manually added"); } } /** * Returns the applicable child node definition for a child node with the * specified name and node type. If there are multiple applicable definitions * named definitions will take precedence over residual definitions. * * @param name * @param nodeTypeName * @param ntReg * @return * @throws NoSuchNodeTypeException * @throws ConstraintViolationException if no applicable child node definition * could be found */ public NodeDef getApplicableChildNodeDef(QName name, QName nodeTypeName, NodeTypeRegistry ntReg) throws NoSuchNodeTypeException, ConstraintViolationException { EffectiveNodeType entTarget; if (nodeTypeName != null) { entTarget = ntReg.getEffectiveNodeType(nodeTypeName); } else { entTarget = null; } // try named node definitions first ItemDef[] defs = getNamedItemDefs(name); if (defs != null) { for (int i = 0; i < defs.length; i++) { ItemDef def = defs[i]; if (def.definesNode()) { NodeDef nd = (NodeDef) def; // node definition with that name exists if (entTarget != null && nd.getRequiredPrimaryTypes() != null) { // check 'required primary types' constraint if (!entTarget.includesNodeTypes(nd.getRequiredPrimaryTypes())) { continue; } // found named node definition return nd; } else { if (nd.getDefaultPrimaryType() != null) { // found node definition with default node type return nd; } } } } } // no item with that name defined; // try residual node definitions NodeDef[] nda = getUnnamedNodeDefs(); for (int i = 0; i < nda.length; i++) { NodeDef nd = nda[i]; if (entTarget != null && nd.getRequiredPrimaryTypes() != null) { // check 'required primary types' constraint if (!entTarget.includesNodeTypes(nd.getRequiredPrimaryTypes())) { continue; } // found residual node definition return nd; } else { // since no node type has been specified for the new node, // it must be determined from the default node type; if (nd.getDefaultPrimaryType() != null) { // found residual node definition with default node type return nd; } } } // no applicable definition found throw new ConstraintViolationException("no matching child node definition found for " + name); } /** * Returns the applicable property definition for a property with the * specified name, type and multiValued characteristic. If there are * multiple applicable definitions the following rules will be applied: * <ul> * <li>named definitions are preferred to residual definitions</li> * <li>definitions with specific required type are preferred to definitions * with required type UNDEFINED</li> * </ul> * * @param name * @param type * @param multiValued
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?