compactnodetypedefreader.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 692 行 · 第 1/2 页

JAVA
692
字号
/* * 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.compact;import org.apache.jackrabbit.core.nodetype.InvalidConstraintException;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.value.InternalValue;import org.apache.jackrabbit.name.NameException;import org.apache.jackrabbit.name.NoPrefixDeclaredException;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NameFormat;import org.apache.jackrabbit.util.name.NamespaceMapping;import org.apache.jackrabbit.util.ISO9075;import org.apache.jackrabbit.value.ValueHelper;import org.apache.jackrabbit.value.ValueFactoryImpl;import javax.jcr.NamespaceException;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.ValueFormatException;import javax.jcr.version.OnParentVersionAction;import java.io.Reader;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;/** * CompactNodeTypeDefReader. Parses node type definitions written in the compact * node type definition format and returns a list of NodeTypeDef objects that * can then be used to register node types. * <p/> * The EBNF grammar of the compact node type definition:<br> * <pre> * cnd ::= ns_mapping* node_type_def+ * * ns_mapping ::= "&lt;" prefix "=" namespace "&gt;" * * prefix ::= string * * namespace ::= string * * node_type_def ::= node_type_name [super_types] [options] {property_def | node_def} * * node_type_name ::= "[" string "]" * * super_types ::= "&gt;" string_list * * options ::= orderable_opt | mixin_opt | orderable_opt mixin_opt | mixin_opt orderable_opt * * orderable_opt ::= "orderable" | "ord" | "o" * * mixin_opt ::= "mixin" | "mix" | "m" * * property_def ::= "-" property_name [property_type_decl] [default_values] [attributes] [value_constraints] * * property_name ::= string * * property_type_decl ::= "(" property_type ")" * * property_type ::= "STRING" | "String |"string" | *                   "BINARY" | "Binary" | "binary" | *                   "LONG" | "Long" | "long" | *                   "DOUBLE" | "Double" | "double" | *                   "BOOLEAN" | "Boolean" | "boolean" | *                   "DATE" | "Date" | "date" | *                   "NAME | "Name | "name | *                   "PATH" | "Path" | "path" | *                   "REFERENCE" | "Reference" | "reference" | *                   "UNDEFINED" | "Undefined" | "undefined" | "*" * * * default_values ::= "=" string_list * * value_constraints ::= "&lt;" string_list * * node_def ::= "+" node_name [required_types] [default_type] [attributes] * * node_name ::= string * * required_types ::= "(" string_list ")" * * default_type ::= "=" string * * attributes ::= "primary" | "pri" | "!" | *                "autocreated" | "aut" | "a" | *                "mandatory" | "man" | "m" | *                "protected" | "pro" | "p" | *                "multiple" | "mul" | "*" | *                "COPY" | "Copy" | "copy" | *                "VERSION" | "Version" | "version" | *                "INITIALIZE" | "Initialize" | "initialize" | *                "COMPUTE" | "Compute" | "compute" | *                "IGNORE" | "Ignore" | "ignore" | *                "ABORT" | "Abort" | "abort" * * string_list ::= string {"," string} * * string ::= quoted_string | unquoted_string * * quoted_string :: = "'" unquoted_string "'" * * unquoted_string ::= [A-Za-z0-9:_]+ * </pre> */public class CompactNodeTypeDefReader {    /**     * the list of parsed nodetype defs     */    private List nodeTypeDefs = new LinkedList();    /**     * the current namespace mapping     */    private NamespaceMapping nsMapping;    /**     * the underlying lexer     */    private Lexer lexer;    /**     * the current token     */    private String currentToken;    /**     * Creates a new CND reader.     *     * @param r     * @throws ParseException     */    public CompactNodeTypeDefReader(Reader r, String systemId) throws ParseException {        this(r, systemId, new NamespaceMapping());    }    /**     * Creates a new CND reader.     *     * @param r     * @throws ParseException     */    public CompactNodeTypeDefReader(Reader r, String systemId, NamespaceMapping mapping)            throws ParseException {        lexer = new Lexer(r, systemId);        this.nsMapping = mapping;        nextToken();        parse();    }    /**     * Returns the list of parsed nodetype definitions.     *     * @return a List of NodeTypeDef objects     */    public List getNodeTypeDefs() {        return nodeTypeDefs;    }    /**     * Returns the namespace mapping.     *     * @return a NamespaceMapping object.     */    public NamespaceMapping getNamespaceMapping() {        return nsMapping;    }    /**     * Parses the definition     *     * @throws ParseException     */    private void parse() throws ParseException {        while (!currentTokenEquals(Lexer.EOF)) {            if (!doNameSpace()) {                break;            }        }        while (!currentTokenEquals(Lexer.EOF)) {            NodeTypeDef ntd = new NodeTypeDef();            ntd.setOrderableChildNodes(false);            ntd.setMixin(false);            ntd.setPrimaryItemName(null);            doNodeTypeName(ntd);            doSuperTypes(ntd);            doOptions(ntd);            doItemDefs(ntd);            nodeTypeDefs.add(ntd);        }    }    /**     * processes the namespace declaration     *     * @return     * @throws ParseException     */    private boolean doNameSpace() throws ParseException {        if (!currentTokenEquals('<')) {            return false;        }        nextToken();        String prefix = currentToken;        nextToken();        if (!currentTokenEquals('=')) {            lexer.fail("Missing = in namespace decl.");        }        nextToken();        String uri = currentToken;        nextToken();        if (!currentTokenEquals('>')) {            lexer.fail("Missing > in namespace decl.");        }        try {            nsMapping.setMapping(prefix, uri);        } catch (NamespaceException e) {            // ignore        }        nextToken();        return true;    }    /**     * processes the nodetype name     *     * @param ntd     * @throws ParseException     */    private void doNodeTypeName(NodeTypeDef ntd) throws ParseException {        if (!currentTokenEquals(Lexer.BEGIN_NODE_TYPE_NAME)) {            lexer.fail("Missing '" + Lexer.BEGIN_NODE_TYPE_NAME + "' delimiter for beginning of node type name");        }        nextToken();        ntd.setName(toQName(currentToken));        nextToken();        if (!currentTokenEquals(Lexer.END_NODE_TYPE_NAME)) {            lexer.fail("Missing '" + Lexer.END_NODE_TYPE_NAME + "' delimiter for end of node type name, found " + currentToken);        }        nextToken();    }    /**     * processes the superclasses     *     * @param ntd     * @throws ParseException     */    private void doSuperTypes(NodeTypeDef ntd) throws ParseException {        // a set would be nicer here, in case someone defines a supertype twice.        // but due to issue [JCR-333], the resulting node type definition is        // not symmetric anymore and the tests will fail.        ArrayList supertypes = new ArrayList();        if (!currentTokenEquals(Lexer.EXTENDS)) {            return;        }        do {            nextToken();            supertypes.add(toQName(currentToken));            nextToken();        } while (currentTokenEquals(Lexer.LIST_DELIMITER));        ntd.setSupertypes((QName[]) supertypes.toArray(new QName[0]));    }    /**     * processes the options     *     * @param ntd     * @throws ParseException     */    private void doOptions(NodeTypeDef ntd) throws ParseException {        if (currentTokenEquals(Lexer.ORDERABLE)) {            ntd.setOrderableChildNodes(true);            nextToken();            if (currentTokenEquals(Lexer.MIXIN)) {                ntd.setMixin(true);                nextToken();            }        } else if (currentTokenEquals(Lexer.MIXIN)) {            ntd.setMixin(true);            nextToken();            if (currentTokenEquals(Lexer.ORDERABLE)) {                ntd.setMixin(true);                nextToken();            }        }    }    /**     * processes the item definitions     *     * @param ntd     * @throws ParseException     */    private void doItemDefs(NodeTypeDef ntd) throws ParseException {        List propertyDefinitions = new ArrayList();        List nodeDefinitions = new ArrayList();        while (currentTokenEquals(Lexer.PROPERTY_DEFINITION) || currentTokenEquals(Lexer.CHILD_NODE_DEFINITION)) {            if (currentTokenEquals(Lexer.PROPERTY_DEFINITION)) {                PropDefImpl pdi = new PropDefImpl();                pdi.setAutoCreated(false);                pdi.setDeclaringNodeType(ntd.getName());                pdi.setDefaultValues(null);                pdi.setMandatory(false);                pdi.setMultiple(false);                pdi.setOnParentVersion(OnParentVersionAction.COPY);                pdi.setProtected(false);                pdi.setRequiredType(PropertyType.STRING);                pdi.setValueConstraints(null);                nextToken();                doPropertyDefinition(pdi, ntd);                propertyDefinitions.add(pdi);            } else if (currentTokenEquals(Lexer.CHILD_NODE_DEFINITION)) {                NodeDefImpl ndi = new NodeDefImpl();                ndi.setAllowsSameNameSiblings(false);                ndi.setAutoCreated(false);                ndi.setDeclaringNodeType(ntd.getName());                ndi.setMandatory(false);                ndi.setOnParentVersion(OnParentVersionAction.COPY);                ndi.setProtected(false);

⌨️ 快捷键说明

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