You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by pp...@apache.org on 2005/11/25 21:25:06 UTC
svn commit: r349019 - in /incubator/jackrabbit/trunk/contrib/compact-nt: ./
src/ src/java/ src/java/org/ src/java/org/apache/
src/java/org/apache/jackrabbit/ src/java/org/apache/jackrabbit/core/
src/java/org/apache/jackrabbit/core/nodetype/ src/java/or...
Author: ppiegaze
Date: Fri Nov 25 12:24:44 2005
New Revision: 349019
URL: http://svn.apache.org/viewcvs?rev=349019&view=rev
Log:
Initial checkin: Compact Node Type Definition Reader and Writer
Added:
incubator/jackrabbit/trunk/contrib/compact-nt/
incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml
incubator/jackrabbit/trunk/contrib/compact-nt/project.properties
incubator/jackrabbit/trunk/contrib/compact-nt/project.xml
incubator/jackrabbit/trunk/contrib/compact-nt/src/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java
incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java
Added: incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/maven.xml Fri Nov 25 12:24:44 2005
@@ -0,0 +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">
+</project>
\ No newline at end of file
Added: incubator/jackrabbit/trunk/contrib/compact-nt/project.properties
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/project.properties?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/project.properties (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/project.properties Fri Nov 25 12:24:44 2005
@@ -0,0 +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
+
Added: incubator/jackrabbit/trunk/contrib/compact-nt/project.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/project.xml?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/project.xml (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/project.xml Fri Nov 25 12:24:44 2005
@@ -0,0 +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>
+</project>
\ No newline at end of file
Added: 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=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java Fri Nov 25 12:24:44 2005
@@ -0,0 +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);
+ }
+
+}
\ No newline at end of file
Added: 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=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java Fri Nov 25 12:24:44 2005
@@ -0,0 +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();
+ }
+}
Added: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/Lexer.java Fri Nov 25 12:24:44 2005
@@ -0,0 +1,151 @@
+/*
+ * 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 java.io.StreamTokenizer;
+import java.io.Reader;
+import java.io.IOException;
+
+/**
+ * Lexer
+ */
+public class Lexer {
+ public final static char QUOTE = '\'';
+ public final static char BEGIN_NODE_TYPE_NAME = '[';
+ public final static char END_NODE_TYPE_NAME = ']';
+ public final static char EXTENDS = '>';
+ public final static char LIST_DELIMITER = ',';
+ public final static char PROPERTY_DEFINITION = '-';
+ public final static char CHILD_NODE_DEFINITION = '+';
+ public final static char BEGIN_TYPE = '(';
+ public final static char END_TYPE = ')';
+ public final static char DEFAULT = '=';
+ public final static char CONSTRAINT = '<';
+
+ public final static String[] ORDERABLE = new String[] {"orderable", "ord", "o"};
+ public final static String[] MIXIN = new String[]{"mixin", "mix", "m"};
+
+ public final static String[] PRIMARY = new String[]{"primary", "pri", "!"};
+ public final static String[] AUTOCREATED = new String[]{"autocreated", "aut", "a"};
+ public final static String[] MANDATORY = new String[]{"mandatory", "man", "m"};
+ public final static String[] PROTECTED = new String[]{"protected", "pro", "p"};
+ public final static String[] MULTIPLE = new String[]{"multiple", "mul", "*"};
+
+ public final static String[] COPY = new String[]{"copy", "Copy", "COPY"};
+ public final static String[] VERSION = new String[]{"version", "Version", "VERSION"};
+ public final static String[] INITIALIZE = new String[]{"initialize", "Initialize", "INITIALIZE"};
+ public final static String[] COMPUTE = new String[]{"compute", "Compute", "COMPUTE"};
+ public final static String[] IGNORE = new String[]{"ignore", "Ignore", "IGNORE"};
+ public final static String[] ABORT = new String[]{"abort", "Abort", "ABORT"};
+
+ public final static String[] ATTRIBUTE = new String[]{"primary", "pri", "!",
+ "autocreated", "aut", "a",
+ "mandatory", "man", "m",
+ "protected", "pro", "p",
+ "multiple", "mul", "*",
+ "copy", "Copy", "COPY",
+ "version", "Version", "VERSION",
+ "initialize", "Initialize", "INITIALIZE",
+ "compute", "Compute", "COMPUTE",
+ "ignore", "Ignore", "IGNORE",
+ "abort", "Abort", "ABORT"};
+
+ public final static String[] STRING = {"string", "String", "STRING"};
+ public final static String[] BINARY = {"binary", "Binary", "BINARY"};
+ public final static String[] LONG = {"long", "Long", "LONG"};
+ public final static String[] DOUBLE = {"double", "Double", "DOUBLE"};
+ public final static String[] BOOLEAN = {"boolean", "Boolean", "BOOLEAN"};
+ public final static String[] DATE = {"date", "Date", "DATE"};
+ public final static String[] NAME = {"name", "Name", "NAME"};
+ public final static String[] PATH = {"path", "Path", "PATH"};
+ public final static String[] REFERENCE = {"reference", "Reference", "REFERENCE"};
+
+ public final static String[] UNDEFINED = new String[]{"undefined", "Undefined", "UNDEFINED", "*"};
+
+ public final static String EOF = "eof";
+
+ private final StreamTokenizer st;
+
+ private final String systemId;
+
+ /**
+ * Constructor
+ * @param r
+ */
+ public Lexer(Reader r, String systemId){
+ this.systemId = systemId;
+ st = new StreamTokenizer(r);
+
+ st.eolIsSignificant(false);
+
+ st.lowerCaseMode(false);
+
+ st.slashSlashComments(true);
+ st.slashStarComments(true);
+
+ st.wordChars('a','z');
+ st.wordChars('A','Z');
+ st.wordChars(':',':');
+
+ st.quoteChar(QUOTE);
+
+ st.ordinaryChar(BEGIN_NODE_TYPE_NAME);
+ st.ordinaryChar(END_NODE_TYPE_NAME);
+ st.ordinaryChar(EXTENDS);
+ st.ordinaryChar(LIST_DELIMITER);
+ st.ordinaryChar(PROPERTY_DEFINITION);
+ st.ordinaryChar(CHILD_NODE_DEFINITION);
+ st.ordinaryChar(BEGIN_TYPE);
+ st.ordinaryChar(END_TYPE);
+ st.ordinaryChar(DEFAULT);
+ st.ordinaryChar(CONSTRAINT);
+ }
+
+ /**
+ * getNextToken
+ *
+ * @return
+ * @throws ParseException
+ */
+ public String getNextToken() throws ParseException {
+ try {
+ int tokenType = st.nextToken();
+ if (tokenType == StreamTokenizer.TT_EOF){
+ return EOF;
+ } else if(tokenType == StreamTokenizer.TT_WORD || tokenType == QUOTE){
+ return st.sval;
+ } else {
+ return new String(new char[]{(char)tokenType});
+ }
+ } catch (IOException e){
+ fail("IOException while attempting to read input stream", e);
+ return null;
+ }
+ }
+
+ public void fail(String message) throws ParseException {
+ throw new ParseException(message, st.lineno(), -1, systemId);
+ }
+
+ public void fail(String message, Throwable e) throws ParseException {
+ throw new ParseException(message, e, st.lineno(), -1, systemId);
+ }
+
+ public void fail(Throwable e) throws ParseException {
+ throw new ParseException(e, st.lineno(), -1, systemId);
+ }
+}
\ No newline at end of file
Added: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/NamespaceMapping.java Fri Nov 25 12:24:44 2005
@@ -0,0 +1,160 @@
+/*
+ * 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.name.NamespaceResolver;
+import org.apache.jackrabbit.name.AbstractNamespaceResolver;
+
+import javax.jcr.NamespaceException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * A Simple Namespace Mapping table. Mappings can be added
+ * and then the object can be used as a NamespaceResolver. Additionally, it can
+ * be based on a underlying NamespaceResolver
+ */
+public class NamespaceMapping extends AbstractNamespaceResolver {
+
+ /** local uris */
+ private final Properties prefixToURI = new Properties();
+
+ /** local prefix */
+ private final Properties URIToPrefix = new Properties();
+
+ /** base */
+ private final NamespaceResolver base;
+
+ public NamespaceMapping() {
+ this.base = null;
+ }
+
+ /**
+ * Constructor
+ */
+ public NamespaceMapping(NamespaceResolver base) {
+ this.base = base;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPrefix(String uri) throws NamespaceException {
+ if (URIToPrefix.containsKey(uri)) {
+ return URIToPrefix.getProperty(uri);
+ } else if (base == null) {
+ throw new NamespaceException("No prefix for URI '" + uri + "' declared.");
+ } else {
+ return base.getPrefix(uri);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getURI(String prefix) throws NamespaceException {
+ if (prefixToURI.containsKey(prefix)) {
+ return prefixToURI.getProperty(prefix);
+ } else if (base == null) {
+ throw new NamespaceException("No URI for pefix '" + prefix + "' declared.");
+ } else {
+ return base.getURI(prefix);
+ }
+ }
+
+ /**
+ * Set a prefix == URI one-to-one mapping
+ *
+ * @param prefix
+ * @param uri
+ * @throws NamespaceException
+ */
+ public void setMapping(String prefix, String uri) throws NamespaceException{
+ if (prefix == null) {
+ throw new NamespaceException("Prefix must not be null");
+ }
+ if (uri == null) {
+ throw new NamespaceException("URI must not be null");
+ }
+ if (URIToPrefix.containsKey(uri)) {
+ // remove mapping
+ prefixToURI.remove(URIToPrefix.remove(uri));
+ }
+ if (prefixToURI.containsKey(prefix)) {
+ // remove mapping
+ URIToPrefix.remove(prefixToURI.remove(prefix));
+ }
+ prefixToURI.put(prefix, uri);
+ URIToPrefix.put(uri, prefix);
+ }
+
+ /**
+ * Return a Map of prefix to URI mappings currently registered.
+ * The returned Map is a copy of the internal Map.
+ * @return Map
+ */
+ public Map getPrefixToURIMapping(){
+ return new HashMap(prefixToURI);
+ }
+
+ /**
+ * Return a Map of URI to prefix mappings currently registered.
+ * The returned Map is a copy of the internal Map.
+ * @return Map
+ */
+ public Map getURIToPrefixMapping(){
+ return new HashMap(URIToPrefix);
+ }
+
+ /**
+ * Override equals()
+ *
+ * @param obj
+ * @return boolean
+ */
+ public boolean equals(Object obj){
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof NamespaceMapping) {
+ NamespaceMapping other = (NamespaceMapping) obj;
+ return this.getPrefixToURIMapping().equals(other.getPrefixToURIMapping())
+ && this.getURIToPrefixMapping().equals(other.getURIToPrefixMapping());
+ }
+ return false;
+ }
+
+ /**
+ * Override toString()
+ *
+ * @return String
+ */
+ public String toString(){
+ String s= "";
+ Set mapping = prefixToURI.entrySet();
+ for(Iterator i = mapping.iterator(); i.hasNext();){
+ Map.Entry entry = (Map.Entry)i.next();
+ String prefix = (String)entry.getKey();
+ String uri = (String)entry.getValue();
+ s += "'" + prefix + "' == '" + uri + "'\n";
+ }
+ return s;
+ }
+}
\ No newline at end of file
Added: incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java?rev=349019&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java (added)
+++ incubator/jackrabbit/trunk/contrib/compact-nt/src/java/org/apache/jackrabbit/core/nodetype/compact/ParseException.java Fri Nov 25 12:24:44 2005
@@ -0,0 +1,128 @@
+/*
+ * 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;
+
+/**
+ * ParseException
+ */
+public class ParseException extends Exception {
+
+ /**
+ * the line number where the error occurred
+ */
+ private final int lineNumber;
+
+ /**
+ * the column number where the error occurred
+ */
+ private final int colNumber;
+
+ /**
+ * the systemid of the source that produced the error
+ */
+ private final String systemId;
+
+
+ /**
+ * Constructs a new instance of this class with <code>null</code> as its
+ * detail message.
+ */
+ public ParseException(int lineNumber, int colNumber, String systemId) {
+ super();
+ this.lineNumber = lineNumber;
+ this.colNumber = colNumber;
+ this.systemId = systemId;
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified detail
+ * message.
+ *
+ * @param message the detail message. The detail message is saved for
+ * later retrieval by the {@link #getMessage()} method.
+ */
+ public ParseException(String message, int lineNumber, int colNumber, String systemId) {
+ super(message);
+ this.lineNumber = lineNumber;
+ this.colNumber = colNumber;
+ this.systemId = systemId;
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified detail
+ * message and root cause.
+ *
+ * @param message the detail message. The detail message is saved for
+ * later retrieval by the {@link #getMessage()} method.
+ * @param rootCause root failure cause
+ */
+ public ParseException(String message, Throwable rootCause, int lineNumber, int colNumber, String systemId) {
+ super(message, rootCause);
+ this.lineNumber = lineNumber;
+ this.colNumber = colNumber;
+ this.systemId = systemId;
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified root cause.
+ *
+ * @param rootCause root failure cause
+ */
+ public ParseException(Throwable rootCause, int lineNumber, int colNumber, String systemId) {
+ super(rootCause);
+ this.lineNumber = lineNumber;
+ this.colNumber = colNumber;
+ this.systemId = systemId;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getMessage() {
+ StringBuffer b = new StringBuffer(super.getMessage());
+ String delim =" (";
+ if (systemId != null && !systemId.equals("")) {
+ b.append(delim);
+ b.append(systemId);
+ delim = ", ";
+ }
+ if (lineNumber>=0) {
+ b.append(delim);
+ b.append("line ");
+ b.append(lineNumber);
+ delim = ", ";
+ }
+ if (colNumber>=0) {
+ b.append(delim);
+ b.append("col ");
+ b.append(colNumber);
+ delim = ", ";
+ }
+ if (delim.equals(", ")) {
+ b.append(")");
+ }
+ return b.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString() {
+ return super.toString();// + " (" + systemId + ", line " + lineNumber +", col " + colNumber +")";
+ }
+
+}
\ No newline at end of file
Re: svn commit: r349019 - in /incubator/jackrabbit/trunk/contrib/compact-nt:
./ src/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jackrabbit/
src/java/org/apache/jackrabbit/core/ src/java/org/apache/jackrabbit/core/nodetype/
src/java/or...
Posted by Brian Moseley <bc...@osafoundation.org>.
ppiegaze@apache.org wrote:
> Author: ppiegaze
> Date: Fri Nov 25 12:24:44 2005
> New Revision: 349019
>
> URL: http://svn.apache.org/viewcvs?rev=349019&view=rev
> Log:
> Initial checkin: Compact Node Type Definition Reader and Writer
nice! now we just need a maven plugin for it :)