nodetypereader.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 323 行

JAVA
323
字号
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jackrabbit.core.nodetype.xml;import org.apache.jackrabbit.core.nodetype.InvalidConstraintException;import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException;import org.apache.jackrabbit.core.nodetype.ItemDef;import org.apache.jackrabbit.core.nodetype.NodeDef;import org.apache.jackrabbit.core.nodetype.NodeDefImpl;import org.apache.jackrabbit.core.nodetype.NodeTypeDef;import org.apache.jackrabbit.core.nodetype.PropDef;import org.apache.jackrabbit.core.nodetype.PropDefImpl;import org.apache.jackrabbit.core.nodetype.ValueConstraint;import org.apache.jackrabbit.core.util.DOMWalker;import org.apache.jackrabbit.core.value.InternalValue;import org.apache.jackrabbit.name.NameException;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NameFormat;import org.apache.jackrabbit.value.ValueHelper;import org.apache.jackrabbit.value.ValueFactoryImpl;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.version.OnParentVersionAction;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import java.util.Vector;/** * Node type definition reader. This class is used to read the * persistent node type definition files used by Jackrabbit. */public class NodeTypeReader {    /**     * Reads a node type definition file. The file contents are read from     * the given input stream and the parsed node type definitions are     * returned.     *     * @param xml XML input stream     * @return node type definitions     * @throws IOException                 if the node type definitions     *                                     cannot be read     * @throws InvalidNodeTypeDefException if the node type definition     *                                     format is invalid     */    public static NodeTypeDef[] read(InputStream xml)            throws IOException, InvalidNodeTypeDefException {        try {            NodeTypeReader reader = new NodeTypeReader(xml);            return reader.getNodeTypeDefs();        } catch (NameException e) {            throw new InvalidNodeTypeDefException(                    "Invalid namespace reference in a node type definition", e);        }    }    /** The node type document walker. */    private final DOMWalker walker;    /** The namespaces associated with the node type XML document. */    private final Properties namespaces;    /** The namespace resolver. */    private final NamespaceResolver resolver;    /**     * Creates a node type definition file reader.     *     * @param xml node type definition file     * @throws IOException if the node type definition file cannot be read     */    public NodeTypeReader(InputStream xml) throws IOException {        walker = new DOMWalker(xml);        namespaces = walker.getNamespaces();        resolver = new AdditionalNamespaceResolver(namespaces);    }    /**     * Returns the namespaces declared in the node type definition     * file.     */    public Properties getNamespaces() {        return namespaces;    }    /**     * Returns all node type definitions specified by node type elements     * under the current element.     *     * @return node type definitions     * @throws InvalidNodeTypeDefException if a definition is invalid     * @throws NameException               if a definition contains an     *                                     illegal name     */    public NodeTypeDef[] getNodeTypeDefs()            throws InvalidNodeTypeDefException, NameException {        Vector defs = new Vector();        while (walker.iterateElements(Constants.NODETYPE_ELEMENT)) {            defs.add(getNodeTypeDef());        }        return (NodeTypeDef[]) defs.toArray(new NodeTypeDef[defs.size()]);    }    /**     * Returns the node type definition specified by the current element.     *     * @return node type definition     * @throws InvalidNodeTypeDefException if the definition is invalid     * @throws NameException               if the definition contains an     *                                     illegal name     */    private NodeTypeDef getNodeTypeDef()            throws InvalidNodeTypeDefException, NameException {        NodeTypeDef type = new NodeTypeDef();        type.setName(NameFormat.parse(                walker.getAttribute(Constants.NAME_ATTRIBUTE), resolver));        type.setMixin(Boolean.valueOf(                walker.getAttribute(Constants.ISMIXIN_ATTRIBUTE))                .booleanValue());        type.setOrderableChildNodes(Boolean.valueOf(                walker.getAttribute(Constants.HASORDERABLECHILDNODES_ATTRIBUTE))                .booleanValue());        String primaryItemName =            walker.getAttribute(Constants.PRIMARYITEMNAME_ATTRIBUTE);        if (primaryItemName != null && primaryItemName.length() > 0) {            type.setPrimaryItemName(                    NameFormat.parse(primaryItemName, resolver));        }        // supertype declarations        if (walker.enterElement(Constants.SUPERTYPES_ELEMENT)) {            Vector supertypes = new Vector();            while (walker.iterateElements(Constants.SUPERTYPE_ELEMENT)) {                supertypes.add(                        NameFormat.parse(walker.getContent(), resolver));            }            type.setSupertypes((QName[])                    supertypes.toArray(new QName[supertypes.size()]));            walker.leaveElement();        }        // property definitions        Vector properties = new Vector();        while (walker.iterateElements(Constants.PROPERTYDEFINITION_ELEMENT)) {            PropDefImpl def = getPropDef();            def.setDeclaringNodeType(type.getName());            properties.add(def);        }        type.setPropertyDefs((PropDef[])                properties.toArray(new PropDef[properties.size()]));        // child node definitions        Vector nodes = new Vector();        while (walker.iterateElements(Constants.CHILDNODEDEFINITION_ELEMENT)) {            NodeDefImpl def = getChildNodeDef();            def.setDeclaringNodeType(type.getName());            nodes.add(def);        }        type.setChildNodeDefs((NodeDef[])                nodes.toArray(new NodeDef[nodes.size()]));        return type;    }    /**     * Returns the property definition specified by the current element.     *     * @return property definition     * @throws InvalidNodeTypeDefException if the definition is invalid     * @throws NameException               if the definition contains an     *                                     illegal name     */    private PropDefImpl getPropDef()            throws InvalidNodeTypeDefException, NameException {        PropDefImpl def = new PropDefImpl();        String name = walker.getAttribute(Constants.NAME_ATTRIBUTE);        if (name.equals("*")) {            def.setName(ItemDef.ANY_NAME);        } else {            def.setName(NameFormat.parse(name, resolver));        }        // simple attributes        def.setAutoCreated(Boolean.valueOf(                walker.getAttribute(Constants.AUTOCREATED_ATTRIBUTE))                .booleanValue());        def.setMandatory(Boolean.valueOf(                walker.getAttribute(Constants.MANDATORY_ATTRIBUTE))                .booleanValue());        def.setProtected(Boolean.valueOf(                walker.getAttribute(Constants.PROTECTED_ATTRIBUTE))                .booleanValue());        def.setOnParentVersion(OnParentVersionAction.valueFromName(                walker.getAttribute(Constants.ONPARENTVERSION_ATTRIBUTE)));        def.setMultiple(Boolean.valueOf(                walker.getAttribute(Constants.MULTIPLE_ATTRIBUTE))                .booleanValue());        def.setRequiredType(PropertyType.valueFromName(                walker.getAttribute(Constants.REQUIREDTYPE_ATTRIBUTE)));        // value constraints        if (walker.enterElement(Constants.VALUECONSTRAINTS_ELEMENT)) {            Vector constraints = new Vector();            int type = def.getRequiredType();            while (walker.iterateElements(Constants.VALUECONSTRAINT_ELEMENT)) {                String constraint = walker.getContent();                try {                    constraints.add(ValueConstraint.create(                            type, constraint.trim(), resolver));                } catch (InvalidConstraintException e) {                    throw new InvalidNodeTypeDefException(                            "Invalid value constraint " + constraint, e);                }            }            def.setValueConstraints((ValueConstraint[]) constraints.toArray(                    new ValueConstraint[constraints.size()]));            walker.leaveElement();        }        // default values        if (walker.enterElement(Constants.DEFAULTVALUES_ELEMENT)) {            Vector values = new Vector();            int type = def.getRequiredType();            if (type == PropertyType.UNDEFINED) {                type = PropertyType.STRING;            }            while (walker.iterateElements(Constants.DEFAULTVALUE_ELEMENT)) {                String value = walker.getContent();                try {                    values.add(InternalValue.create(ValueHelper.convert(                            value, type, ValueFactoryImpl.getInstance()), resolver));                } catch (RepositoryException e) {                    throw new InvalidNodeTypeDefException(                            "Unable to create default value: " + value, e);                }            }            def.setDefaultValues((InternalValue[])                    values.toArray(new InternalValue[values.size()]));            walker.leaveElement();        }        return def;    }    /**     * Returns the child node definition specified by the current element.     *     * @return child node definition     * @throws NameException if the definition contains an illegal name     */    private NodeDefImpl getChildNodeDef() throws NameException {        NodeDefImpl def = new NodeDefImpl();        String name = walker.getAttribute(Constants.NAME_ATTRIBUTE);        if (name.equals("*")) {            def.setName(ItemDef.ANY_NAME);        } else {            def.setName(NameFormat.parse(name, resolver));        }        // simple attributes        def.setAutoCreated(Boolean.valueOf(                walker.getAttribute(Constants.AUTOCREATED_ATTRIBUTE))                .booleanValue());        def.setMandatory(Boolean.valueOf(                walker.getAttribute(Constants.MANDATORY_ATTRIBUTE))                .booleanValue());        def.setProtected(Boolean.valueOf(                walker.getAttribute(Constants.PROTECTED_ATTRIBUTE))                .booleanValue());        def.setOnParentVersion(OnParentVersionAction.valueFromName(                walker.getAttribute(Constants.ONPARENTVERSION_ATTRIBUTE)));        def.setAllowsSameNameSiblings(Boolean.valueOf(                walker.getAttribute(Constants.SAMENAMESIBLINGS_ATTRIBUTE))                .booleanValue());        // default primary type        String type =            walker.getAttribute(Constants.DEFAULTPRIMARYTYPE_ATTRIBUTE);        if (type != null && type.length() > 0) {            def.setDefaultPrimaryType(NameFormat.parse(type, resolver));        }        // required primary types        if (walker.enterElement(Constants.REQUIREDPRIMARYTYPES_ELEMENT)) {            Vector types = new Vector();            while (walker.iterateElements(Constants.REQUIREDPRIMARYTYPE_ELEMENT)) {                types.add(NameFormat.parse(walker.getContent(), resolver));            }            def.setRequiredPrimaryTypes(                    (QName[]) types.toArray(new QName[types.size()]));            walker.leaveElement();        } else {            /* Default to nt:base?            throw new InvalidNodeTypeDefException(                    "Required primary type(s) not defined for child node "                    + def.getName() + " of node type "                    + def.getDeclaringNodeType());            */        }        return def;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?