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 + -
显示快捷键?