You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by fi...@apache.org on 2005/11/26 06:41:17 UTC
svn commit: r349083 [1/2] - in
/incubator/jackrabbit/trunk/contrib/compact-nt: ./
src/java/org/apache/jackrabbit/core/nodetype/compact/
Author: fielding
Date: Fri Nov 25 21:41:13 2005
New Revision: 349083
URL: http://svn.apache.org/viewcvs?rev=349083&view=rev
Log:
correct eol-style
Modified:
incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/project.properties (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/project.xml (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java (contents, props changed)
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java (contents, props changed)
Modified: incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml?rev=349083&r1=349082&r2=349083&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml (original)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml Fri Nov 25 21:41:13 2005
@@ -1,23 +1,23 @@
-<!--
- Copyright 2004-2005 The Apache Software Foundation or its licensors,
- as applicable.
-
- Licensed 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.
--->
-<project
- default="jar:jar"
- xmlns:deploy="deploy"
- xmlns:j="jelly:core"
- xmlns:ant="jelly:ant"
- xmlns:maven="jelly:maven">
+<!--
+ Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ as applicable.
+
+ Licensed 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.
+-->
+<project
+ default="jar:jar"
+ xmlns:deploy="deploy"
+ xmlns:j="jelly:core"
+ xmlns:ant="jelly:ant"
+ xmlns:maven="jelly:maven">
</project>
Propchange: incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/compact-nt/project.properties
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/project.properties?rev=349083&r1=349082&r2=349083&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/project.properties (original)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/project.properties Fri Nov 25 21:41:13 2005
@@ -1,106 +1,106 @@
-# Copyright 2003-2005 The Apache Software Foundation or its licensors,
-# as applicable
-#
-# Licensed 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.
-
-######################################################################
-# Apache Central Repository
-######################################################################
-maven.repo.central=www.apache.org
-maven.repo.central.directory=/www/www.apache.org/dist/java-repository
-maven.remote.group=apcvs
-maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory
-
-######################################################################
-# JUnit Testing
-######################################################################
-maven.test.failure = false
-maven.junit.fork=true
-#maven.junit.sysproperties=org.xml.sax.driver java.security.auth.login.config
-maven.junit.sysproperties=org.xml.sax.driver
-org.xml.sax.driver=org.apache.xerces.parsers.SAXParser
-#java.security.auth.login.config=applications/test/jaas.config
-
-
-#If you wish to skip tests when doing builds, uncomment
-#maven.test.skip = true
-
-######################################################################
-# Checkstyle
-######################################################################
-maven.checkstyle.properties= checkstyle.xml
-maven.linkcheck.enable=false
-
-######################################################################
-# JavaDoc
-#
-# javadoc urls can be added here, multiple urls are appended using a comma
-#
-# maven.javadoc.links = http://foo/bar/api,\
-# http://flim/flam/api/
-######################################################################
-maven.javadoc.links=http://java.sun.com/j2se/1.4.2/docs/api/,http://www.day.com/maven/jsr170/javadocs/jcr-0.16.4.1/
-maven.javadoc.author=false
-maven.javadoc.version=false
-
-######################################################################
-# Other opts
-######################################################################
-# uncomment the next line to work in offline mode (no jar download & no linkcheck)
-#maven.mode.online=
-
-maven.compile.debug=on
-maven.compile.deprecation=off
-maven.compile.optimize=off
-maven.compile.source=1.4
-maven.compile.target=1.4
-
-maven.jarResources.basedir=src/java
-maven.jar.excludes=**/package.html
-
-# Location of the generated query language parsers. Needed for
-# the Maven Eclipse plugin to automatically locate the generated
-# source files. Note that this value matches the hardcoded path
-# in the Maven JavaCC plugin. Therefore, do not change this value!
-maven.gen.src=${maven.build.dir}/generated-src/main
-
-# specifying additional remote repository for downloading dependencies
-# not available at www.ibiblio.org/maven/
-maven.repo.remote = http://www.ibiblio.org/maven/,http://www.day.com/maven/
-
-######################################################################
-# Site L&F
-######################################################################
-# maven.xdoc.jsl=
-maven.xdoc.date=
-maven.xdoc.poweredby.image=maven-feather.png
-maven.xdoc.version=${pom.currentVersion}
-maven.xdoc.developmentProcessUrl=http://incubator.apache.org/projects/jackrabbit.html
-maven.changelog.range=60
-maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory
-maven.multiproject.overviewPage.title=Jackrabbit components
-
-# ------------------------------------------------------------------------
-# M A V E N J A R O V E R R I D E
-# ------------------------------------------------------------------------
-#maven.jar.override = on
-#maven.jar.jcr = ${basedir}/lib/jcr.jar
-
-######################################################################
-# Site Deploy (into ../jackrabbit-site for checkout on incubator.apache.org)
-######################################################################
-maven.site.deploy.method=fs
-
-# IDE settings
-maven.eclipse.resources.addtoclasspath=true
-
+# Copyright 2003-2005 The Apache Software Foundation or its licensors,
+# as applicable
+#
+# Licensed 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.
+
+######################################################################
+# Apache Central Repository
+######################################################################
+maven.repo.central=www.apache.org
+maven.repo.central.directory=/www/www.apache.org/dist/java-repository
+maven.remote.group=apcvs
+maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory
+
+######################################################################
+# JUnit Testing
+######################################################################
+maven.test.failure = false
+maven.junit.fork=true
+#maven.junit.sysproperties=org.xml.sax.driver java.security.auth.login.config
+maven.junit.sysproperties=org.xml.sax.driver
+org.xml.sax.driver=org.apache.xerces.parsers.SAXParser
+#java.security.auth.login.config=applications/test/jaas.config
+
+
+#If you wish to skip tests when doing builds, uncomment
+#maven.test.skip = true
+
+######################################################################
+# Checkstyle
+######################################################################
+maven.checkstyle.properties= checkstyle.xml
+maven.linkcheck.enable=false
+
+######################################################################
+# JavaDoc
+#
+# javadoc urls can be added here, multiple urls are appended using a comma
+#
+# maven.javadoc.links = http://foo/bar/api,\
+# http://flim/flam/api/
+######################################################################
+maven.javadoc.links=http://java.sun.com/j2se/1.4.2/docs/api/,http://www.day.com/maven/jsr170/javadocs/jcr-0.16.4.1/
+maven.javadoc.author=false
+maven.javadoc.version=false
+
+######################################################################
+# Other opts
+######################################################################
+# uncomment the next line to work in offline mode (no jar download & no linkcheck)
+#maven.mode.online=
+
+maven.compile.debug=on
+maven.compile.deprecation=off
+maven.compile.optimize=off
+maven.compile.source=1.4
+maven.compile.target=1.4
+
+maven.jarResources.basedir=src/java
+maven.jar.excludes=**/package.html
+
+# Location of the generated query language parsers. Needed for
+# the Maven Eclipse plugin to automatically locate the generated
+# source files. Note that this value matches the hardcoded path
+# in the Maven JavaCC plugin. Therefore, do not change this value!
+maven.gen.src=${maven.build.dir}/generated-src/main
+
+# specifying additional remote repository for downloading dependencies
+# not available at www.ibiblio.org/maven/
+maven.repo.remote = http://www.ibiblio.org/maven/,http://www.day.com/maven/
+
+######################################################################
+# Site L&F
+######################################################################
+# maven.xdoc.jsl=
+maven.xdoc.date=
+maven.xdoc.poweredby.image=maven-feather.png
+maven.xdoc.version=${pom.currentVersion}
+maven.xdoc.developmentProcessUrl=http://incubator.apache.org/projects/jackrabbit.html
+maven.changelog.range=60
+maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory
+maven.multiproject.overviewPage.title=Jackrabbit components
+
+# ------------------------------------------------------------------------
+# M A V E N J A R O V E R R I D E
+# ------------------------------------------------------------------------
+#maven.jar.override = on
+#maven.jar.jcr = ${basedir}/lib/jcr.jar
+
+######################################################################
+# Site Deploy (into ../jackrabbit-site for checkout on incubator.apache.org)
+######################################################################
+maven.site.deploy.method=fs
+
+# IDE settings
+maven.eclipse.resources.addtoclasspath=true
+
Propchange: incubator/jackrabbit/trunk/contrib/compact-nt/project.properties
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/compact-nt/project.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/project.xml?rev=349083&r1=349082&r2=349083&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/project.xml (original)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/project.xml Fri Nov 25 21:41:13 2005
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project>
- <pomVersion>3</pomVersion>
- <groupId>org.apache.jackrabbit</groupId>
- <artifactId>compact-nt</artifactId>
- <name>JCR Compact Node Type Definition Reader and Writer</name>
- <currentVersion>1.0-SNAPSHOT</currentVersion>
- <organization>
- <name>The Apache Software Foundation</name>
- <url>http://incubator.apache.org/projects/jackrabbit.html</url>
- <logo>http://incubator.apache.org/images/apache-incubator-logo.png</logo>
- </organization>
- <inceptionYear>2005</inceptionYear>
- <package>org.apache.jackrabbit.core.nodetype.compact</package>
- <description>
- JCR Compact Node Type Definition Reader and Writer.
- </description>
- <dependencies>
- <dependency>
- <groupId>org.apache.jackrabbit</groupId>
- <artifactId>jackrabbit</artifactId>
- <version>${pom.currentVersion}</version>
- </dependency>
- <dependency>
- <groupId>jsr170</groupId>
- <artifactId>jcr</artifactId>
- <version>1.0</version>
- <url>http://jcp.org/en/jsr/detail?id=170</url>
- </dependency>
- </dependencies>
- <build>
- <sourceDirectory>src/java</sourceDirectory>
- </build>
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <pomVersion>3</pomVersion>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>compact-nt</artifactId>
+ <name>JCR Compact Node Type Definition Reader and Writer</name>
+ <currentVersion>1.0-SNAPSHOT</currentVersion>
+ <organization>
+ <name>The Apache Software Foundation</name>
+ <url>http://incubator.apache.org/projects/jackrabbit.html</url>
+ <logo>http://incubator.apache.org/images/apache-incubator-logo.png</logo>
+ </organization>
+ <inceptionYear>2005</inceptionYear>
+ <package>org.apache.jackrabbit.core.nodetype.compact</package>
+ <description>
+ JCR Compact Node Type Definition Reader and Writer.
+ </description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit</artifactId>
+ <version>${pom.currentVersion}</version>
+ </dependency>
+ <dependency>
+ <groupId>jsr170</groupId>
+ <artifactId>jcr</artifactId>
+ <version>1.0</version>
+ <url>http://jcp.org/en/jsr/detail?id=170</url>
+ </dependency>
+ </dependencies>
+ <build>
+ <sourceDirectory>src/java</sourceDirectory>
+ </build>
</project>
Propchange: incubator/jackrabbit/trunk/contrib/compact-nt/project.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java?rev=349083&r1=349082&r2=349083&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java (original)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java Fri Nov 25 21:41:13 2005
@@ -1,662 +1,662 @@
-/*
- * Copyright 2004-2005 The Apache Software Foundation or its licensors,
- * as applicable.
- *
- * Licensed 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.NodeTypeDef;
-import org.apache.jackrabbit.core.nodetype.PropDefImpl;
-import org.apache.jackrabbit.core.nodetype.NodeDefImpl;
-import org.apache.jackrabbit.core.nodetype.ItemDef;
-import org.apache.jackrabbit.core.nodetype.NodeDef;
-import org.apache.jackrabbit.core.nodetype.PropDef;
-import org.apache.jackrabbit.core.nodetype.ValueConstraint;
-import org.apache.jackrabbit.core.nodetype.InvalidConstraintException;
-import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-
-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;
-import java.util.HashSet;
-import java.util.Arrays;
-
-/**
- * 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 BNF grammar of the compact node type definition:<br>
- * <xmp>
- * node_type_defs ::= { ns_mapping | node_type_def };
- * ns_mapping ::= "<" string "=" string ">";
- * node_type_def ::= node_type [super_types] options item_defs;
- * node_type ::= "[" string "]";
- * super_types ::= ">" string_list;
- * options ::= [ "orderable" | "ord" | "o" | "mixin" | "mix" | "m" ];
- * item_defs ::= { item_def };
- * item_def ::= property_def | node_def;
- * property_def ::= "-" string property_type_decl [default_values]
- * [value_constraints] attributes;
- * property_type_decl ::= "(" property_type ")";
- * default_values ::= "=" string_list;
- * value_constraints ::= "<" string_list;
- * node_def ::= "+" string [required_types] [default_type] attributes;
- * required_types ::= "(" string_list ")";
- * default_type ::= "=" string;
- * attributes ::= [ attr_primary ]
- * [ attr_autocreat ]
- * [ attr_mandatory ]
- * [ attr_protected ]
- * [ attr_multiple ]
- * [ attr_onversion ];
- * attr_primary ::= "primary" | "pri" | "!";
- * attr_autocreat ::= "autocreated" | "aut" | "a";
- * attr_mandatory ::= "mandatory" | "man" | "m";
- * attr_protected ::= "protected" | "pro" | "p";
- * attr_multiple ::= "multiple" | "mul" | "*";
- * attr_onversion ::= "COPY" | "Copy" | "copy"
- * | "VERSION" | "Version" | "version"
- * | "INITIALIZE" | "Initialize" | "initialize"
- * | "COMPUTE" | "Compute" | "compute"
- * | "IGNORE" | "Ignore" | "ignore"
- * | "ABORT" | "Abort" | "abort";
- * 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" | "*";
- * string_list ::= string { "," string };
- * string ::= quoted_string | unquoted_string;
- * quoted_string :: = "'" unquoted_string "'";
- * unquoted_string ::= ...a string...;
- * </xmp>
- */
-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;
- }
-
- /**
- * parses the definition
- *
- * @throws ParseException
- */
- private void parse() throws ParseException {
- while (!currentTokenEquals(Lexer.EOF)) {
- if (doNameSpace()) {
- continue;
- }
- NodeTypeDef ntd = new NodeTypeDef();
- ntd.setOrderableChildNodes(false);
- ntd.setMixin(false);
- ntd.setPrimaryItemName(null);
- doNodeTypeName(ntd);
- doSuperClasses(ntd);
- doOptions(ntd);
- // add nt:base to superclasses if not mixin
- if (!ntd.isMixin()) {
- HashSet superTypes = new HashSet(Arrays.asList(ntd.getSupertypes()));
- if (!superTypes.contains(QName.NT_BASE)) {
- superTypes.add(QName.NT_BASE);
- ntd.setSupertypes((QName[]) superTypes.toArray(new QName[superTypes.size()]));
- }
- }
- 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");
- }
- nextToken();
- }
-
- /**
- * processes the superclasses
- *
- * @param ntd
- * @throws ParseException
- */
- private void doSuperClasses(NodeTypeDef ntd) throws ParseException {
- List 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);
- ndi.setDefaultPrimaryType(null);
- ndi.setRequiredPrimaryTypes(new QName[]{QName.NT_BASE});
-
- nextToken();
- doChildNodeDefinition(ndi, ntd);
- nodeDefinitions.add(ndi);
- }
- }
-
- if (propertyDefinitions.size() > 0) {
- ntd.setPropertyDefs((PropDef[]) propertyDefinitions.toArray(new PropDef[0]));
- }
-
- if (nodeDefinitions.size() > 0) {
- ntd.setChildNodeDefs((NodeDef[]) nodeDefinitions.toArray(new NodeDef[0]));
- }
- }
-
- /**
- * processes the property definition
- *
- * @param pdi
- * @param ntd
- * @throws ParseException
- */
- private void doPropertyDefinition(PropDefImpl pdi, NodeTypeDef ntd)
- throws ParseException {
- if (currentToken.equals("*")) {
- pdi.setName(ItemDef.ANY_NAME);
- } else {
- pdi.setName(toQName(currentToken));
- }
- nextToken();
- doPropertyType(pdi);
- doPropertyDefaultValue(pdi);
- doPropertyAttributes(pdi, ntd);
- doPropertyValueConstraints(pdi);
- }
-
- /**
- * processes the property type
- *
- * @param pdi
- * @throws ParseException
- */
- private void doPropertyType(PropDefImpl pdi) throws ParseException {
- if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
- return;
- }
- nextToken();
- if (currentTokenEquals(Lexer.STRING)) {
- pdi.setRequiredType(PropertyType.STRING);
- } else if (currentTokenEquals(Lexer.BINARY)) {
- pdi.setRequiredType(PropertyType.BINARY);
- } else if (currentTokenEquals(Lexer.LONG)) {
- pdi.setRequiredType(PropertyType.LONG);
- } else if (currentTokenEquals(Lexer.DOUBLE)) {
- pdi.setRequiredType(PropertyType.DOUBLE);
- } else if (currentTokenEquals(Lexer.BOOLEAN)) {
- pdi.setRequiredType(PropertyType.BOOLEAN);
- } else if (currentTokenEquals(Lexer.DATE)) {
- pdi.setRequiredType(PropertyType.DATE);
- } else if (currentTokenEquals(Lexer.NAME)) {
- pdi.setRequiredType(PropertyType.NAME);
- } else if (currentTokenEquals(Lexer.PATH)) {
- pdi.setRequiredType(PropertyType.PATH);
- } else if (currentTokenEquals(Lexer.REFERENCE)) {
- pdi.setRequiredType(PropertyType.REFERENCE);
- } else if (currentTokenEquals(Lexer.UNDEFINED)) {
- pdi.setRequiredType(PropertyType.UNDEFINED);
- } else {
- lexer.fail("Unkown property type '" + currentToken + "' specified");
- }
- nextToken();
- if (!currentTokenEquals(Lexer.END_TYPE)) {
- lexer.fail("Missing '" + Lexer.END_TYPE + "' delimiter for end of property type");
- }
- nextToken();
- }
-
- /**
- * processes the property attributes
- *
- * @param pdi
- * @param ntd
- * @throws ParseException
- */
- private void doPropertyAttributes(PropDefImpl pdi, NodeTypeDef ntd) throws ParseException {
- while (currentTokenEquals(Lexer.ATTRIBUTE)) {
- if (currentTokenEquals(Lexer.PRIMARY)) {
- if (ntd.getPrimaryItemName() != null) {
- String name = null;
- try {
- name = nsMapping.getJCRName(ntd.getName());
- } catch (NoPrefixDeclaredException e) {
- // Should never happen, checked earlier
- }
- lexer.fail("More than one primary item specified in node type '" + name + "'");
- }
- ntd.setPrimaryItemName(pdi.getName());
- } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
- pdi.setAutoCreated(true);
- } else if (currentTokenEquals(Lexer.MANDATORY)) {
- pdi.setMandatory(true);
- } else if (currentTokenEquals(Lexer.PROTECTED)) {
- pdi.setProtected(true);
- } else if (currentTokenEquals(Lexer.MULTIPLE)) {
- pdi.setMultiple(true);
- } else if (currentTokenEquals(Lexer.COPY)) {
- pdi.setOnParentVersion(OnParentVersionAction.COPY);
- } else if (currentTokenEquals(Lexer.VERSION)) {
- pdi.setOnParentVersion(OnParentVersionAction.VERSION);
- } else if (currentTokenEquals(Lexer.INITIALIZE)) {
- pdi.setOnParentVersion(OnParentVersionAction.INITIALIZE);
- } else if (currentTokenEquals(Lexer.COMPUTE)) {
- pdi.setOnParentVersion(OnParentVersionAction.COMPUTE);
- } else if (currentTokenEquals(Lexer.IGNORE)) {
- pdi.setOnParentVersion(OnParentVersionAction.IGNORE);
- } else if (currentTokenEquals(Lexer.ABORT)) {
- pdi.setOnParentVersion(OnParentVersionAction.ABORT);
- }
- nextToken();
- }
- }
-
- /**
- * processes the property default values
- *
- * @param pdi
- * @throws ParseException
- */
- private void doPropertyDefaultValue(PropDefImpl pdi) throws ParseException {
- if (!currentTokenEquals(Lexer.DEFAULT)) {
- return;
- }
- List defaultValues = new ArrayList();
- do {
- nextToken();
- InternalValue value = null;
- try {
- value = InternalValue.create(currentToken, pdi.getRequiredType(), nsMapping);
- } catch (ValueFormatException e) {
- lexer.fail("'" + currentToken + "' is not a valid string representation of a value of type " + pdi.getRequiredType());
- } catch (RepositoryException e) {
- lexer.fail("An error occured during value conversion of '" + currentToken + "'");
- }
- defaultValues.add(value);
- nextToken();
- } while (currentTokenEquals(Lexer.LIST_DELIMITER));
- pdi.setDefaultValues((InternalValue[]) defaultValues.toArray(new InternalValue[0]));
- }
-
- /**
- * processes the property value constraints
- *
- * @param pdi
- * @throws ParseException
- */
- private void doPropertyValueConstraints(PropDefImpl pdi) throws ParseException {
- if (!currentTokenEquals(Lexer.CONSTRAINT)) {
- return;
- }
- List constraints = new ArrayList();
- do {
- nextToken();
- ValueConstraint constraint = null;
- try {
- constraint = ValueConstraint.create(pdi.getRequiredType(), currentToken, nsMapping);
- } catch (InvalidConstraintException e) {
- lexer.fail("'" + currentToken + "' is not a valid constraint expression for a value of type " + pdi.getRequiredType());
- }
- constraints.add(constraint);
- nextToken();
- } while (currentTokenEquals(Lexer.LIST_DELIMITER));
- pdi.setValueConstraints((ValueConstraint[]) constraints.toArray(new ValueConstraint[0]));
- }
-
- /**
- * processes the childnode definition
- *
- * @param ndi
- * @param ntd
- * @throws ParseException
- */
- private void doChildNodeDefinition(NodeDefImpl ndi, NodeTypeDef ntd)
- throws ParseException {
- if (currentTokenEquals('*')) {
- ndi.setName(ItemDef.ANY_NAME);
- } else {
- ndi.setName(toQName(currentToken));
- }
- nextToken();
- doChildNodeRequiredTypes(ndi);
- doChildNodeDefaultType(ndi);
- doChildNodeAttributes(ndi, ntd);
- }
-
- /**
- * processes the childnode required types
- *
- * @param ndi
- * @throws ParseException
- */
- private void doChildNodeRequiredTypes(NodeDefImpl ndi) throws ParseException {
- if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
- return;
- }
- List types = new ArrayList();
- do {
- nextToken();
- types.add(toQName(currentToken));
- nextToken();
- } while (currentTokenEquals(Lexer.LIST_DELIMITER));
- ndi.setRequiredPrimaryTypes((QName[]) types.toArray(new QName[0]));
- nextToken();
- }
-
- /**
- * processes the childnode default types
- *
- * @param ndi
- * @throws ParseException
- */
- private void doChildNodeDefaultType(NodeDefImpl ndi) throws ParseException {
- if (!currentTokenEquals(Lexer.DEFAULT)) {
- return;
- }
- nextToken();
- ndi.setDefaultPrimaryType(toQName(currentToken));
- nextToken();
- }
-
- /**
- * processes the childnode attributes
- *
- * @param ndi
- * @param ntd
- * @throws ParseException
- */
- private void doChildNodeAttributes(NodeDefImpl ndi, NodeTypeDef ntd) throws ParseException {
- while (currentTokenEquals(Lexer.ATTRIBUTE)) {
- if (currentTokenEquals(Lexer.PRIMARY)) {
- if (ntd.getPrimaryItemName() != null) {
- String name = null;
- try {
- name = nsMapping.getJCRName(ntd.getName());
- } catch (NoPrefixDeclaredException e) {
- // Should never happen, checked earlier
- }
- lexer.fail("More than one primary item specified in node type '" + name + "'");
- }
- ntd.setPrimaryItemName(ndi.getName());
- } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
- ndi.setAutoCreated(true);
- } else if (currentTokenEquals(Lexer.MANDATORY)) {
- ndi.setMandatory(true);
- } else if (currentTokenEquals(Lexer.PROTECTED)) {
- ndi.setProtected(true);
- } else if (currentTokenEquals(Lexer.MULTIPLE)) {
- ndi.setAllowsSameNameSiblings(true);
- } else if (currentTokenEquals(Lexer.COPY)) {
- ndi.setOnParentVersion(OnParentVersionAction.COPY);
- } else if (currentTokenEquals(Lexer.VERSION)) {
- ndi.setOnParentVersion(OnParentVersionAction.VERSION);
- } else if (currentTokenEquals(Lexer.INITIALIZE)) {
- ndi.setOnParentVersion(OnParentVersionAction.INITIALIZE);
- } else if (currentTokenEquals(Lexer.COMPUTE)) {
- ndi.setOnParentVersion(OnParentVersionAction.COMPUTE);
- } else if (currentTokenEquals(Lexer.IGNORE)) {
- ndi.setOnParentVersion(OnParentVersionAction.IGNORE);
- } else if (currentTokenEquals(Lexer.ABORT)) {
- ndi.setOnParentVersion(OnParentVersionAction.ABORT);
- }
- nextToken();
- }
- }
-
- /**
- * Converts the given string into a qualified name using the current
- * namespace mapping.
- *
- * @param stringName
- * @return the qualified name
- * @throws ParseException if the conversion fails
- */
- private QName toQName(String stringName) throws ParseException {
- try {
- return QName.fromJCRName(stringName, nsMapping);
- } catch (IllegalNameException e) {
- lexer.fail("Error while parsing '" + stringName + "'", e);
- return null;
- } catch (UnknownPrefixException e) {
- lexer.fail("Error while parsing '" + stringName + "'", e);
- return null;
- }
- }
-
- /**
- * Gets the next token from the underlying lexer.
- *
- * @see Lexer#getNextToken()
- * @throws ParseException if the lexer fails to get the next token.
- */
- private void nextToken() throws ParseException {
- currentToken = lexer.getNextToken();
- }
-
- /**
- * Checks if the {@link #currentToken} is semantically equal to the given
- * argument.
- *
- * @param s the tokens to compare with
- * @return <code>true</code> if equals; <code>false</code> otherwise.
- */
- private boolean currentTokenEquals(String[] s) {
- for (int i = 0; i < s.length; i++) {
- if (currentToken.equals(s[i])) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Checks if the {@link #currentToken} is semantically equal to the given
- * argument.
- *
- * @param c the tokens to compare with
- * @return <code>true</code> if equals; <code>false</code> otherwise.
- */
- private boolean currentTokenEquals(char c) {
- return currentToken.length() == 1 && currentToken.charAt(0) == c;
- }
-
- /**
- * Checks if the {@link #currentToken} is semantically equal to the given
- * argument.
- *
- * @param s the tokens to compare with
- * @return <code>true</code> if equals; <code>false</code> otherwise.
- */
- private boolean currentTokenEquals(String s) {
- return currentToken.equals(s);
- }
-
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ * as applicable.
+ *
+ * Licensed 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.NodeTypeDef;
+import org.apache.jackrabbit.core.nodetype.PropDefImpl;
+import org.apache.jackrabbit.core.nodetype.NodeDefImpl;
+import org.apache.jackrabbit.core.nodetype.ItemDef;
+import org.apache.jackrabbit.core.nodetype.NodeDef;
+import org.apache.jackrabbit.core.nodetype.PropDef;
+import org.apache.jackrabbit.core.nodetype.ValueConstraint;
+import org.apache.jackrabbit.core.nodetype.InvalidConstraintException;
+import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NoPrefixDeclaredException;
+import org.apache.jackrabbit.name.IllegalNameException;
+import org.apache.jackrabbit.name.UnknownPrefixException;
+
+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;
+import java.util.HashSet;
+import java.util.Arrays;
+
+/**
+ * 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 BNF grammar of the compact node type definition:<br>
+ * <xmp>
+ * node_type_defs ::= { ns_mapping | node_type_def };
+ * ns_mapping ::= "<" string "=" string ">";
+ * node_type_def ::= node_type [super_types] options item_defs;
+ * node_type ::= "[" string "]";
+ * super_types ::= ">" string_list;
+ * options ::= [ "orderable" | "ord" | "o" | "mixin" | "mix" | "m" ];
+ * item_defs ::= { item_def };
+ * item_def ::= property_def | node_def;
+ * property_def ::= "-" string property_type_decl [default_values]
+ * [value_constraints] attributes;
+ * property_type_decl ::= "(" property_type ")";
+ * default_values ::= "=" string_list;
+ * value_constraints ::= "<" string_list;
+ * node_def ::= "+" string [required_types] [default_type] attributes;
+ * required_types ::= "(" string_list ")";
+ * default_type ::= "=" string;
+ * attributes ::= [ attr_primary ]
+ * [ attr_autocreat ]
+ * [ attr_mandatory ]
+ * [ attr_protected ]
+ * [ attr_multiple ]
+ * [ attr_onversion ];
+ * attr_primary ::= "primary" | "pri" | "!";
+ * attr_autocreat ::= "autocreated" | "aut" | "a";
+ * attr_mandatory ::= "mandatory" | "man" | "m";
+ * attr_protected ::= "protected" | "pro" | "p";
+ * attr_multiple ::= "multiple" | "mul" | "*";
+ * attr_onversion ::= "COPY" | "Copy" | "copy"
+ * | "VERSION" | "Version" | "version"
+ * | "INITIALIZE" | "Initialize" | "initialize"
+ * | "COMPUTE" | "Compute" | "compute"
+ * | "IGNORE" | "Ignore" | "ignore"
+ * | "ABORT" | "Abort" | "abort";
+ * 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" | "*";
+ * string_list ::= string { "," string };
+ * string ::= quoted_string | unquoted_string;
+ * quoted_string :: = "'" unquoted_string "'";
+ * unquoted_string ::= ...a string...;
+ * </xmp>
+ */
+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;
+ }
+
+ /**
+ * parses the definition
+ *
+ * @throws ParseException
+ */
+ private void parse() throws ParseException {
+ while (!currentTokenEquals(Lexer.EOF)) {
+ if (doNameSpace()) {
+ continue;
+ }
+ NodeTypeDef ntd = new NodeTypeDef();
+ ntd.setOrderableChildNodes(false);
+ ntd.setMixin(false);
+ ntd.setPrimaryItemName(null);
+ doNodeTypeName(ntd);
+ doSuperClasses(ntd);
+ doOptions(ntd);
+ // add nt:base to superclasses if not mixin
+ if (!ntd.isMixin()) {
+ HashSet superTypes = new HashSet(Arrays.asList(ntd.getSupertypes()));
+ if (!superTypes.contains(QName.NT_BASE)) {
+ superTypes.add(QName.NT_BASE);
+ ntd.setSupertypes((QName[]) superTypes.toArray(new QName[superTypes.size()]));
+ }
+ }
+ 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");
+ }
+ nextToken();
+ }
+
+ /**
+ * processes the superclasses
+ *
+ * @param ntd
+ * @throws ParseException
+ */
+ private void doSuperClasses(NodeTypeDef ntd) throws ParseException {
+ List 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);
+ ndi.setDefaultPrimaryType(null);
+ ndi.setRequiredPrimaryTypes(new QName[]{QName.NT_BASE});
+
+ nextToken();
+ doChildNodeDefinition(ndi, ntd);
+ nodeDefinitions.add(ndi);
+ }
+ }
+
+ if (propertyDefinitions.size() > 0) {
+ ntd.setPropertyDefs((PropDef[]) propertyDefinitions.toArray(new PropDef[0]));
+ }
+
+ if (nodeDefinitions.size() > 0) {
+ ntd.setChildNodeDefs((NodeDef[]) nodeDefinitions.toArray(new NodeDef[0]));
+ }
+ }
+
+ /**
+ * processes the property definition
+ *
+ * @param pdi
+ * @param ntd
+ * @throws ParseException
+ */
+ private void doPropertyDefinition(PropDefImpl pdi, NodeTypeDef ntd)
+ throws ParseException {
+ if (currentToken.equals("*")) {
+ pdi.setName(ItemDef.ANY_NAME);
+ } else {
+ pdi.setName(toQName(currentToken));
+ }
+ nextToken();
+ doPropertyType(pdi);
+ doPropertyDefaultValue(pdi);
+ doPropertyAttributes(pdi, ntd);
+ doPropertyValueConstraints(pdi);
+ }
+
+ /**
+ * processes the property type
+ *
+ * @param pdi
+ * @throws ParseException
+ */
+ private void doPropertyType(PropDefImpl pdi) throws ParseException {
+ if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
+ return;
+ }
+ nextToken();
+ if (currentTokenEquals(Lexer.STRING)) {
+ pdi.setRequiredType(PropertyType.STRING);
+ } else if (currentTokenEquals(Lexer.BINARY)) {
+ pdi.setRequiredType(PropertyType.BINARY);
+ } else if (currentTokenEquals(Lexer.LONG)) {
+ pdi.setRequiredType(PropertyType.LONG);
+ } else if (currentTokenEquals(Lexer.DOUBLE)) {
+ pdi.setRequiredType(PropertyType.DOUBLE);
+ } else if (currentTokenEquals(Lexer.BOOLEAN)) {
+ pdi.setRequiredType(PropertyType.BOOLEAN);
+ } else if (currentTokenEquals(Lexer.DATE)) {
+ pdi.setRequiredType(PropertyType.DATE);
+ } else if (currentTokenEquals(Lexer.NAME)) {
+ pdi.setRequiredType(PropertyType.NAME);
+ } else if (currentTokenEquals(Lexer.PATH)) {
+ pdi.setRequiredType(PropertyType.PATH);
+ } else if (currentTokenEquals(Lexer.REFERENCE)) {
+ pdi.setRequiredType(PropertyType.REFERENCE);
+ } else if (currentTokenEquals(Lexer.UNDEFINED)) {
+ pdi.setRequiredType(PropertyType.UNDEFINED);
+ } else {
+ lexer.fail("Unkown property type '" + currentToken + "' specified");
+ }
+ nextToken();
+ if (!currentTokenEquals(Lexer.END_TYPE)) {
+ lexer.fail("Missing '" + Lexer.END_TYPE + "' delimiter for end of property type");
+ }
+ nextToken();
+ }
+
+ /**
+ * processes the property attributes
+ *
+ * @param pdi
+ * @param ntd
+ * @throws ParseException
+ */
+ private void doPropertyAttributes(PropDefImpl pdi, NodeTypeDef ntd) throws ParseException {
+ while (currentTokenEquals(Lexer.ATTRIBUTE)) {
+ if (currentTokenEquals(Lexer.PRIMARY)) {
+ if (ntd.getPrimaryItemName() != null) {
+ String name = null;
+ try {
+ name = nsMapping.getJCRName(ntd.getName());
+ } catch (NoPrefixDeclaredException e) {
+ // Should never happen, checked earlier
+ }
+ lexer.fail("More than one primary item specified in node type '" + name + "'");
+ }
+ ntd.setPrimaryItemName(pdi.getName());
+ } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
+ pdi.setAutoCreated(true);
+ } else if (currentTokenEquals(Lexer.MANDATORY)) {
+ pdi.setMandatory(true);
+ } else if (currentTokenEquals(Lexer.PROTECTED)) {
+ pdi.setProtected(true);
+ } else if (currentTokenEquals(Lexer.MULTIPLE)) {
+ pdi.setMultiple(true);
+ } else if (currentTokenEquals(Lexer.COPY)) {
+ pdi.setOnParentVersion(OnParentVersionAction.COPY);
+ } else if (currentTokenEquals(Lexer.VERSION)) {
+ pdi.setOnParentVersion(OnParentVersionAction.VERSION);
+ } else if (currentTokenEquals(Lexer.INITIALIZE)) {
+ pdi.setOnParentVersion(OnParentVersionAction.INITIALIZE);
+ } else if (currentTokenEquals(Lexer.COMPUTE)) {
+ pdi.setOnParentVersion(OnParentVersionAction.COMPUTE);
+ } else if (currentTokenEquals(Lexer.IGNORE)) {
+ pdi.setOnParentVersion(OnParentVersionAction.IGNORE);
+ } else if (currentTokenEquals(Lexer.ABORT)) {
+ pdi.setOnParentVersion(OnParentVersionAction.ABORT);
+ }
+ nextToken();
+ }
+ }
+
+ /**
+ * processes the property default values
+ *
+ * @param pdi
+ * @throws ParseException
+ */
+ private void doPropertyDefaultValue(PropDefImpl pdi) throws ParseException {
+ if (!currentTokenEquals(Lexer.DEFAULT)) {
+ return;
+ }
+ List defaultValues = new ArrayList();
+ do {
+ nextToken();
+ InternalValue value = null;
+ try {
+ value = InternalValue.create(currentToken, pdi.getRequiredType(), nsMapping);
+ } catch (ValueFormatException e) {
+ lexer.fail("'" + currentToken + "' is not a valid string representation of a value of type " + pdi.getRequiredType());
+ } catch (RepositoryException e) {
+ lexer.fail("An error occured during value conversion of '" + currentToken + "'");
+ }
+ defaultValues.add(value);
+ nextToken();
+ } while (currentTokenEquals(Lexer.LIST_DELIMITER));
+ pdi.setDefaultValues((InternalValue[]) defaultValues.toArray(new InternalValue[0]));
+ }
+
+ /**
+ * processes the property value constraints
+ *
+ * @param pdi
+ * @throws ParseException
+ */
+ private void doPropertyValueConstraints(PropDefImpl pdi) throws ParseException {
+ if (!currentTokenEquals(Lexer.CONSTRAINT)) {
+ return;
+ }
+ List constraints = new ArrayList();
+ do {
+ nextToken();
+ ValueConstraint constraint = null;
+ try {
+ constraint = ValueConstraint.create(pdi.getRequiredType(), currentToken, nsMapping);
+ } catch (InvalidConstraintException e) {
+ lexer.fail("'" + currentToken + "' is not a valid constraint expression for a value of type " + pdi.getRequiredType());
+ }
+ constraints.add(constraint);
+ nextToken();
+ } while (currentTokenEquals(Lexer.LIST_DELIMITER));
+ pdi.setValueConstraints((ValueConstraint[]) constraints.toArray(new ValueConstraint[0]));
+ }
+
+ /**
+ * processes the childnode definition
+ *
+ * @param ndi
+ * @param ntd
+ * @throws ParseException
+ */
+ private void doChildNodeDefinition(NodeDefImpl ndi, NodeTypeDef ntd)
+ throws ParseException {
+ if (currentTokenEquals('*')) {
+ ndi.setName(ItemDef.ANY_NAME);
+ } else {
+ ndi.setName(toQName(currentToken));
+ }
+ nextToken();
+ doChildNodeRequiredTypes(ndi);
+ doChildNodeDefaultType(ndi);
+ doChildNodeAttributes(ndi, ntd);
+ }
+
+ /**
+ * processes the childnode required types
+ *
+ * @param ndi
+ * @throws ParseException
+ */
+ private void doChildNodeRequiredTypes(NodeDefImpl ndi) throws ParseException {
+ if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
+ return;
+ }
+ List types = new ArrayList();
+ do {
+ nextToken();
+ types.add(toQName(currentToken));
+ nextToken();
+ } while (currentTokenEquals(Lexer.LIST_DELIMITER));
+ ndi.setRequiredPrimaryTypes((QName[]) types.toArray(new QName[0]));
+ nextToken();
+ }
+
+ /**
+ * processes the childnode default types
+ *
+ * @param ndi
+ * @throws ParseException
+ */
+ private void doChildNodeDefaultType(NodeDefImpl ndi) throws ParseException {
+ if (!currentTokenEquals(Lexer.DEFAULT)) {
+ return;
+ }
+ nextToken();
+ ndi.setDefaultPrimaryType(toQName(currentToken));
+ nextToken();
+ }
+
+ /**
+ * processes the childnode attributes
+ *
+ * @param ndi
+ * @param ntd
+ * @throws ParseException
+ */
+ private void doChildNodeAttributes(NodeDefImpl ndi, NodeTypeDef ntd) throws ParseException {
+ while (currentTokenEquals(Lexer.ATTRIBUTE)) {
+ if (currentTokenEquals(Lexer.PRIMARY)) {
+ if (ntd.getPrimaryItemName() != null) {
+ String name = null;
+ try {
+ name = nsMapping.getJCRName(ntd.getName());
+ } catch (NoPrefixDeclaredException e) {
+ // Should never happen, checked earlier
+ }
+ lexer.fail("More than one primary item specified in node type '" + name + "'");
+ }
+ ntd.setPrimaryItemName(ndi.getName());
+ } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
+ ndi.setAutoCreated(true);
+ } else if (currentTokenEquals(Lexer.MANDATORY)) {
+ ndi.setMandatory(true);
+ } else if (currentTokenEquals(Lexer.PROTECTED)) {
+ ndi.setProtected(true);
+ } else if (currentTokenEquals(Lexer.MULTIPLE)) {
+ ndi.setAllowsSameNameSiblings(true);
+ } else if (currentTokenEquals(Lexer.COPY)) {
+ ndi.setOnParentVersion(OnParentVersionAction.COPY);
+ } else if (currentTokenEquals(Lexer.VERSION)) {
+ ndi.setOnParentVersion(OnParentVersionAction.VERSION);
+ } else if (currentTokenEquals(Lexer.INITIALIZE)) {
+ ndi.setOnParentVersion(OnParentVersionAction.INITIALIZE);
+ } else if (currentTokenEquals(Lexer.COMPUTE)) {
+ ndi.setOnParentVersion(OnParentVersionAction.COMPUTE);
+ } else if (currentTokenEquals(Lexer.IGNORE)) {
+ ndi.setOnParentVersion(OnParentVersionAction.IGNORE);
+ } else if (currentTokenEquals(Lexer.ABORT)) {
+ ndi.setOnParentVersion(OnParentVersionAction.ABORT);
+ }
+ nextToken();
+ }
+ }
+
+ /**
+ * Converts the given string into a qualified name using the current
+ * namespace mapping.
+ *
+ * @param stringName
+ * @return the qualified name
+ * @throws ParseException if the conversion fails
+ */
+ private QName toQName(String stringName) throws ParseException {
+ try {
+ return QName.fromJCRName(stringName, nsMapping);
+ } catch (IllegalNameException e) {
+ lexer.fail("Error while parsing '" + stringName + "'", e);
+ return null;
+ } catch (UnknownPrefixException e) {
+ lexer.fail("Error while parsing '" + stringName + "'", e);
+ return null;
+ }
+ }
+
+ /**
+ * Gets the next token from the underlying lexer.
+ *
+ * @see Lexer#getNextToken()
+ * @throws ParseException if the lexer fails to get the next token.
+ */
+ private void nextToken() throws ParseException {
+ currentToken = lexer.getNextToken();
+ }
+
+ /**
+ * Checks if the {@link #currentToken} is semantically equal to the given
+ * argument.
+ *
+ * @param s the tokens to compare with
+ * @return <code>true</code> if equals; <code>false</code> otherwise.
+ */
+ private boolean currentTokenEquals(String[] s) {
+ for (int i = 0; i < s.length; i++) {
+ if (currentToken.equals(s[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks if the {@link #currentToken} is semantically equal to the given
+ * argument.
+ *
+ * @param c the tokens to compare with
+ * @return <code>true</code> if equals; <code>false</code> otherwise.
+ */
+ private boolean currentTokenEquals(char c) {
+ return currentToken.length() == 1 && currentToken.charAt(0) == c;
+ }
+
+ /**
+ * Checks if the {@link #currentToken} is semantically equal to the given
+ * argument.
+ *
+ * @param s the tokens to compare with
+ * @return <code>true</code> if equals; <code>false</code> otherwise.
+ */
+ private boolean currentTokenEquals(String s) {
+ return currentToken.equals(s);
+ }
+
}
Propchange: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java?rev=349083&r1=349082&r2=349083&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java (original)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java Fri Nov 25 21:41:13 2005
@@ -1,328 +1,328 @@
-/*
- * Copyright 2004-2005 The Apache Software Foundation or its licensors,
- * as applicable.
- *
- * Licensed 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.NodeTypeDef;
-import org.apache.jackrabbit.core.nodetype.PropDef;
-import org.apache.jackrabbit.core.nodetype.NodeDef;
-import org.apache.jackrabbit.core.nodetype.ValueConstraint;
-import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-
-import javax.jcr.NamespaceException;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.version.OnParentVersionAction;
-import java.io.Writer;
-import java.io.IOException;
-
-/**
- * Prints node type defs in a compact notation
- * Print Format:
- * [ex:NodeType] > ex:ParentType1, ex:ParentType2
- * orderable mixin
- * - ex:property (STRING) primary mandatory autocreated protected multiple VERSION
- * = 'default1', 'default2'
- * < 'constraint1', 'constraint2'
- * + ex:node (ex:reqType1, ex:reqType2) = ex:defaultType mandatory autocreated protected multiple VERSION
- */
-public class CompactNodeTypeDefWriter {
-
- /**
- * the indention string
- */
- private final static String INDENT = " ";
-
- /**
- * the current namespace resolver
- */
- private final NamespaceResolver resolver;
-
- /**
- * the underlying writer
- */
- private final Writer out;
-
- /**
- *
- * @param out
- * @param r
- */
- public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r) {
- this.out = out;
- this.resolver = r;
- }
-
- /**
- *
- * @param d
- * @throws IOException
- */
- public void write(NodeTypeDef d) throws IOException {
- writeName(d);
- writeSupertypes(d);
- writeOptions(d);
- writePropDefs(d);
- writeNodeDefs(d);
- }
-
- /**
- * closes this writer but not the underlying stream
- *
- * @throws IOException
- */
- public void close() throws IOException {
- out.flush();
- }
-
- /**
- * putName
- */
- private void writeName(NodeTypeDef ntd) throws IOException {
- out.write("[");
- out.write(resolve(ntd.getName()));
- out.write("]");
- }
-
- /**
- * putSupertypes
- */
- private void writeSupertypes(NodeTypeDef ntd) throws IOException {
- QName[] sta = ntd.getSupertypes();
- if (sta == null) return;
- String delim=" > ";
- for (int i=0; i<sta.length; i++) {
- if (!sta[i].equals(QName.NT_BASE)) {
- out.write(delim);
- out.write(resolve(sta[i]));
- delim=", ";
- }
- }
- }
-
- /**
- * putOptions
- */
- private void writeOptions(NodeTypeDef ntd) throws IOException {
- if (ntd.hasOrderableChildNodes()) {
- out.write("\n" + INDENT);
- out.write("orderable");
- if (ntd.isMixin()) {
- out.write(" mixin");
- }
- } else if (ntd.isMixin()) {
- out.write("\n" + INDENT);
- out.write("mixin");
- }
- }
-
- /**
- * putPropDefs
- */
- private void writePropDefs(NodeTypeDef ntd) throws IOException {
- PropDef[] pda = ntd.getPropertyDefs();
- for (int i = 0; i < pda.length; i++) {
- PropDef pd = pda[i];
- writePropDef(ntd, pd);
- }
- }
-
- /**
- * putNodeDefs
- */
- private void writeNodeDefs(NodeTypeDef ntd) throws IOException {
- NodeDef[] nda = ntd.getChildNodeDefs();
- for (int i = 0; i < nda.length; i++) {
- NodeDef nd = nda[i];
- writeNodeDef(ntd, nd);
- }
- }
-
- /**
- * putPropDef
- * @param pd
- */
- private void writePropDef(NodeTypeDef ntd, PropDef pd) throws IOException {
- out.write("\n" + INDENT + "- ");
- writeItemDefName(pd.getName());
- out.write(" (");
- out.write(PropertyType.nameFromValue(pd.getRequiredType()).toLowerCase());
- out.write(")");
- writeDefaultValues(pd.getDefaultValues());
- out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(pd.getName()) ? " primary" : "");
- if (pd.isMandatory()) {
- out.write(" mandatory");
- }
- if (pd.isAutoCreated()) {
- out.write(" autocreated");
- }
- if (pd.isProtected()) {
- out.write(" protected");
- }
- if (pd.isMultiple()) {
- out.write(" multiple");
- }
- if (pd.getOnParentVersion() != OnParentVersionAction.COPY) {
- out.write(" ");
- out.write(OnParentVersionAction.nameFromValue(pd.getOnParentVersion()).toLowerCase());
- }
- writeValueConstraints(pd.getValueConstraints());
- }
-
- /**
- * putDefaultValues
- * @param dva
- */
- private void writeDefaultValues(InternalValue[] dva) throws IOException {
- if (dva == null || dva.length == 0) return;
- String delim=" = '";
- for (int i = 0; i < dva.length; i++) {
- out.write(delim);
- try {
- out.write(escape(dva[i].toJCRValue(resolver).getString()));
- } catch (RepositoryException e) {
- out.write(escape(dva[i].toString()));
- }
- out.write("'");
- delim=", '";
- }
- }
-
- /**
- * putValueConstraints
- * @param vca
- */
- private void writeValueConstraints(ValueConstraint[] vca) throws IOException {
- if (vca == null || vca.length == 0) return;
- String vc = vca[0].getDefinition(resolver);
- out.write("\n" + INDENT + INDENT + "< '");
- out.write(escape(vc));
- out.write("'");
- for (int i = 1; i < vca.length; i++) {
- vc = vca[i].getDefinition(resolver);
- out.write(", '");
- out.write(escape(vc));
- out.write("'");
- }
- }
-
- /**
- * putNodeDef
- * @param nd
- */
- private void writeNodeDef(NodeTypeDef ntd, NodeDef nd) throws IOException {
- out.write("\n" + INDENT + "+ ");
- writeItemDefName(nd.getName());
- writeRequiredTypes(nd.getRequiredPrimaryTypes());
- writeDefaultType(nd.getDefaultPrimaryType());
- out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(nd.getName()) ? " primary" : "");
- if (nd.isMandatory()) {
- out.write(" mandatory");
- }
- if (nd.isAutoCreated()) {
- out.write(" autocreated");
- }
- if (nd.isProtected()) {
- out.write(" protected");
- }
- if (nd.allowsSameNameSiblings()) {
- out.write(" multiple");
- }
- if (nd.getOnParentVersion() != OnParentVersionAction.COPY) {
- out.write(" ");
- out.write(OnParentVersionAction.nameFromValue(nd.getOnParentVersion()).toLowerCase());
- }
- }
-
- private void writeItemDefName(QName name) throws IOException {
- String s = resolve(name);
- // check for '-' and '+'
- if (s.indexOf('-') >= 0 || s.indexOf('+') >= 0) {
- out.write('\'');
- out.write(s);
- out.write('\'');
- } else {
- out.write(s);
- }
- }
- /**
- * putRequiredTypes
- * @param reqTypes
- */
- private void writeRequiredTypes(QName[] reqTypes) throws IOException {
- if (reqTypes != null && reqTypes.length > 0) {
- String delim = " (";
- for (int i = 0; i < reqTypes.length; i++) {
- out.write(delim);
- out.write(resolve(reqTypes[i]));
- delim=", ";
- }
- out.write(")");
- }
- }
-
- /**
- * putDefaultType
- * @param defType
- */
- private void writeDefaultType(QName defType) throws IOException {
- if (defType != null && !defType.getLocalName().equals("*")) {
- out.write(" = ");
- out.write(resolve(defType));
- }
- }
-
- /**
- * resolve
- * @param qname
- * @return the resolved name
- */
- private String resolve(QName qname) {
- if (qname == null) {
- return "";
- }
- try {
- String prefix = resolver.getPrefix(qname.getNamespaceURI());
- if (prefix != null && !prefix.equals(QName.NS_EMPTY_PREFIX)) {
- prefix += ":";
- }
- return prefix + qname.getLocalName();
- } catch (NamespaceException e) {
- return qname.toString();
- }
- }
-
- /**
- * escape
- * @param s
- * @return the escaped string
- */
- private String escape(String s) {
- StringBuffer sb = new StringBuffer(s);
- for (int i = 0; i < sb.length(); i++) {
- if (sb.charAt(i) == '\\') {
- sb.insert(i, '\\');
- i++;
- } else if (sb.charAt(i) == '\'') {
- sb.insert(i, '\'');
- i++;
- }
- }
- return sb.toString();
- }
-}
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ * as applicable.
+ *
+ * Licensed 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.NodeTypeDef;
+import org.apache.jackrabbit.core.nodetype.PropDef;
+import org.apache.jackrabbit.core.nodetype.NodeDef;
+import org.apache.jackrabbit.core.nodetype.ValueConstraint;
+import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.name.QName;
+
+import javax.jcr.NamespaceException;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.version.OnParentVersionAction;
+import java.io.Writer;
+import java.io.IOException;
+
+/**
+ * Prints node type defs in a compact notation
+ * Print Format:
+ * [ex:NodeType] > ex:ParentType1, ex:ParentType2
+ * orderable mixin
+ * - ex:property (STRING) primary mandatory autocreated protected multiple VERSION
+ * = 'default1', 'default2'
+ * < 'constraint1', 'constraint2'
+ * + ex:node (ex:reqType1, ex:reqType2) = ex:defaultType mandatory autocreated protected multiple VERSION
+ */
+public class CompactNodeTypeDefWriter {
+
+ /**
+ * the indention string
+ */
+ private final static String INDENT = " ";
+
+ /**
+ * the current namespace resolver
+ */
+ private final NamespaceResolver resolver;
+
+ /**
+ * the underlying writer
+ */
+ private final Writer out;
+
+ /**
+ *
+ * @param out
+ * @param r
+ */
+ public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r) {
+ this.out = out;
+ this.resolver = r;
+ }
+
+ /**
+ *
+ * @param d
+ * @throws IOException
+ */
+ public void write(NodeTypeDef d) throws IOException {
+ writeName(d);
+ writeSupertypes(d);
+ writeOptions(d);
+ writePropDefs(d);
+ writeNodeDefs(d);
+ }
+
+ /**
+ * closes this writer but not the underlying stream
+ *
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ out.flush();
+ }
+
+ /**
+ * putName
+ */
+ private void writeName(NodeTypeDef ntd) throws IOException {
+ out.write("[");
+ out.write(resolve(ntd.getName()));
+ out.write("]");
+ }
+
+ /**
+ * putSupertypes
+ */
+ private void writeSupertypes(NodeTypeDef ntd) throws IOException {
+ QName[] sta = ntd.getSupertypes();
+ if (sta == null) return;
+ String delim=" > ";
+ for (int i=0; i<sta.length; i++) {
+ if (!sta[i].equals(QName.NT_BASE)) {
+ out.write(delim);
+ out.write(resolve(sta[i]));
+ delim=", ";
+ }
+ }
+ }
+
+ /**
+ * putOptions
+ */
+ private void writeOptions(NodeTypeDef ntd) throws IOException {
+ if (ntd.hasOrderableChildNodes()) {
+ out.write("\n" + INDENT);
+ out.write("orderable");
+ if (ntd.isMixin()) {
+ out.write(" mixin");
+ }
+ } else if (ntd.isMixin()) {
+ out.write("\n" + INDENT);
+ out.write("mixin");
+ }
+ }
+
+ /**
+ * putPropDefs
+ */
+ private void writePropDefs(NodeTypeDef ntd) throws IOException {
+ PropDef[] pda = ntd.getPropertyDefs();
+ for (int i = 0; i < pda.length; i++) {
+ PropDef pd = pda[i];
+ writePropDef(ntd, pd);
+ }
+ }
+
+ /**
+ * putNodeDefs
+ */
+ private void writeNodeDefs(NodeTypeDef ntd) throws IOException {
+ NodeDef[] nda = ntd.getChildNodeDefs();
+ for (int i = 0; i < nda.length; i++) {
+ NodeDef nd = nda[i];
+ writeNodeDef(ntd, nd);
+ }
+ }
+
+ /**
+ * putPropDef
+ * @param pd
+ */
+ private void writePropDef(NodeTypeDef ntd, PropDef pd) throws IOException {
+ out.write("\n" + INDENT + "- ");
+ writeItemDefName(pd.getName());
+ out.write(" (");
+ out.write(PropertyType.nameFromValue(pd.getRequiredType()).toLowerCase());
+ out.write(")");
+ writeDefaultValues(pd.getDefaultValues());
+ out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(pd.getName()) ? " primary" : "");
+ if (pd.isMandatory()) {
+ out.write(" mandatory");
+ }
+ if (pd.isAutoCreated()) {
+ out.write(" autocreated");
+ }
+ if (pd.isProtected()) {
+ out.write(" protected");
+ }
+ if (pd.isMultiple()) {
+ out.write(" multiple");
+ }
+ if (pd.getOnParentVersion() != OnParentVersionAction.COPY) {
+ out.write(" ");
+ out.write(OnParentVersionAction.nameFromValue(pd.getOnParentVersion()).toLowerCase());
+ }
+ writeValueConstraints(pd.getValueConstraints());
+ }
+
+ /**
+ * putDefaultValues
+ * @param dva
+ */
+ private void writeDefaultValues(InternalValue[] dva) throws IOException {
+ if (dva == null || dva.length == 0) return;
+ String delim=" = '";
+ for (int i = 0; i < dva.length; i++) {
+ out.write(delim);
+ try {
+ out.write(escape(dva[i].toJCRValue(resolver).getString()));
+ } catch (RepositoryException e) {
+ out.write(escape(dva[i].toString()));
+ }
+ out.write("'");
+ delim=", '";
+ }
+ }
+
+ /**
+ * putValueConstraints
+ * @param vca
+ */
+ private void writeValueConstraints(ValueConstraint[] vca) throws IOException {
+ if (vca == null || vca.length == 0) return;
+ String vc = vca[0].getDefinition(resolver);
+ out.write("\n" + INDENT + INDENT + "< '");
+ out.write(escape(vc));
+ out.write("'");
+ for (int i = 1; i < vca.length; i++) {
+ vc = vca[i].getDefinition(resolver);
+ out.write(", '");
+ out.write(escape(vc));
+ out.write("'");
+ }
+ }
+
+ /**
+ * putNodeDef
+ * @param nd
+ */
+ private void writeNodeDef(NodeTypeDef ntd, NodeDef nd) throws IOException {
+ out.write("\n" + INDENT + "+ ");
+ writeItemDefName(nd.getName());
+ writeRequiredTypes(nd.getRequiredPrimaryTypes());
+ writeDefaultType(nd.getDefaultPrimaryType());
+ out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(nd.getName()) ? " primary" : "");
+ if (nd.isMandatory()) {
+ out.write(" mandatory");
+ }
+ if (nd.isAutoCreated()) {
+ out.write(" autocreated");
+ }
+ if (nd.isProtected()) {
+ out.write(" protected");
+ }
+ if (nd.allowsSameNameSiblings()) {
+ out.write(" multiple");
+ }
+ if (nd.getOnParentVersion() != OnParentVersionAction.COPY) {
+ out.write(" ");
+ out.write(OnParentVersionAction.nameFromValue(nd.getOnParentVersion()).toLowerCase());
+ }
+ }
+
+ private void writeItemDefName(QName name) throws IOException {
+ String s = resolve(name);
+ // check for '-' and '+'
+ if (s.indexOf('-') >= 0 || s.indexOf('+') >= 0) {
+ out.write('\'');
+ out.write(s);
+ out.write('\'');
+ } else {
+ out.write(s);
+ }
+ }
+ /**
+ * putRequiredTypes
+ * @param reqTypes
+ */
+ private void writeRequiredTypes(QName[] reqTypes) throws IOException {
+ if (reqTypes != null && reqTypes.length > 0) {
+ String delim = " (";
+ for (int i = 0; i < reqTypes.length; i++) {
+ out.write(delim);
+ out.write(resolve(reqTypes[i]));
+ delim=", ";
+ }
+ out.write(")");
+ }
+ }
+
+ /**
+ * putDefaultType
+ * @param defType
+ */
+ private void writeDefaultType(QName defType) throws IOException {
+ if (defType != null && !defType.getLocalName().equals("*")) {
+ out.write(" = ");
+ out.write(resolve(defType));
+ }
+ }
+
+ /**
+ * resolve
+ * @param qname
+ * @return the resolved name
+ */
+ private String resolve(QName qname) {
+ if (qname == null) {
+ return "";
+ }
+ try {
+ String prefix = resolver.getPrefix(qname.getNamespaceURI());
+ if (prefix != null && !prefix.equals(QName.NS_EMPTY_PREFIX)) {
+ prefix += ":";
+ }
+ return prefix + qname.getLocalName();
+ } catch (NamespaceException e) {
+ return qname.toString();
+ }
+ }
+
+ /**
+ * escape
+ * @param s
+ * @return the escaped string
+ */
+ private String escape(String s) {
+ StringBuffer sb = new StringBuffer(s);
+ for (int i = 0; i < sb.length(); i++) {
+ if (sb.charAt(i) == '\\') {
+ sb.insert(i, '\\');
+ i++;
+ } else if (sb.charAt(i) == '\'') {
+ sb.insert(i, '\'');
+ i++;
+ }
+ }
+ return sb.toString();
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
------------------------------------------------------------------------------
svn:eol-style = native