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