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 ::= "<" prefix "=" namespace ">" * * prefix ::= string * * namespace ::= string * * node_type_def ::= node_type_name [super_types] [options] {property_def | node_def} * * node_type_name ::= "[" string "]" * * super_types ::= ">" 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 ::= "<" 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 + -
显示快捷键?