From dna-commits at lists.jboss.org  Fri Jan  1 08:28:23 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 1 Jan 2010 08:28:23 -0500
Subject: [dna-commits] DNA SVN: r1510 -
	trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem.
Message-ID: <201001011328.o01DSNVv032574@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-01 08:28:22 -0500 (Fri, 01 Jan 2010)
New Revision: 1510

Modified:
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java
Log:
Corrected Javadoc

Modified: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java	2009-12-31 22:41:01 UTC (rev 1509)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java	2010-01-01 13:28:22 UTC (rev 1510)
@@ -274,9 +274,9 @@
     }
 
     /**
-     * Get the UUID that is used for the root node of each workspace
+     * Get the maximum path length (in characters) allowed by the underlying file system
      * 
-     * @return the UUID that is used for the root node of each workspace
+     * @return the maximum path length (in characters) allowed by the underlying file system
      */
     public int getMaxPathLength() {
         return maxPathLength;


From dna-commits at lists.jboss.org  Fri Jan  1 12:19:44 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 1 Jan 2010 12:19:44 -0500
Subject: [dna-commits] DNA SVN: r1511 - in trunk:
	extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem
	and 1 other directory.
Message-ID: <201001011719.o01HJiXZ017535@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-01 12:19:43 -0500 (Fri, 01 Jan 2010)
New Revision: 1511

Removed:
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemTransaction.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java
Log:
DNA-519 SVN Connector integration test runs in a very long time



Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -1,6 +1,7 @@
 package org.jboss.dna.graph.connector.path;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -37,6 +38,21 @@
         this.childSegments = childSegments;
     }
 
+    public DefaultPathNode( Path path,
+                            UUID uuid,
+                            Iterable<Property> properties,
+                            List<Segment> childSegments ) {
+        super();
+        this.path = path;
+        this.uuid = uuid;
+        this.childSegments = childSegments;
+        this.properties = new HashMap<Name, Property>();
+
+        for (Property property : properties) {
+            this.properties.put(property.getName(), property);
+        }
+    }
+
     public List<Segment> getChildSegments() {
         return this.childSegments;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -6,6 +6,9 @@
 import java.util.concurrent.ConcurrentMap;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.observe.Observer;
 
 @ThreadSafe
 public abstract class PathRepository {
@@ -106,21 +109,21 @@
      */
     protected abstract void initialize();
 
-    /**
-     * Begin a transaction, hinting whether the transaction will be used only to read the content. If this is called, then the
-     * transaction must be either {@link PathRepositoryTransaction#commit() committed} or
-     * {@link PathRepositoryTransaction#rollback() rolled back}.
-     * 
-     * @param readonly true if the transaction will not modify any content, or false if changes are to be made
-     * @return the transaction; never null
-     * @see PathRepositoryTransaction#commit()
-     * @see PathRepositoryTransaction#rollback()
-     */
-    public PathRepositoryTransaction startTransaction( boolean readonly ) {
+    public boolean isWritable() {
+        return false;
+    }
 
-        // Read-only repositories can return a default NOP implementation
-        return new PathRepositoryTransaction() {
+    PathRequestProcessor createRequestProcessor( ExecutionContext context,
+                                                 PathRepositorySource source ) {
+        RepositoryContext repositoryContext = source.getRepositoryContext();
+        Observer observer = repositoryContext != null ? repositoryContext.getObserver() : null;
+        boolean updatesAllowed = source.areUpdatesAllowed();
 
+        /**
+         * Read-only implementations can use a NOP transaction.
+         */
+        PathRepositoryTransaction txn = new PathRepositoryTransaction() {
+
             public void commit() {
             }
 
@@ -128,9 +131,7 @@
             }
 
         };
-    }
 
-    public boolean isWritable() {
-        return false;
+        return new PathRequestProcessor(context, this, observer, updatesAllowed, txn);
     }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -7,11 +7,8 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.request.Request;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
 
 public class PathRepositoryConnection implements RepositoryConnection {
 
@@ -78,10 +75,8 @@
         }
 
         // Do any commands update/write?
-        PathRepositoryTransaction txn = repository.startTransaction(request.isReadOnly());
-        RepositoryContext repositoryContext = this.source.getRepositoryContext();
-        Observer observer = repositoryContext != null ? repositoryContext.getObserver() : null;
-        RequestProcessor processor = new PathRequestProcessor(context, this.repository, observer, source.areUpdatesAllowed());
+        PathRequestProcessor processor = repository.createRequestProcessor(context, source);
+        PathRepositoryTransaction txn = processor.getTransaction();
 
         boolean commit = true;
         try {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -51,15 +51,18 @@
     private final PathFactory pathFactory;
     private final PathRepository repository;
     private final boolean updatesAllowed;
+    private final PathRepositoryTransaction txn;
 
     public PathRequestProcessor( ExecutionContext context,
                                  PathRepository repository,
                                  Observer observer,
-                                 boolean updatesAllowed ) {
+                                 boolean updatesAllowed,
+                                 PathRepositoryTransaction txn ) {
         super(repository.getSourceName(), context, observer);
         this.repository = repository;
         pathFactory = context.getValueFactories().getPathFactory();
         this.updatesAllowed = updatesAllowed;
+        this.txn = txn;
     }
 
     protected boolean updatesAllowed( Request request ) {
@@ -575,4 +578,15 @@
         return node;
     }
 
+    /**
+     * Returns the transaction associated with this request processor. This transaction must eventually either be
+     * {@link PathRepositoryTransaction#commit() committed} or {@link PathRepositoryTransaction#rollback() rolled back}.
+     * 
+     * @return the transaction associated with this request processor; never null
+     * @see PathRepositoryTransaction#commit()
+     * @see PathRepositoryTransaction#rollback()
+     */
+    public PathRepositoryTransaction getTransaction() {
+        return this.txn;
+    }
 }

Modified: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -49,7 +49,6 @@
 import org.jboss.dna.graph.connector.path.AbstractWritablePathWorkspace;
 import org.jboss.dna.graph.connector.path.DefaultPathNode;
 import org.jboss.dna.graph.connector.path.PathNode;
-import org.jboss.dna.graph.connector.path.PathRepositoryTransaction;
 import org.jboss.dna.graph.connector.path.WritablePathRepository;
 import org.jboss.dna.graph.connector.path.WritablePathWorkspace;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
@@ -171,11 +170,6 @@
         return null;
     }
 
-    @Override
-    public PathRepositoryTransaction startTransaction( boolean readonly ) {
-        return new FileSystemTransaction();
-    }
-
     /**
      * Writable workspace implementation for file system-backed workspaces
      */

Deleted: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemTransaction.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemTransaction.java	2010-01-01 13:28:22 UTC (rev 1510)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemTransaction.java	2010-01-01 17:19:43 UTC (rev 1511)
@@ -1,53 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.filesystem;
-
-import org.jboss.dna.graph.connector.path.PathRepositoryTransaction;
-
-/**
- * A transaction returned by the {@link FileSystemRepository#startTransaction(boolean)}.
- */
-public class FileSystemTransaction implements PathRepositoryTransaction {
-
-    /**
-     * Commit any changes that have been made to the repository. This method may throw runtime exceptions if there are failures
-     * committing the changes, but the transaction is still expected to be closed.
-     * 
-     * @see #rollback()
-     * @see FileSystemRepository#startTransaction(boolean)
-     */
-    public void commit() {
-    }
-
-    /**
-     * Rollback any changes that have been made to this repository. This method may throw runtime exceptions if there are failures
-     * rolling back the changes, but the transaction is still expected to be closed.
-     * 
-     * @see #commit()
-     * @see FileSystemRepository#startTransaction(boolean)
-     */
-    public void rollback() {
-    }
-
-}


From dna-commits at lists.jboss.org  Fri Jan  1 12:46:40 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 1 Jan 2010 12:46:40 -0500
Subject: [dna-commits] DNA SVN: r1512 - in trunk:
	docs/examples/gettingstarted/sequencers and 32 other directories.
Message-ID: <201001011746.o01Hke7t020389@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-01 12:46:39 -0500 (Fri, 01 Jan 2010)
New Revision: 1512

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
   trunk/extensions/dna-sequencer-classfile/
   trunk/extensions/dna-sequencer-classfile/.classpath
   trunk/extensions/dna-sequencer-classfile/.project
   trunk/extensions/dna-sequencer-classfile/pom.xml
   trunk/extensions/dna-sequencer-classfile/src/
   trunk/extensions/dna-sequencer-classfile/src/main/
   trunk/extensions/dna-sequencer-classfile/src/main/java/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileRecorder.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/AnnotationMetadata.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReader.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassMetadata.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/EnumMetadata.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/MethodMetadata.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/Visibility.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/package-info.java
   trunk/extensions/dna-sequencer-classfile/src/main/resources/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.properties
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd
   trunk/extensions/dna-sequencer-classfile/src/test/
   trunk/extensions/dna-sequencer-classfile/src/test/java/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18nTest.java
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/MockEnum.java
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java
   trunk/extensions/dna-sequencer-classfile/src/test/resources/
   trunk/extensions/dna-sequencer-classfile/src/test/resources/NodeEntity.clazz
Modified:
   trunk/docs/examples/gettingstarted/sequencers/.project
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd
   trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/master.xml
   trunk/pom.xml
   trunk/utils/dna-jpa-ddl-gen/
Log:
DNA-62

Committed first (working) version of this sequencer. The sequencer calls a Reader implementation (a la the MS Office sequencer) that parses a class file into a metadata object. The metadata object is then passed to a (customizable) recorder object that creates the relevant graph entries. The patch integrates the sequencer with the getting started sequencers example to help verify that it works.

The current version has extensive testing of the class file reader implementation, but very little testing of the default recorder (the object that converts the metadata into a series of graph nodes and properties).

For the defect to be resolved properly, I think these things would need to happen (in no particular order):

1. Align the default output for the class sequencer and the Java sequencer so that they are as identical as possible. This will be very helpful for future analyzer writers.
2. Align the metadata objects between the class sequencer and the Java source sequencer. Both are parsing into objects with the same name. It seems like they could probably be moved to share a common interface and then reuse recorder implementations (solving issue 1).  
3. Move the sequencer into the same package and namespace as the java sequencer. This is a nice to have, but the two sequencers are so tightly related that it makes a lot of sense (to me, anyway)
4. Clean up/add Javadoc and add more testing for the default recorder implementation

Steps 2 and 3 may or may not be appropriate, for all of the good reasons that rhauch noted in his comments on this defect.

Modified: trunk/docs/examples/gettingstarted/sequencers/.project
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/.project	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/examples/gettingstarted/sequencers/.project	2010-01-01 17:46:39 UTC (rev 1512)
@@ -1,23 +1,29 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>docs-getting-started-examples-sequencers</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.maven.ide.eclipse.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.maven.ide.eclipse.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>docs-getting-started-examples-sequencers</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-01 17:46:39 UTC (rev 1512)
@@ -30,6 +30,12 @@
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-classfile</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
       <artifactId>dna-sequencer-images</artifactId>
       <version>${project.version}</version>
       <scope>runtime</scope>

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -50,6 +50,8 @@
 import org.jboss.dna.jcr.SecurityContextCredentials;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.repository.util.SessionFactory;
+import org.jboss.dna.sequencer.classfile.ClassFileSequencer;
+import org.jboss.dna.sequencer.classfile.ClassFileSequencerLexicon;
 
 /**
  * The main application for running the sequencers.
@@ -74,7 +76,11 @@
               .setDescription("The repository for our content")
               .setProperty("defaultWorkspaceName", workspaceName);
         // Set up the JCR repository to use the source ...
-        config.repository(repositoryId).addNodeTypes("sequencing.cnd").setSource("store");
+        config.repository(repositoryId)
+              .addNodeTypes("sequencing.cnd")
+              .registerNamespace(ClassFileSequencerLexicon.Namespace.PREFIX,
+                                 ClassFileSequencerLexicon.Namespace.URI)              
+              .setSource("store");
         // Set up the image sequencer ...
         config.sequencer("Image Sequencer")
               .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
@@ -89,6 +95,12 @@
               .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
               .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
               .andOutputtingTo("/mp3s/$1");
+        // Set up the Java class file sequencer ...
+        config.sequencer("Java Class Sequencer")
+              .usingClass(ClassFileSequencer.class)
+              .setDescription("Sequences Java class files to extract the structure of the classes")
+              .sequencingFrom("//*.class[*]/jcr:content[@jcr:data]")
+              .andOutputtingTo("/classes");
         // Set up the Java source file sequencer ...
         config.sequencer("Java Sequencer")
               .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
@@ -273,7 +285,7 @@
                 while (!nodesToVisit.isEmpty()) {
                     Node node = nodesToVisit.remove();
 
-                    String nodeType = "nt:file".equals(node.getPrimaryNodeType()) ? "file" : "folder";
+                    String nodeType = "nt:folder".equals(node.getPrimaryNodeType().getName()) ? "folder" : "file";
                     infos.add(new MediaInfo(node.getPath(), node.getName(), nodeType, new Properties()));
 
                     for (NodeIterator i = node.getNodes(); i.hasNext();) {
@@ -343,6 +355,32 @@
                 }
             }
 
+            if (root.hasNode("classes")) {
+                LinkedList<Node> nodesToVisit = new LinkedList<Node>();
+
+                for (NodeIterator i = root.getNode("classes").getNodes(); i.hasNext();) {
+                    nodesToVisit.addLast(i.nextNode());
+                }
+
+                while (!nodesToVisit.isEmpty()) {
+                    Node node = nodesToVisit.remove();
+
+                    if ("class:class".equals(node.getPrimaryNodeType().getName())) {
+                        Properties props = new Properties();
+                        props.put("constructors", node.getNode("class:constructors").getNodes().getSize());
+                        props.put("methods", node.getNode("class:methods").getNodes().getSize());
+                        props.put("fields", node.getNode("class:fields").getNodes().getSize());
+                        
+                        infos.add(new MediaInfo(node.getPath(), node.getName(), "class", props));
+
+                    } else {
+                        for (NodeIterator i = node.getNodes(); i.hasNext();) {
+                            nodesToVisit.addLast(i.nextNode());
+                        }
+                    }
+
+                }
+            }
             if (root.hasNode("java")) {
                 Map<String, List<Properties>> tree = new TreeMap<String, List<Properties>>();
                 // Find the compilation unit node ...
@@ -545,6 +583,7 @@
         if (filename.endsWith(".java")) return "text/x-java-source";
         if (filename.endsWith(".csv")) return "text/csv";
         if (filename.endsWith(".txt")) return "text/plain";
+        if (filename.endsWith(".clazz")) return "application/x-java-class";
         return null;
     }
 

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	2010-01-01 17:46:39 UTC (rev 1512)
@@ -5,7 +5,9 @@
 <mp3='http://www.jboss.org/dna/mp3/1.0'>
 <java='http://www.jboss.org/dna/java/1.0'>
 <zip='http://www.jboss.org/dna/zip/1.0'>
+<class='http://www.jboss.org/dna/sequencer/javaclass/1.0'>
 
+
 // ----------------------------------------------------------
 // JCR Pre-defined Mixin Types that are not loaded by default
 // ----------------------------------------------------------
@@ -283,4 +285,74 @@
 [zip:content] > nt:unstructured, mix:mimeTyped
   + * (nt:folder)
   + * (nt:file)
+
+// -------------------
+// DNA Java Class Sequencer
+// -------------------
+ 
+[class:annotationMember]
+- class:name (string) mandatory
+- class:value (string) 
+
+[class:annotation]
+- class:name (string) mandatory
++ * (class:annotationMember) = class:annotationMember
+
+[class:annotations]
++ * (class:annotation) = class:annotation
+
+[class:field]
+- class:name (string) mandatory 
+- class:typeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:transient (boolean) mandatory
+- class:volatile (boolean) mandatory
++ class:annotations (class:annotations) = class:annotations
+
+[class:fields]
++ * (class:field) = class:field
+
+[class:interfaces]
+- * (string)
+
+[class:parameters]
+- * (string)
+
+[class:method]
+- class:name (string) mandatory 
+- class:returnTypeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:abstract (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:native (boolean) mandatory
+- class:synchronized (boolean) mandatory
+- class:parameters (string) multiple
++ class:annotations (class:annotations) = class:annotations
+
+[class:methods]
++ * (class:method) = class:method
+
+[class:constructors]
++ * (class:method) = class:method
+
+[class:class]
+- class:name (string) mandatory 
+- class:superClassName (string) 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:abstract (boolean) mandatory
+- class:interface (boolean) mandatory
+- class:final (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:interfaces (string) multiple
++ class:annotations (class:annotations) = class:annotations
++ class:constructors (class:constructors) = class:constructors
++ class:methods (class:methods) = class:methods
++ class:fields (class:fields) = class:fields
+
+[class:enum] > class:class
+- class:enumValues (string) mandatory multiple
  
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -35,6 +35,8 @@
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrRepository;
+import org.jboss.dna.sequencer.classfile.ClassFileSequencer;
+import org.jboss.dna.sequencer.classfile.ClassFileSequencerLexicon;
 import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
 import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 import org.jboss.dna.sequencer.zip.ZipSequencer;
@@ -52,6 +54,7 @@
     private URL jpegImageUrl;
     private URL mp3Url;
     private URL jarUrl;
+    private URL classUrl;
     private URL javaSourceUrl;
     private URL csvUrl;
     private URL fixedWidthFileUrl;
@@ -64,6 +67,7 @@
         this.jpegImageUrl = Thread.currentThread().getContextClassLoader().getResource("caution.jpg");
         this.mp3Url = Thread.currentThread().getContextClassLoader().getResource("sample1.mp3");
         this.jarUrl = Thread.currentThread().getContextClassLoader().getResource("test.jar");
+        this.classUrl = Thread.currentThread().getContextClassLoader().getResource("JcrRepository.clazz");
         this.csvUrl = Thread.currentThread().getContextClassLoader().getResource("test.csv");
         this.fixedWidthFileUrl = Thread.currentThread().getContextClassLoader().getResource("fixedWidthFile.txt");
 
@@ -78,9 +82,12 @@
               .usingClass(InMemoryRepositorySource.class)
               .setDescription("The repository for our content")
               .setProperty("defaultWorkspaceName", workspaceName);
+
         // Set up the JCR repository to use the source ...
         config.repository(repositoryId)
               .addNodeTypes(getClass().getClassLoader().getResource("sequencing.cnd"))
+              .registerNamespace(ClassFileSequencerLexicon.Namespace.PREFIX,
+                                 ClassFileSequencerLexicon.Namespace.URI)              
               .setSource("store")
               .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
         // Set up the image sequencer ...
@@ -108,6 +115,13 @@
               .setDescription("Sequences Java files to extract the AST structure of the Java source code")
               .sequencingFrom("//(*.java[*])/jcr:content[@jcr:data]")
               .andOutputtingTo("/java/$1");
+        // Set up the Java class file sequencer ...
+        // Only looking for one class to make verification easier
+        config.sequencer("Java Class Sequencer")
+              .usingClass(ClassFileSequencer.class)
+              .setDescription("Sequences Java class files to extract the structure of the classes")
+              .sequencingFrom("//JcrRepository.clazz[*]/jcr:content[@jcr:data]")
+              .andOutputtingTo("/classes");
         // Set up the CSV file sequencer ...
         config.sequencer("CSV Sequencer")
               .usingClass("org.jboss.dna.sequencer.text.DelimitedTextSequencer")
@@ -124,7 +138,7 @@
               .setProperty("columnStartPositions", new int[] { 10, 20, 30, 40})
               .sequencingFrom("//(*.txt[*])/jcr:content[@jcr:data]")
               .andOutputtingTo("/txt/$1");
-        
+
         // Now start the client and tell it which repository and workspace to use ...
         client = new SequencingClient(config, repositoryId, workspaceName);
     }
@@ -132,6 +146,9 @@
     @After
     public void afterEach() throws Exception {
         if (client != null) client.shutdownRepository();
+        // while (true) {
+        // Thread.sleep(300000);
+        // }
     }
 
     @Test
@@ -202,6 +219,19 @@
     }
 
     @Test
+    public void shouldUploadAndSequenceClassFile() throws Exception {
+        client.setUserInterface(new MockUserInterface(this.classUrl, "/a/b/JcrRepository.clazz", 1));
+        client.startRepository();
+        client.uploadFile();
+
+        waitUntilSequencedNodesIs(1);
+
+        // The sequencers should have run, so perform the search.
+        // The mock user interface checks the results.
+        client.search();
+    }
+
+    @Test
     public void shouldUploadAndSequenceJavaSourceFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.javaSourceUrl, "/a/b/MySource.java", 1));
         client.startRepository();

Added: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ JBoss DNA (http://www.jboss.org/dna)
+  ~
+  ~ See the COPYRIGHT.txt file distributed with this work for information
+  ~ regarding copyright ownership.  Some portions may be licensed
+  ~ to Red Hat, Inc. under one or more contributor license agreements.
+  ~ See the AUTHORS.txt file in the distribution for a full listing of 
+  ~ individual contributors.
+  ~
+  ~ JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+  ~ is licensed to you under the terms of the GNU Lesser General Public License as
+  ~ published by the Free Software Foundation; either version 2.1 of
+  ~ the License, or (at your option) any later version.
+  ~
+  ~ JBoss DNA is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"	[
+<!ENTITY % CustomDTD SYSTEM "../../custom.dtd">
+%CustomDTD;
+]>
+<chapter id="java-class-sequencer">
+  <title>Java Class File Sequencer</title>
+     <para>
+		The Java class file sequencer parses Java class file to extract metadata for the class, its methods, its fields, and its annotations.
+		The output of the sequencer can be customized by using the <code>classFileRecorder</code> or <code>classFileRecorderClassName</code> 
+		properties to provide a custom implementation of the &ClassFileRecorder; interface.  A default implementation (&DefaultClassFileRecorder;) is
+		provided that records all extracted metadata to the output location.  
+		<caution>
+			<para>
+			The Java class file sequencer is being released as a Technology Preview.  It is fully functional, but the output format and node types 
+			associated with the &DefaultClassFileRecorder; may change in future versions to better align with the output of the 
+			&JavaMetadataSequencer;.
+			</para>
+		</caution>
+     </para>
+	<para>
+		As noted previously, the &ClassFileSequencer; class provides a pair of JavaBean properties that can be used to specify a custom &ClassFileRecorder; 
+		implementation to use to map the extracted metadata to an output location:
+	</para>
+	<table frame='all'>
+		<title>&ClassFileSequencer; properties</title>
+		<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+      <colspec colname='c1' colwidth="1*"/>
+      <colspec colname='c2' colwidth="1*"/>
+			<thead>
+				<row>
+		  		<entry>Property</entry>
+		  		<entry>Description</entry>
+				</row>
+			</thead>
+			<tbody>
+				<row>
+					<entry>classFileRecorder</entry>
+					<entry>
+						Optional property that, if set, provides an instance of the &ClassFileRecorder; interface that will be used for all
+						subsequent sequencing activity for this sequencer.  If this property is set to null, a default implementation will be used.  The default 
+						value of this property is null.  
+					</entry>
+				</row>
+				<row>
+					<entry>classFileRecorderClassName</entry>
+					<entry>
+						Optional property that, if set, provides the name of a class that provides a custom implementation of the &ClassFileRecorder; interface.  
+						This class must have a no-argument, public constructor.  If set, an instance of this class will be created immediately and reused for all
+						subsequent sequencing activity for this sequencer.  If this property is set to null, a default implementation will be used.  The default 
+						value of this property is null.  
+					</entry>
+				</row>
+			</tbody>
+		</tgroup>
+	</table>
+	<para>
+		The default class file recorder creates a subgraph rooted at the output location that takes the following form (with primary types in parentheses):  
+	</para>
+	<programlisting>
+&lt;graph root&gt;
+  + &lt;package name 1&gt; (nt:unstructured)
+  	.
+  	.
+  	.
+    + &lt;package name N&gt;(nt:unstructured)
+       + &lt;class name&gt; (class:class)
+         + class:annotations (class:annotations)
+         | + &lt;annotation name&gt; - one per annotation (class:annotation)
+         + class:constructors (class:constructors)
+         | + &lt;constructor parameters&gt; - one per constructor (class:constructor)
+         |   + &lt;annotation name&gt; - one per annotation (class:annotation)
+         + class:methods (class:methods)
+         | + &lt;method name (parameters)&gt; - one per method (class:method)
+         |   + &lt;annotation name&gt; - one per annotation (class:annotation)
+         + class:fields (class:fields)
+           + &lt;field name&gt; - one per field (class:field)
+             + &lt;annotation name&gt; - one per annotation (class:annotation)
+	</programlisting>
+	<para>
+		The compact node definitions for the class:* types is provided below.  <emphasis>Please note that these definitions may change in a future release.</emphasis>
+	</para>
+	<programlisting><![CDATA[
+	
+[class:annotationMember]
+- class:name (string) mandatory
+- class:value (string) 
+
+[class:annotation]
+- class:name (string) mandatory
++ * (class:annotationMember) = class:annotationMember
+
+[class:annotations]
++ * (class:annotation) = class:annotation
+
+[class:field]
+- class:name (string) mandatory 
+- class:typeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:transient (boolean) mandatory
+- class:volatile (boolean) mandatory
++ class:annotations (class:annotations) = class:annotations
+
+[class:fields]
++ * (class:field) = class:field
+
+[class:interfaces]
+- * (string)
+
+[class:parameters]
+- * (string)
+
+[class:method]
+- class:name (string) mandatory 
+- class:returnTypeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:abstract (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:native (boolean) mandatory
+- class:synchronized (boolean) mandatory
+- class:parameters (string) multiple
++ class:annotations (class:annotations) = class:annotations
+
+[class:methods]
++ * (class:method) = class:method
+
+[class:constructors]
++ * (class:method) = class:method
+
+[class:class]
+- class:name (string) mandatory 
+- class:superClassName (string) 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:abstract (boolean) mandatory
+- class:interface (boolean) mandatory
+- class:final (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:interfaces (string) multiple
++ class:annotations (class:annotations) = class:annotations
++ class:constructors (class:constructors) = class:constructors
++ class:methods (class:methods) = class:methods
++ class:fields (class:fields) = class:fields
+
+[class:enum] > class:class
+- class:enumValues (string) mandatory multiple
+ ]]></programlisting>
+    <para>
+        To use this sequencer, simply include the <code>dna-sequencer-classfile</code> JAR
+        in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
+    </para>
+   	<programlisting>
+JcrConfiguration config = ...
+
+config.sequencer("Java Class Sequencer")
+      .usingClass(ClassFileSequencer.class)
+      .setDescription("Sequences Java class files to extract the structure of the classes")
+      .sequencingFrom("//*.class[*]/jcr:content[@jcr:data]")
+      .andOutputtingTo("/classes");
+    </programlisting>
+
+</chapter>
\ No newline at end of file


Property changes on: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-01 17:46:39 UTC (rev 1512)
@@ -155,7 +155,6 @@
 <!ENTITY Sequencer		    			"<ulink url='&API;repository/sequencer/Sequencer.html'><interface>Sequencer</interface></ulink>">
 <!ENTITY SequencerOutput		    			"<ulink url='&API;graph/sequencer/SequencerOutput.html'><interface>SequencerOutput</interface></ulink>">
 <!ENTITY SequencerContext		    			"<ulink url='&API;graph/sequencer/SequencerContext.html'><interface>SequencerContext</interface></ulink>">
-<!ENTITY StreamequencerContext		    "<ulink url='&API;graph/sequencer/StreamequencerContext.html'><interface>StreamequencerContext</interface></ulink>">
 <!ENTITY MimeTypeDetector					  	"<ulink url='&API;graph/mimetype/MimeTypeDetector.html'><interface>MimeTypeDetector</interface></ulink>">
 <!ENTITY MockSequencerOutput		    	"<ulink url='&API;graph/sequencer/MockSequencerOutput.html'><interface>MockSequencerOutput</interface></ulink>">
 <!ENTITY MockSequencerContext		    	"<ulink url='&API;graph/sequencer/MockSequencerContext.html'><interface>MockSequencerContext</interface></ulink>">
@@ -216,6 +215,11 @@
 <!ENTITY DnaJcrDeployer	  						"<ulink url='&API;web/jcr/rest/DnaJcrDeployer.html'><classname>DnaJcrDeployer</classname></ulink>">
 <!ENTITY RepositoryProvider	  				"<ulink url='&API;web/jcr/rest/spi/RepositoryProvider.html'><classname>RepositoryProvider</classname></ulink>">
 
+<!ENTITY JavaMetadataSequencer		  	"<ulink url='&API;sequencer/java/JavaMetadataSequencer.html'><classname>JavaMetadataSequencer</classname></ulink>">
+<!ENTITY ClassFileSequencer		  		"<ulink url='&API;sequencer/classfile/ClassFileSequencer.html'><classname>ClassFileSequencer</classname></ulink>">
+<!ENTITY ClassFileRecorder		  		"<ulink url='&API;sequencer/classfile/ClassFileRecorder.html'><classname>ClassFileRecorder</classname></ulink>">
+<!ENTITY DefaultClassFileRecorder		  "<ulink url='&API;sequencer/classfile/DefaultClassFileRecorder.html'><classname>DefaultClassFileRecorder</classname></ulink>">
+
 <!ENTITY AbstractTextSequencer		  	"<ulink url='&API;sequencer/text/AbstractTextSequencer.html'><classname>AbstractTextSequencer</classname></ulink>">
 <!ENTITY DelimitedTextSequencer		  	"<ulink url='&API;sequencer/text/DelimitedTextSequencer'><classname>DelimitedTextSequencer</classname></ulink>">
 <!ENTITY FixedWidthTextSequencer		"<ulink url='&API;sequencer/text/FixedWidthTextSequencer'><classname>FixedWidthTextSequencer</classname></ulink>">

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2010-01-01 17:46:39 UTC (rev 1512)
@@ -132,6 +132,7 @@
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/zip.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/microsoft_office.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/java_source.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/java_class.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/image.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/mp3.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/ddl.xml"/>

Added: trunk/extensions/dna-sequencer-classfile/.classpath
===================================================================
--- trunk/extensions/dna-sequencer-classfile/.classpath	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/.classpath	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+    <classpathentry kind="src" path="src/main/resources"/>
+  <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+  <classpathentry kind="src" output="target/test-classes" path="src/test/resources"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+  <classpathentry kind="output" path="target/classes"/>
+</classpath>
\ No newline at end of file

Added: trunk/extensions/dna-sequencer-classfile/.project
===================================================================
--- trunk/extensions/dna-sequencer-classfile/.project	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/.project	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>dna-sequencer-classfile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+	</natures>
+</projectDescription>

Added: trunk/extensions/dna-sequencer-classfile/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-classfile/pom.xml	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,66 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-classfile</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Java Class File Sequencer</name>
+  
+  <description>JBoss DNA Sequencer that processes Java class files</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>    
+    <dependency>
+      <groupId>javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <version>3.11.0.GA</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file


Property changes on: trunk/extensions/dna-sequencer-classfile/pom.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileRecorder.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileRecorder.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileRecorder.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,57 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.graph.sequencer.SequencerOutput;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
+import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.EnumMetadata;
+e. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.graph.sequencer.SequencerOutput;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
+import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
+
+/**
+ * A simple interface that allows an implementer to control how class file metadata mapped to properties (including primary and
+ * mixin types) in the graph.
+ * <p>
+ * Implementations of this class must provide a public, no-argument constructor.
+ * </p>
+ * <p>
+ * To use, supply the implementation class name to a {@link ClassFileSequencer} object. Each instance will be reused created for
+ * over multiple {@link ClassFileSequencer#sequence(java.io.InputStream, SequencerOutput, StreamSequencerContext) sequence calls},
+ * so implementations of this interface <b>must</b> be thread-safe.
+ * </p>
+ */
+ at ThreadSafe
+public interface ClassFileRecorder {
+
+    /**
+     * Records a row using the provided {@link SequencerOutput} instance.
+     * 
+     * @param context the sequencer context
+     * @param output the {@link StreamSequencer} output
+     * @param classMetadata the metadata for the class file
+     */
+    void recordClass( StreamSequencerContext context,
+                    SequencerOutput output,
+                          ClassMetadata classMetadata );
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileRecorder.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,90 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import java.io.InputStream;
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.sequencer.SequencerOutput;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
+import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.classfile.metadata.ClassFileMetadataReader;
+import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
+
+ at Immutable
+public class ClassFileSequencer implements StreamSequencer {
+
+    private static final ClassFileRecorder DEFAULT_CLASS_FILE_RECORDER = new DefaultClassFileRecorder();
+
+    private ClassFileRecorder classFileRecorder = DEFAULT_CLASS_FILE_RECORDER;
+
+    @Override
+    public void sequence( InputStream stream,
+                          SequencerOutput output,
+                          StreamSequencerContext context ) {
+
+        try {
+            ClassMetadata classMetadata = ClassFileMetadataReader.instance(stream);
+
+            classFileRecorder.recordClass(context, output, classMetadata);
+        } catch (Exception ex) {
+            context.getLogger(getClass()).error(ex, ClassFileSequencerI18n.errorSequencingClass, context.getInputPath());
+        }
+    }
+
+    /**
+     * Sets the custom {@link ClassFileRecorder} by specifying a class name. This method attempts to instantiate an instance of
+     * the custom {@link ClassFileRecorder} class prior to ensure that the new value represents a valid implementation.
+     * 
+     * @param classFileRecorderClassName the fully-qualified class name of the new custom class file recorder implementation; null
+     *        indicates that {@link DefaultClassFileRecorder the default class file recorder} should be used.
+     * @throws ClassNotFoundException if the the class for the {@code ClassFileRecorder} implementation cannot be located
+     * @throws IllegalAccessException if the row factory class or its nullary constructor is not accessible.
+     * @throws InstantiationException if the row factory represents an abstract class, an interface, an array class, a primitive
+     *         type, or void; or if the class has no nullary constructor; or if the instantiation fails for some other reason.
+     * @throws ClassCastException if the instantiated class file recorder does not implement the {@link ClassFileRecorder}
+     *         interface
+     */
+    public void setClassFileRecorderClassName( String classFileRecorderClassName )
+        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+
+        if (classFileRecorderClassName == null) {
+            this.classFileRecorder = DEFAULT_CLASS_FILE_RECORDER;
+            return;
+        }
+
+        Class<?> classFileRecorderClass = Class.forName(classFileRecorderClassName);
+        this.classFileRecorder = (ClassFileRecorder)classFileRecorderClass.newInstance();
+    }
+
+    /**
+     * Sets a custom {@link ClassFileRecorder}. If {@code classFileRecorder} is null, then the {@link DefaultClassFileRecorder
+     * default class file recorder} will be used.
+     * 
+     * @param classFileRecorder the new custom class file recorder implementation; null indicates that
+     *        {@link DefaultClassFileRecorder the default class file recorder} should be used.
+     */
+    public void setClassFileRecorder( ClassFileRecorder classFileRecorder ) {
+        this.classFileRecorder = classFileRecorder == null ? DEFAULT_CLASS_FILE_RECORDER : classFileRecorder;
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,56 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import java.util.Locale;
+import java.util.Set;
+import org.jboss.dna.common.i18n.I18n;
+
+/**
+ * The internationalized string constants for the <code>org.jboss.dna.sequencer.text</code> packages.
+ */
+public final class ClassFileSequencerI18n {
+
+    public static I18n errorSequencingClass;
+
+    static {
+        try {
+            I18n.initialize(ClassFileSequencerI18n.class);
+        } catch (final Exception err) {
+            System.err.println(err);
+        }
+    }
+
+    public static Set<Locale> getLocalizationProblemLocales() {
+        return I18n.getLocalizationProblemLocales(ClassFileSequencerI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems() {
+        return I18n.getLocalizationProblems(ClassFileSequencerI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems( Locale locale ) {
+        return I18n.getLocalizationProblems(ClassFileSequencerI18n.class, locale);
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,68 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.basic.BasicName;
+
+/**
+ * The namespace and property names used within a {@link ClassFileSequencer} to store internal information.
+ */
+public class ClassFileSequencerLexicon {
+
+    public static class Namespace {
+        public static final String URI = "http://www.jboss.org/dna/sequencer/javaclass/1.0";
+        public static final String PREFIX = "class";
+    }
+
+    public static final Name ABSTRACT = new BasicName(Namespace.URI, "abstract");
+    public static final Name ANNOTATION = new BasicName(Namespace.URI, "annotation");
+    public static final Name ANNOTATIONS = new BasicName(Namespace.URI, "annotations");
+    public static final Name ANNOTATION_MEMBER = new BasicName(Namespace.URI, "annotationMember");
+    public static final Name CLASS = new BasicName(Namespace.URI, "class");
+    public static final Name CONSTRUCTORS = new BasicName(Namespace.URI, "constructors");
+    public static final Name ENUM_VALUES = new BasicName(Namespace.URI, "enumValues");
+    public static final Name ENUM = new BasicName(Namespace.URI, "enum");
+    public static final Name FIELD = new BasicName(Namespace.URI, "field");
+    public static final Name FIELDS = new BasicName(Namespace.URI, "fields");
+    public static final Name FINAL = new BasicName(Namespace.URI, "final");
+    public static final Name INTERFACE = new BasicName(Namespace.URI, "interface");
+    public static final Name INTERFACES = new BasicName(Namespace.URI, "interfaces");
+    public static final Name METHOD = new BasicName(Namespace.URI, "method");
+    public static final Name METHODS = new BasicName(Namespace.URI, "methods");
+    public static final Name NAME = new BasicName(Namespace.URI, "name");
+    public static final Name NATIVE = new BasicName(Namespace.URI, "native");
+    public static final Name PARAMETERS = new BasicName(Namespace.URI, "parameters");
+    public static final Name RETURN_TYPE_CLASS_NAME = new BasicName(Namespace.URI, "returnTypeClassName");
+    public static final Name STATIC = new BasicName(Namespace.URI, "static");
+    public static final Name STRICT_FP = new BasicName(Namespace.URI, "strictFp");
+    public static final Name SUPER_CLASS_NAME = new BasicName(Namespace.URI, "superClassName");
+    public static final Name SYNCHRONIZED = new BasicName(Namespace.URI, "synchronized");
+    public static final Name TRANSIENT = new BasicName(Namespace.URI, "transient");
+    public static final Name TYPE_CLASS_NAME = new BasicName(Namespace.URI, "typeClassName");
+    public static final Name VALUE = new BasicName(Namespace.URI, "value");
+    public static final Name VISIBILITY = new BasicName(Namespace.URI, "visibility");
+    public static final Name VOLATILE = new BasicName(Namespace.URI, "volatile");
+
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,235 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.PathFactory;
+import org.jboss.dna.graph.property.Path.Segment;
+import org.jboss.dna.graph.sequencer.SequencerOutput;
+import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.classfile.metadata.AnnotationMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.EnumMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.FieldMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.MethodMetadata;
+
+public class DefaultClassFileRecorder implements ClassFileRecorder {
+
+    @Override
+    public void recordClass( StreamSequencerContext context,
+                             SequencerOutput output,
+                             ClassMetadata classMetadata ) {
+
+        PathFactory pathFactory = pathFactoryFor(context);
+        Path classPath = pathFor(pathFactory, classMetadata);
+
+        writeClassNode(output, pathFactory, classPath, classMetadata);
+    }
+
+    private PathFactory pathFactoryFor( StreamSequencerContext context ) {
+        return context.getValueFactories().getPathFactory();
+    }
+
+    private Path pathFor( PathFactory pathFactory,
+                          ClassMetadata cmd ) {
+        List<Segment> segments = new LinkedList<Segment>();
+
+        for (String segment : cmd.getClassName().split("\\.")) {
+            segments.add(pathFactory.createSegment(segment));
+        }
+
+        return pathFactory.createRelativePath(segments);
+    }
+
+    private void writeClassNode( SequencerOutput output,
+                                 PathFactory pathFactory,
+                                 Path classPath,
+                                 ClassMetadata cmd ) {
+
+        /*
+        - class:name (string) mandatory 
+        - class:superClassName (string) 
+        - class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+        - class:abstract (boolean) mandatory
+        - class:interface (boolean) mandatory
+        - class:final (boolean) mandatory
+        - class:strictFp (boolean) mandatory
+        - class:interfaces (string) multiple
+        + class:annotations (class:annotations) = class:annotations
+        + class:constructors (class:constructors) = class:constructors
+        + class:methods (class:methods) = class:methods
+        + class:fields (class:fields) = class:fields
+         */
+
+        output.setProperty(classPath, ClassFileSequencerLexicon.NAME, cmd.getClassName());
+        output.setProperty(classPath, ClassFileSequencerLexicon.SUPER_CLASS_NAME, cmd.getSuperclassName());
+        output.setProperty(classPath, ClassFileSequencerLexicon.VISIBILITY, cmd.getVisibility().getDescription());
+        output.setProperty(classPath, ClassFileSequencerLexicon.ABSTRACT, cmd.isAbstract());
+        output.setProperty(classPath, ClassFileSequencerLexicon.INTERFACE, cmd.isInterface());
+        output.setProperty(classPath, ClassFileSequencerLexicon.FINAL, cmd.isFinal());
+        output.setProperty(classPath, ClassFileSequencerLexicon.STRICT_FP, cmd.isStrictFp());
+        output.setProperty(classPath, ClassFileSequencerLexicon.INTERFACES, (Object[])cmd.getInterfaces());
+
+        Path constructorsPath = pathFactory.create(classPath, ClassFileSequencerLexicon.CONSTRUCTORS);
+        output.setProperty(constructorsPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.CONSTRUCTORS);
+        writeMethods(output, pathFactory, constructorsPath, cmd.getConstructors());
+
+        Path methodsPath = pathFactory.create(classPath, ClassFileSequencerLexicon.METHODS);
+        output.setProperty(methodsPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.METHODS);
+        writeMethods(output, pathFactory, methodsPath, cmd.getMethods());
+
+        writeFieldsNode(output, pathFactory, classPath, cmd.getFields());
+        writeAnnotationsNode(output, pathFactory, classPath, cmd.getAnnotations());
+
+        if (cmd instanceof EnumMetadata) {
+            output.setProperty(classPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.ENUM);
+
+            output.setProperty(classPath, ClassFileSequencerLexicon.ENUM_VALUES, ((EnumMetadata)cmd).getValues().toArray());
+        }
+        else {
+            output.setProperty(classPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.CLASS);
+        }
+    }
+
+    private void writeFieldsNode( SequencerOutput output,
+                                  PathFactory pathFactory,
+                                  Path classPath,
+                                  List<FieldMetadata> fields ) {
+
+        /*
+            [class:field]
+            - class:name (string) mandatory 
+            - class:typeClassName (string) mandatory 
+            - class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+            - class:static (boolean) mandatory
+            - class:final (boolean) mandatory
+            - class:transient (boolean) mandatory
+            - class:volatile (boolean) mandatory
+            + class:annotations (class:annotations) = class:annotations
+            
+            [class:fields]
+            + * (class:field) = class:field
+         */
+
+        Path fieldsPath = pathFactory.create(classPath, ClassFileSequencerLexicon.FIELDS);
+        output.setProperty(fieldsPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.FIELDS);
+
+        for (FieldMetadata field : fields) {
+            Path fieldPath = pathFactory.create(fieldsPath, field.getName());
+
+            output.setProperty(fieldPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.FIELD);
+            output.setProperty(fieldPath, ClassFileSequencerLexicon.NAME, field.getName());
+            output.setProperty(fieldPath, ClassFileSequencerLexicon.TYPE_CLASS_NAME, field.getTypeName());
+            output.setProperty(fieldPath, ClassFileSequencerLexicon.VISIBILITY, field.getVisibility().getDescription());
+            output.setProperty(classPath, ClassFileSequencerLexicon.STATIC, field.isStatic());
+            output.setProperty(classPath, ClassFileSequencerLexicon.FINAL, field.isFinal());
+            output.setProperty(classPath, ClassFileSequencerLexicon.TRANSIENT, field.isTransient());
+            output.setProperty(classPath, ClassFileSequencerLexicon.VOLATILE, field.isVolatile());
+
+            writeAnnotationsNode(output, pathFactory, fieldPath, field.getAnnotations());
+
+        }
+    }
+
+    private void writeMethods( SequencerOutput output,
+                               PathFactory pathFactory,
+                               Path methodsPath,
+                               List<MethodMetadata> methods ) {
+
+        /*
+            [class:method]
+            - class:name (string) mandatory 
+            - class:returnTypeClassName (string) mandatory 
+            - class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+            - class:static (boolean) mandatory
+            - class:final (boolean) mandatory
+            - class:abstract (boolean) mandatory
+            - class:strictFp (boolean) mandatory
+            - class:native (boolean) mandatory
+            - class:synchronized (boolean) mandatory
+            - class:parameters (string) multiple
+            + class:annotations (class:annotations) = class:annotations
+         */
+
+        for (MethodMetadata method : methods) {
+            Path methodPath = pathFactory.create(methodsPath, method.getId());
+
+            output.setProperty(methodPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.METHOD);
+            output.setProperty(methodPath, ClassFileSequencerLexicon.NAME, method.getName());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.RETURN_TYPE_CLASS_NAME, method.getReturnType());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.VISIBILITY, method.getVisibility().getDescription());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.STATIC, method.isStatic());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.FINAL, method.isFinal());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.ABSTRACT, method.isAbstract());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.STRICT_FP, method.isStrictFp());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.NATIVE, method.isNative());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.SYNCHRONIZED, method.isSynchronized());
+            output.setProperty(methodPath, ClassFileSequencerLexicon.PARAMETERS, method.getParameters().toArray());
+
+            writeAnnotationsNode(output, pathFactory, methodPath, method.getAnnotations());
+
+        }
+
+    }
+
+    private void writeAnnotationsNode( SequencerOutput output,
+                                       PathFactory pathFactory,
+                                       Path parentPath,
+                                       List<AnnotationMetadata> annotations ) {
+
+        /*
+        [class:annotationMember]
+        - class:name (string) mandatory
+        - class:value (string) 
+        
+        [class:annotation]
+        - class:name (string) mandatory
+        + * (class:annotationMember) = class:annotationMember
+        
+        [class:annotations]
+        + * (class:annotation) = class:annotation
+         */
+
+        Path annotationsPath = pathFactory.create(parentPath, ClassFileSequencerLexicon.ANNOTATIONS);
+        output.setProperty(annotationsPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.ANNOTATIONS);
+
+        for (AnnotationMetadata annotation : annotations) {
+            Path annotationPath = pathFactory.create(parentPath, annotation.getAnnotationClassName());
+            output.setProperty(annotationPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.ANNOTATION);
+
+            for (Map.Entry<String, String> entry : annotation.getMemberValues().entrySet()) {
+                Path annotationMemberPath = pathFactory.create(annotationPath, entry.getKey());
+                output.setProperty(annotationMemberPath, JcrLexicon.PRIMARY_TYPE, ClassFileSequencerLexicon.ANNOTATION_MEMBER);
+                output.setProperty(annotationMemberPath, ClassFileSequencerLexicon.NAME, entry.getKey());
+                output.setProperty(annotationMemberPath, ClassFileSequencerLexicon.VALUE, entry.getValue());
+
+            }
+
+        }
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/AnnotationMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/AnnotationMetadata.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/AnnotationMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,92 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import javassist.bytecode.annotation.Annotation;
+import net.jcip.annotations.Immutable;
+
+ at Immutable
+public class AnnotationMetadata {
+
+    private final String annotationClassName;
+    private final Map<String, String> memberValues;
+
+    @SuppressWarnings( "unchecked" )
+    AnnotationMetadata( Annotation annotation ) {
+        this.annotationClassName = annotation.getTypeName();
+
+        Set<Object> memberNames = annotation.getMemberNames();
+        if (memberNames != null) {
+            Map<String, String> members = new HashMap<String, String>(memberNames.size());
+
+            for (Object rawMemberName : memberNames) {
+                String memberName = (String)rawMemberName;
+
+                members.put(memberName, annotation.getMemberValue(memberName).toString());
+            }
+
+            this.memberValues = Collections.unmodifiableMap(members);
+        } else {
+            this.memberValues = Collections.emptyMap();
+        }
+    }
+
+    public String getAnnotationClassName() {
+        return annotationClassName;
+    }
+
+    public Map<String, String> getMemberValues() {
+        return memberValues;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+
+        buff.append('@').append(annotationClassName);
+
+        if (!memberValues.isEmpty()) {
+            buff.append('(');
+
+            boolean first = true;
+            for (Map.Entry<String, String> entry : memberValues.entrySet()) {
+                if (first) {
+                    first = false;
+                } else {
+                    buff.append(", ");
+                }
+                buff.append(entry.getKey()).append('=').append(entry.getValue());
+            }
+
+            buff.append(')');
+        }
+
+        return buff.toString();
+    }
+
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/AnnotationMetadata.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReader.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReader.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReader.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,45 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.io.DataInputStream;
+import java.io.InputStream;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.ClassFile;
+
+/**
+ * Utility for extracting metadata from Java class files
+ */
+public class ClassFileMetadataReader {
+
+    public static ClassMetadata instance( InputStream stream ) throws Exception {
+        ClassFile clazz = new ClassFile(new DataInputStream(stream));
+
+        if ((AccessFlag.ENUM & clazz.getAccessFlags()) == AccessFlag.ENUM) {
+            return new EnumMetadata(clazz);
+        }
+
+        return new ClassMetadata(clazz);
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReader.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassMetadata.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,229 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.AttributeInfo;
+import javassist.bytecode.ClassFile;
+import javassist.bytecode.FieldInfo;
+import javassist.bytecode.MethodInfo;
+import javassist.bytecode.annotation.Annotation;
+import net.jcip.annotations.Immutable;
+
+ at Immutable
+public class ClassMetadata {
+
+    private final ClassFile clazz;
+
+    private final List<AnnotationMetadata> annotations;
+    private final List<FieldMetadata> fields;
+    private final List<MethodMetadata> methods;
+    private final List<MethodMetadata> constructors;
+
+    ClassMetadata( ClassFile clazz ) {
+        this.clazz = clazz;
+        this.annotations = annotationsFor(clazz);
+        this.fields = fieldsFor(clazz);
+        this.methods = methodsFor(clazz);
+        this.constructors = constructorsFor(clazz);
+    }
+
+    private List<AnnotationMetadata> annotationsFor( ClassFile clazz ) {
+        List<AnnotationMetadata> annotations = new LinkedList<AnnotationMetadata>();
+
+        for (Object ob : clazz.getAttributes()) {
+            AttributeInfo att = (AttributeInfo)ob;
+
+            if (att instanceof AnnotationsAttribute) {
+                for (Annotation ann : ((AnnotationsAttribute)att).getAnnotations()) {
+                    annotations.add(new AnnotationMetadata(ann));
+                }
+            }
+        }
+
+        return Collections.unmodifiableList(annotations);
+    }
+
+    private List<FieldMetadata> fieldsFor( ClassFile clazz ) {
+        List<FieldMetadata> fields = new LinkedList<FieldMetadata>();
+
+        for (Object field : clazz.getFields()) {
+            fields.add(new FieldMetadata((FieldInfo)field));
+        }
+
+        Collections.sort(fields);
+
+        return Collections.unmodifiableList(fields);
+    }
+
+    private List<MethodMetadata> methodsFor( ClassFile clazz ) {
+        List<MethodMetadata> methods = new LinkedList<MethodMetadata>();
+
+        for (Object ob : clazz.getMethods()) {
+            MethodInfo method = (MethodInfo)ob;
+
+            if (!method.isStaticInitializer() && !method.isConstructor()) {
+                methods.add(new MethodMetadata(clazz, method));
+            }
+        }
+
+        Collections.sort(methods);
+
+        return Collections.unmodifiableList(methods);
+    }
+
+    private List<MethodMetadata> constructorsFor( ClassFile clazz ) {
+        List<MethodMetadata> ctors = new LinkedList<MethodMetadata>();
+
+        for (Object ob : clazz.getMethods()) {
+            MethodInfo method = (MethodInfo)ob;
+            if (!method.isStaticInitializer() && method.isConstructor()) {
+                ctors.add(new MethodMetadata(clazz, method));
+            }
+        }
+
+        Collections.sort(ctors);
+
+        return Collections.unmodifiableList(ctors);
+    }
+
+    public boolean isEnumeration() {
+        return false;
+    }
+
+    public String getClassName() {
+        return clazz.getName();
+    }
+
+    public String getSuperclassName() {
+        return clazz.getSuperclass();
+    }
+
+    public String[] getInterfaces() {
+        return clazz.getInterfaces();
+    }
+
+    public boolean isAbstract() {
+        return clazz.isAbstract();
+    }
+
+    public boolean isInterface() {
+        return clazz.isInterface();
+    }
+
+    public boolean isStrictFp() {
+        return AccessFlag.STRICT == (AccessFlag.STRICT & clazz.getAccessFlags());
+    }
+
+    public boolean isFinal() {
+        return AccessFlag.FINAL == (AccessFlag.FINAL & clazz.getAccessFlags());
+    }
+
+    public Visibility getVisibility() {
+        return Visibility.fromAccessFlags(clazz.getAccessFlags());
+    }
+
+    public List<AnnotationMetadata> getAnnotations() {
+        return annotations;
+    }
+
+    public List<FieldMetadata> getFields() {
+        return fields;
+    }
+
+    public List<MethodMetadata> getMethods() {
+        return methods;
+    }
+
+    public List<MethodMetadata> getConstructors() {
+        return constructors;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+
+        for (AnnotationMetadata annotation : annotations) {
+            buff.append(annotation).append('\n');
+        }
+
+        buff.append(getVisibility());
+        if (getVisibility() != Visibility.PACKAGE) {
+            buff.append(' ');
+        }
+
+        if (isAbstract()) {
+            if (isInterface()) {
+                buff.append("interface ");
+            } else {
+                buff.append("abstract class ");
+
+            }
+        } else {
+            buff.append("class ");
+        }
+
+        if (getSuperclassName() != null && !Object.class.getName().equals(getSuperclassName())) {
+            buff.append(" extends ").append(getSuperclassName()).append(" ");
+        }
+
+        if (getInterfaces().length > 0) {
+            boolean first = true;
+            buff.append(" implements ");
+
+            for (String interfaceName : getInterfaces()) {
+                if (first) {
+                    first = false;
+                } else {
+                    buff.append(", ");
+                }
+                buff.append(interfaceName);
+            }
+
+            buff.append(' ');
+        }
+
+        buff.append(getClassName()).append(" {\n");
+
+        for (FieldMetadata field : fields) {
+            buff.append('\t').append(field).append('\n');
+        }
+
+        if (!methods.isEmpty()) {
+            buff.append('\n');
+        }
+
+        for (MethodMetadata method : methods) {
+            buff.append('\t').append(method).append('\n');
+        }
+
+        buff.append("}");
+
+        return buff.toString();
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/ClassMetadata.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/EnumMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/EnumMetadata.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/EnumMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,75 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.ClassFile;
+
+public class EnumMetadata extends ClassMetadata {
+
+    private final List<FieldMetadata> enumFields;
+    private final List<String> values;
+
+    public EnumMetadata( ClassFile clazz ) {
+        super(clazz);
+
+        assert (clazz.getAccessFlags() & AccessFlag.ENUM) == AccessFlag.ENUM;
+        List<FieldMetadata> fieldsFromClass = super.getFields();
+
+        /*
+         * Each enum value is stored as a static field in the class file.  Filter those out and treat them separately.
+         */
+        List<FieldMetadata> enumFields = new ArrayList<FieldMetadata>(fieldsFromClass.size());
+        List<String> values = new ArrayList<String>(fieldsFromClass.size());
+        for (FieldMetadata fieldFromClass : fieldsFromClass) {
+            if (fieldFromClass.getTypeName().equals(getClassName())) {
+                values.add(fieldFromClass.getName());
+            } else {
+                enumFields.add(fieldFromClass);
+            }
+        }
+
+        this.enumFields = Collections.unmodifiableList(enumFields);
+        this.values = Collections.unmodifiableList(values);
+
+    }
+    
+    public List<String> getValues() {
+        return values;
+    }
+
+    @Override
+    public List<FieldMetadata> getFields() {
+        return enumFields;
+    }
+
+    @Override
+    public boolean isEnumeration() {
+        return true;
+    }
+
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/EnumMetadata.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,128 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.AttributeInfo;
+import javassist.bytecode.Descriptor;
+import javassist.bytecode.FieldInfo;
+import javassist.bytecode.annotation.Annotation;
+
+public class FieldMetadata implements Comparable<FieldMetadata> {
+
+    private final FieldInfo field;
+    private final List<AnnotationMetadata> annotations;
+
+    FieldMetadata( FieldInfo field ) {
+        this.field = field;
+        this.annotations = annotationsFor(field);
+    }
+
+    private List<AnnotationMetadata> annotationsFor( FieldInfo field ) {
+        List<AnnotationMetadata> annotations = new LinkedList<AnnotationMetadata>();
+
+        for (Object ob : field.getAttributes()) {
+            AttributeInfo att = (AttributeInfo)ob;
+
+            if (att instanceof AnnotationsAttribute) {
+                for (Annotation ann : ((AnnotationsAttribute)att).getAnnotations()) {
+                    annotations.add(new AnnotationMetadata(ann));
+                }
+            }
+        }
+
+        return Collections.unmodifiableList(annotations);
+    }
+
+    public String getName() {
+        return field.getName();
+    }
+
+    public boolean isStatic() {
+        return AccessFlag.STATIC == (AccessFlag.STATIC & field.getAccessFlags());
+    }
+
+    public boolean isFinal() {
+        return AccessFlag.FINAL == (AccessFlag.FINAL & field.getAccessFlags());
+    }
+
+    public boolean isTransient() {
+        return AccessFlag.TRANSIENT == (AccessFlag.TRANSIENT & field.getAccessFlags());
+    }
+
+    public boolean isVolatile() {
+        return AccessFlag.VOLATILE == (AccessFlag.VOLATILE & field.getAccessFlags());
+    }
+
+    public Visibility getVisibility() {
+        return Visibility.fromAccessFlags(field.getAccessFlags());
+    }
+
+    public String getTypeName() {
+        return Descriptor.toClassName(field.getDescriptor());
+    }
+
+    public List<AnnotationMetadata> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public int compareTo( FieldMetadata o ) {
+        if (this.isStatic() && !o.isStatic()) {
+            return 1;
+        }
+        if (!this.isStatic() && o.isStatic()) {
+            return -1;
+        }
+
+        return this.getName().compareTo(o.getName());
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+
+        if (!annotations.isEmpty()) {
+            for (AnnotationMetadata annotation : annotations) {
+                buff.append(annotation).append("\n\t");
+            }
+        }
+
+        buff.append(getVisibility());
+        if (getVisibility() != Visibility.PACKAGE) buff.append(' ');
+
+        if (isFinal()) buff.append("final ");
+        if (isStatic()) buff.append("static ");
+        if (isTransient()) buff.append("transient ");
+
+        buff.append(Descriptor.toClassName(getTypeName())).append(' ');
+        buff.append(getName()).append(';');
+
+        return buff.toString();
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/MethodMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/MethodMetadata.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/MethodMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,240 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import javassist.bytecode.AccessFlag;
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.AttributeInfo;
+import javassist.bytecode.ClassFile;
+import javassist.bytecode.Descriptor;
+import javassist.bytecode.MethodInfo;
+import javassist.bytecode.annotation.Annotation;
+
+public class MethodMetadata implements Comparable<MethodMetadata> {
+
+    private final MethodInfo method;
+    private final String name;
+    private final List<AnnotationMetadata> annotations;
+    private final List<String> parameters;
+
+    MethodMetadata( ClassFile clazz,
+                    MethodInfo method ) {
+        this.method = method;
+        this.name = method.isConstructor() ? clazz.getName() : method.getName();
+        this.annotations = annotationsFor(method);
+        this.parameters = parametersFor(method);
+    }
+
+    private List<String> parametersFor( MethodInfo method ) {
+        String descriptor = method.getDescriptor();
+        int lastParenPos = descriptor.lastIndexOf(')');
+        assert lastParenPos >= 0;
+        String parameterString = descriptor.substring(1, lastParenPos);
+
+        if (parameterString.length() == 0) {
+            return Collections.emptyList();
+        }
+
+        List<String> parameters = new ArrayList<String>();
+        Descriptor.Iterator iter = new Descriptor.Iterator(parameterString);
+        
+        assert iter.hasNext();
+        int startPos = iter.next();
+
+        while (iter.hasNext()) {
+            int endPos = iter.next();
+            parameters.add(Descriptor.toClassName(parameterString.substring(startPos, endPos)));
+            startPos = endPos;
+        }
+        parameters.add(Descriptor.toClassName(parameterString.substring(startPos)));
+
+        return parameters;
+    }
+
+    private String returnTypeFor( MethodInfo method ) {
+        String descriptor = method.getDescriptor();
+        int lastParenPos = descriptor.lastIndexOf(')');
+        assert lastParenPos >= 0;
+        return Descriptor.toClassName(descriptor.substring(lastParenPos + 1));
+    }
+
+    private List<AnnotationMetadata> annotationsFor( MethodInfo method ) {
+        List<AnnotationMetadata> annotations = new LinkedList<AnnotationMetadata>();
+
+        for (Object ob : method.getAttributes()) {
+            AttributeInfo att = (AttributeInfo)ob;
+
+            if (att instanceof AnnotationsAttribute) {
+                for (Annotation ann : ((AnnotationsAttribute)att).getAnnotations()) {
+                    annotations.add(new AnnotationMetadata(ann));
+                }
+            }
+        }
+
+        return annotations;
+    }
+
+    private String shortNameFor( String type ) {
+        int lastDotPos = type.lastIndexOf('.');
+        if (lastDotPos < 0) return type;
+        return type.substring(lastDotPos + 1);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Visibility getVisibility() {
+        return Visibility.fromAccessFlags(method.getAccessFlags());
+    }
+
+    public boolean isConstructor() {
+        return method.isConstructor();
+    }
+
+    public String getReturnType() {
+        return returnTypeFor(method);
+    }
+
+    public List<AnnotationMetadata> getAnnotations() {
+        return annotations;
+    }
+
+    public List<String> getParameters() {
+        return parameters;
+    }
+
+    public boolean isStatic() {
+        return AccessFlag.STATIC == (AccessFlag.STATIC & method.getAccessFlags());
+    }
+
+    public boolean isFinal() {
+        return AccessFlag.FINAL == (AccessFlag.FINAL & method.getAccessFlags());
+    }
+
+    public boolean isAbstract() {
+        return AccessFlag.ABSTRACT == (AccessFlag.ABSTRACT & method.getAccessFlags());
+    }
+
+    public boolean isNative() {
+        return AccessFlag.NATIVE == (AccessFlag.NATIVE & method.getAccessFlags());
+    }
+
+    public boolean isStrictFp() {
+        return AccessFlag.STRICT == (AccessFlag.STRICT & method.getAccessFlags());
+    }
+
+    public boolean isSynchronized() {
+        return AccessFlag.SYNCHRONIZED == (AccessFlag.SYNCHRONIZED & method.getAccessFlags());
+    }
+
+    public int compareTo( MethodMetadata o ) {
+        if (this.isStatic() && !o.isStatic()) {
+            return -1;
+        }
+        if (!this.isStatic() && o.isStatic()) {
+            return 1;
+        }
+
+        if (!this.name.equals(o.name)) {
+            return this.name.compareTo(o.name);
+        }
+
+        if (this.parameters.size() != o.parameters.size()) {
+            return ((Integer)this.parameters.size()).compareTo(o.parameters.size());
+        }
+
+        for (int i = 0; i < parameters.size(); i++) {
+            String p1 = this.parameters.get(i);
+            String p2 = o.parameters.get(i);
+
+            if (!p1.equals(p2)) {
+                return p1.compareTo(p2);
+            }
+        }
+
+        return 0;
+    }
+
+    public String getId() {
+        StringBuilder buff = new StringBuilder();
+        buff.append(method.getName()).append('(');
+        
+        boolean first = false;
+        for (String parameter : parameters) {
+            if (first) {
+                first = false;
+            } else {
+                buff.append(", ");
+            }
+            buff.append(shortNameFor(parameter).replace("[]", " array"));
+        }
+
+        buff.append(')');
+        
+        return buff.toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+
+        if (!annotations.isEmpty()) {
+            for (AnnotationMetadata annotation : annotations) {
+                buff.append(annotation).append("\n\t");
+            }
+        }
+
+        buff.append(getVisibility());
+        if (getVisibility() != Visibility.PACKAGE) buff.append(' ');
+
+        if (isFinal()) buff.append("final ");
+        if (isStatic()) buff.append("static ");
+
+        buff.append(shortNameFor(getReturnType())).append(' ');
+        buff.append(name).append('(');
+
+        boolean first = true;
+
+        for (String parameter : parameters) {
+            if (first) {
+                first = false;
+            } else {
+                buff.append(", ");
+            }
+            buff.append(shortNameFor(parameter));
+        }
+
+        buff.append(' ');
+        
+        buff.append(");");
+
+        return buff.toString();
+    }
+
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/MethodMetadata.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/Visibility.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/Visibility.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/Visibility.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,65 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import javassist.bytecode.AccessFlag;
+
+public enum Visibility {
+
+    PUBLIC("public"),
+    PROTECTED("protected"),
+    PACKAGE(""),
+    PRIVATE("private");
+
+    private static final int VISBILITY_MASK = AccessFlag.PUBLIC | AccessFlag.PRIVATE | AccessFlag.PROTECTED;
+
+    private final String description;
+
+    private Visibility( String description ) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    @Override
+    public String toString() {
+        return description;
+    }
+
+    public static Visibility fromAccessFlags( int accessFlags ) {
+        switch (accessFlags & VISBILITY_MASK) {
+            case AccessFlag.PUBLIC:
+                return Visibility.PUBLIC;
+            case AccessFlag.PROTECTED:
+                return Visibility.PROTECTED;
+            case AccessFlag.PRIVATE:
+                return Visibility.PRIVATE;
+            default:
+                return Visibility.PACKAGE;
+        }
+
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/Visibility.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/package-info.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/package-info.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,29 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ * The classes that provide the ability to sequence Java class files into metadata and then write that metadata to a graph in a customizable way.  
+ */
+
+package org.jboss.dna.sequencer.classfile;
+


Property changes on: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/package-info.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.properties
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.properties	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18n.properties	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,25 @@
+#
+# JBoss DNA (http://www.jboss.org/dna)
+# See the COPYRIGHT.txt file distributed with this work for information
+# regarding copyright ownership.  Some portions may be licensed
+# to Red Hat, Inc. under one or more contributor license agreements.
+# See the AUTHORS.txt file in the distribution for a full listing of 
+# individual contributors. 
+#
+# JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+# is licensed to you under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# JBoss DNA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+
+errorSequencingClass = Error sequencing class at path "{0}"

Added: trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,91 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+<class='http://www.jboss.org/dna/sequencer/javaclass/1.0'>
+
+[class:annotationMember]
+- class:name (string) mandatory
+- class:value (string) 
+
+[class:annotation]
+- class:name (string) mandatory
++ * (class:annotationMember) = class:annotationMember
+
+[class:annotations]
++ * (class:annotation) = class:annotation
+
+[class:field]
+- class:name (string) mandatory 
+- class:typeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:transient (boolean) mandatory
+- class:volatile (boolean) mandatory
++ class:annotations (class:annotations) = class:annotations
+
+[class:fields]
++ * (class:field) = class:field
+
+[class:interfaces]
+- * (string)
+
+[class:parameters]
+- * (string)
+
+[class:method]
+- class:name (string) mandatory 
+- class:returnTypeClassName (string) mandatory 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:static (boolean) mandatory
+- class:final (boolean) mandatory
+- class:abstract (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:native (boolean) mandatory
+- class:synchronized (boolean) mandatory
+- class:parameters (string) multiple
++ class:annotations (class:annotations) = class:annotations
+
+[class:methods]
++ * (class:method) = class:method
+
+[class:constructors]
++ * (class:method) = class:method
+
+[class:class]
+- class:name (string) mandatory 
+- class:superClassName (string) 
+- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
+- class:abstract (boolean) mandatory
+- class:interface (boolean) mandatory
+- class:final (boolean) mandatory
+- class:strictFp (boolean) mandatory
+- class:interfaces (string) multiple
++ class:annotations (class:annotations) = class:annotations
++ class:constructors (class:constructors) = class:constructors
++ class:methods (class:methods) = class:methods
++ class:fields (class:fields) = class:fields
+
+[class:enum] > class:class
+- class:enumValues (string) mandatory multiple

Added: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18nTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18nTest.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18nTest.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,36 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import org.jboss.dna.common.AbstractI18nTest;
+
+/**
+ * @author Randall Hauch
+ */
+public class ClassFileSequencerI18nTest extends AbstractI18nTest {
+
+    public ClassFileSequencerI18nTest() {
+        super(ClassFileSequencerI18n.class);
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerI18nTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,129 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import java.io.InputStream;
+import org.jboss.dna.graph.sequencer.MockSequencerContext;
+import org.jboss.dna.graph.sequencer.MockSequencerOutput;
+import org.jboss.dna.graph.sequencer.SequencerOutput;
+import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
+import org.jboss.dna.sequencer.classfile.metadata.EnumMetadata;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClassFileSequencerTest {
+    private ClassFileSequencer sequencer;
+    private InputStream input;
+    private MockSequencerOutput output;
+    private StreamSequencerContext context;
+
+    @Before
+    public void beforeEach() throws Exception {
+        sequencer = new ClassFileSequencer();
+        context = new MockSequencerContext();
+        context.getNamespaceRegistry().register("class", "http://www.jboss.org/dna/sequencer/classfile/1.0");
+        context.getNamespaceRegistry().register("nt", "http://www.jcp.org/jcr/nt/1.0");
+        output = new MockSequencerOutput(context);
+        input = this.getClass().getResourceAsStream("/NodeEntity.clazz");
+    }
+
+    @After
+    public void afterEach() throws Exception {
+        if (input != null) {
+            try {
+                input.close();
+            } finally {
+                input = null;
+            }
+        }
+    }
+
+    @Test
+    public void shouldAllowSettingClassFileRecorder() throws Exception {
+        MockClassFileRecorder recorder = new MockClassFileRecorder();
+        MockClassFileRecorder.called = false;
+
+        sequencer.setClassFileRecorder(recorder);
+        sequencer.sequence(input, output, context);
+
+        assertThat(MockClassFileRecorder.called, is(true));
+    }
+
+    @Test
+    public void shouldAllowSettingClassFileRecorderByName() throws Exception {
+        MockClassFileRecorder.called = false;
+
+        sequencer.setClassFileRecorderClassName(MockClassFileRecorder.class.getName());
+        sequencer.sequence(input, output, context);
+
+        assertThat(MockClassFileRecorder.called, is(true));
+    }
+
+    @Test
+    public void shouldAllowSettingClassFileRecorderToDefaultByName() throws Exception {
+        MockClassFileRecorder.called = false;
+
+        sequencer.setClassFileRecorderClassName(MockClassFileRecorder.class.getName());
+        sequencer.setClassFileRecorderClassName(null);
+        sequencer.sequence(input, output, context);
+
+        assertThat(MockClassFileRecorder.called, is(false));
+    }
+
+    @Test
+    public void shouldAllowSettingClassFileRecorderToDefault() throws Exception {
+        MockClassFileRecorder.called = false;
+
+        sequencer.setClassFileRecorder(new MockClassFileRecorder());
+        sequencer.setClassFileRecorder(null);
+        sequencer.sequence(input, output, context);
+
+        assertThat(MockClassFileRecorder.called, is(false));
+    }
+
+    @Test( expected = ClassCastException.class )
+    public void shouldNotAllowSettingClassFileRecorderToInvalidClass() throws Exception {
+        sequencer.setClassFileRecorderClassName(Object.class.getName());
+    }
+
+
+    public static class MockClassFileRecorder implements ClassFileRecorder {
+        static boolean called = false;
+
+        public void recordClass( StreamSequencerContext context,
+                                 SequencerOutput output,
+                                 ClassMetadata classMetadata ) {
+            called = true;
+        }
+
+        public void recordEnum( StreamSequencerContext context,
+                                SequencerOutput output,
+                                EnumMetadata enumMetadata ) {
+        }
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/MockEnum.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/MockEnum.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/MockEnum.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,31 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile;
+
+public enum MockEnum {
+
+    VALUE_A,
+    VALUE_B,
+    VALUE_C;
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/MockEnum.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java	                        (rev 0)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java	2010-01-01 17:46:39 UTC (rev 1512)
@@ -0,0 +1,355 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.sequencer.classfile.metadata;
+
+import static org.hamcrest.core.AnyOf.anyOf;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.jboss.dna.common.util.HashCode;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.sequencer.classfile.ClassFileSequencer;
+import org.jboss.dna.sequencer.classfile.MockEnum;
+import org.junit.After;
+import org.junit.Test;
+
+public class ClassFileMetadataReaderTest {
+
+    private InputStream input;
+
+    @After
+    public void afterEach() throws Exception {
+        if (input != null) {
+            try {
+                input.close();
+            } finally {
+                input = null;
+            }
+        }
+    }
+
+    @Test
+    public void shouldReadJavaLangObject() throws Exception {
+        compareMetadataToClass(Object.class);
+    }
+
+    @Test
+    public void shouldReadJavaLangString() throws Exception {
+        compareMetadataToClass(String.class);
+    }
+
+    @Test
+    public void shouldReadOrgJbossDnaGraph() throws Exception {
+        compareMetadataToClass(Graph.class);
+    }
+
+    @Test
+    public void shouldReadOrgJbossDnaSequencerClassfileClassFileSequencer() throws Exception {
+        compareMetadataToClass(ClassFileSequencer.class);
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @Test
+    public void shouldReadEnum() throws Exception {
+        String resourceName = "/" + MockEnum.class.getName().replace('.', '/') + ".class";
+        input = getClass().getResourceAsStream(resourceName);
+
+        ClassMetadata cmd = ClassFileMetadataReader.instance(input);
+
+        assertThat(cmd, instanceOf(EnumMetadata.class));
+        EnumMetadata emd = (EnumMetadata) cmd;
+        
+        List<String> enumValues = Arrays.asList(new String[] {"VALUE_A", "VALUE_B", "VALUE_C"});
+        assertThat(emd.getValues(), is(enumValues));
+        
+        for (FieldMetadata fmd : emd.getFields()) {
+            assertThat(fmd.getName(), not(anyOf(is("VALUE_A"), is("VALUE_B"), is("VALUE_C"))));
+        }
+
+    }
+
+    @SuppressWarnings( "unchecked" )
+    private void compareMetadataToClass( Class<?> clazz ) throws Exception {
+        String resourceName = "/" + clazz.getName().replace('.', '/') + ".class";
+        input = getClass().getResourceAsStream(resourceName);
+
+        ClassMetadata cmd = ClassFileMetadataReader.instance(input);
+
+        assertThat(cmd.getClassName(), is(clazz.getName()));
+
+        if (clazz.getSuperclass() == null) {
+            assertThat(cmd.getSuperclassName(), is(nullValue()));
+        } else {
+            assertThat(cmd.getSuperclassName(), is(clazz.getSuperclass().getName()));
+        }
+
+        String[] clazzInterfaces = new String[clazz.getInterfaces().length];
+        for (int i = 0; i < clazz.getInterfaces().length; i++) {
+            clazzInterfaces[i] = clazz.getInterfaces()[i].getName();
+        }
+
+        assertThat(cmd.getInterfaces(), is(clazzInterfaces));
+        assertThat(cmd.isEnumeration(), is(clazz.isEnum()));
+        assertThat(cmd.getVisibility(), is(visibilityFor(clazz.getModifiers())));
+        assertThat(cmd.isInterface(), is(Modifier.isInterface(clazz.getModifiers())));
+        assertThat(cmd.isAbstract(), is(Modifier.isAbstract(clazz.getModifiers())));
+
+        assertThat(cmd.getAnnotations().size(), is(clazz.getDeclaredAnnotations().length));
+        for (AnnotationMetadata amd : cmd.getAnnotations()) {
+            Class<Annotation> annotationClass = (Class<Annotation>)Class.forName(amd.getAnnotationClassName());
+            Annotation annotation = clazz.getAnnotation(annotationClass);
+            assertThat(annotation, is(notNullValue()));
+        }
+
+        checkFields(cmd, clazz);
+        checkMethods(cmd, clazz);
+        checkConstructors(cmd, clazz);
+    }
+
+    @SuppressWarnings( "unchecked" )
+    private void checkFields( ClassMetadata cmd,
+                              Class<?> clazz ) throws Exception {
+        Map<FieldKey, Field> clazzFields = new HashMap<FieldKey, Field>();
+        Map<FieldKey, FieldMetadata> metaFields = new HashMap<FieldKey, FieldMetadata>();
+
+        for (Field field : clazz.getDeclaredFields()) {
+            clazzFields.put(new FieldKey(field), field);
+        }
+
+        for (FieldMetadata field : cmd.getFields()) {
+            metaFields.put(new FieldKey(field), field);
+        }
+
+        assertThat(metaFields.size(), is(clazzFields.size()));
+        assertThat(metaFields.keySet(), is(clazzFields.keySet()));
+
+        for (Map.Entry<FieldKey, FieldMetadata> entry : metaFields.entrySet()) {
+            Field clazzField = clazzFields.get(entry.getKey());
+            FieldMetadata metaField = entry.getValue();
+            assert clazzField != null;
+
+            // getCanonicalName converts the $ to .
+            String metaName = metaField.getTypeName().replace('$', '.');
+            String clazzName = clazzField.getType().getCanonicalName();
+            assertThat(metaName, is(clazzName));
+
+            assertThat(metaField.getVisibility(), is(visibilityFor(clazzField.getModifiers())));
+            assertThat(metaField.isFinal(), is(Modifier.isFinal(clazzField.getModifiers())));
+            assertThat(metaField.isStatic(), is(Modifier.isStatic(clazzField.getModifiers())));
+
+            assertThat(metaField.getAnnotations().size(), is(clazzField.getDeclaredAnnotations().length));
+            for (AnnotationMetadata amd : metaField.getAnnotations()) {
+                Class<Annotation> annotationClass = (Class<Annotation>)Class.forName(amd.getAnnotationClassName());
+                Annotation annotation = clazz.getAnnotation(annotationClass);
+                assertThat(annotation, is(notNullValue()));
+            }
+        }
+    }
+
+    private void checkMethods( ClassMetadata cmd,
+                               Class<?> clazz ) throws Exception {
+        Map<MethodKey, Method> clazzMethods = new HashMap<MethodKey, Method>();
+        Map<MethodKey, MethodMetadata> metaMethods = new HashMap<MethodKey, MethodMetadata>();
+
+        for (Method field : clazz.getDeclaredMethods()) {
+            clazzMethods.put(new MethodKey(field), field);
+        }
+
+        for (MethodMetadata field : cmd.getMethods()) {
+            metaMethods.put(new MethodKey(field), field);
+        }
+
+        assertThat(metaMethods.size(), is(clazzMethods.size()));
+        assertThat(metaMethods.keySet(), is(clazzMethods.keySet()));
+
+        for (Map.Entry<MethodKey, MethodMetadata> entry : metaMethods.entrySet()) {
+
+            /*
+             * We already know that the parameter types and name are equal, otherwise this would fail
+             */
+
+            Method clazzMethod = clazzMethods.get(entry.getKey());
+            MethodMetadata metaMethod = entry.getValue();
+            assert clazzMethod != null;
+
+            // getCanonicalName converts the $ to .
+            String metaName = metaMethod.getReturnType().replace('$', '.');
+            String clazzName = clazzMethod.getReturnType().getCanonicalName();
+            assertThat(metaName, is(clazzName));
+
+            assertThat(metaMethod.getVisibility(), is(visibilityFor(clazzMethod.getModifiers())));
+            assertThat(metaMethod.isFinal(), is(Modifier.isFinal(clazzMethod.getModifiers())));
+            assertThat(metaMethod.isStatic(), is(Modifier.isStatic(clazzMethod.getModifiers())));
+
+            assertThat(metaMethod.getAnnotations().size(), is(clazzMethod.getDeclaredAnnotations().length));
+
+
+            // Can't really check this since some annotations are not runtime annotations
+            // for (AnnotationMetadata amd : metaMethod.getAnnotations()) {
+            // Class<Annotation> annotationClass = (Class<Annotation>)Class.forName(amd.getAnnotationClassName());
+            // Annotation annotation = clazz.getAnnotation(annotationClass);
+            //                
+            // assertThat(annotation, is(notNullValue()));
+            // }
+        }
+    }
+
+    @SuppressWarnings( "unchecked" )
+    private void checkConstructors( ClassMetadata cmd,
+                                    Class<?> clazz ) throws Exception {
+        Map<MethodKey, Constructor> clazzCtors = new HashMap<MethodKey, Constructor>();
+        Map<MethodKey, MethodMetadata> metaCtors = new HashMap<MethodKey, MethodMetadata>();
+
+        for (Constructor field : clazz.getDeclaredConstructors()) {
+            clazzCtors.put(new MethodKey(field), field);
+        }
+
+        for (MethodMetadata field : cmd.getConstructors()) {
+            metaCtors.put(new MethodKey(field), field);
+        }
+
+        assertThat(metaCtors.size(), is(clazzCtors.size()));
+        assertThat(metaCtors.keySet(), is(clazzCtors.keySet()));
+
+        for (Map.Entry<MethodKey, MethodMetadata> entry : metaCtors.entrySet()) {
+
+            /*
+             * We already know that the parameter types and name are equal, otherwise this would fail
+             */
+
+            Constructor clazzCtor = clazzCtors.get(entry.getKey());
+            MethodMetadata metaCtor = entry.getValue();
+            assert clazzCtor != null;
+
+            assertThat(metaCtor.getVisibility(), is(visibilityFor(clazzCtor.getModifiers())));
+            assertThat(metaCtor.isFinal(), is(Modifier.isFinal(clazzCtor.getModifiers())));
+            assertThat(metaCtor.isStatic(), is(Modifier.isStatic(clazzCtor.getModifiers())));
+
+            assertThat(metaCtor.getAnnotations().size(), is(clazzCtor.getDeclaredAnnotations().length));
+
+            // Can't really check this since some annotations are not runtime annotations
+            // for (AnnotationMetadata amd : metaMethod.getAnnotations()) {
+            // Class<Annotation> annotationClass = (Class<Annotation>)Class.forName(amd.getAnnotationClassName());
+            // Annotation annotation = clazz.getAnnotation(annotationClass);
+            //                
+            // assertThat(annotation, is(notNullValue()));
+            // }
+        }
+    }
+
+    private Visibility visibilityFor( int modifier ) {
+        if (Modifier.isPublic(modifier)) return Visibility.PUBLIC;
+        if (Modifier.isProtected(modifier)) return Visibility.PROTECTED;
+        if (Modifier.isPrivate(modifier)) return Visibility.PRIVATE;
+        return Visibility.PACKAGE;
+    }
+
+    private class FieldKey {
+        private final String name;
+
+        private FieldKey( Field field ) {
+            this.name = field.getName();
+        }
+
+        private FieldKey( FieldMetadata field ) {
+            this.name = field.getName();
+        }
+
+        @Override
+        public boolean equals( Object obj ) {
+            if (!(obj instanceof FieldKey)) return false;
+            return name.equals(((FieldKey)obj).name);
+        }
+
+        @Override
+        public int hashCode() {
+            return name.hashCode();
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+
+    private class MethodKey {
+        private final String name;
+        private final List<String> parameters;
+
+        private MethodKey( Method method ) {
+            this.name = method.getName();
+            this.parameters = new ArrayList<String>();
+            for (Class<?> parameter : method.getParameterTypes()) {
+                parameters.add(parameter.getCanonicalName());
+            }
+        }
+
+        @SuppressWarnings( "unchecked" )
+        private MethodKey( Constructor ctor ) {
+            this.name = ctor.getName();
+            this.parameters = new ArrayList<String>();
+            for (Class<?> parameter : ctor.getParameterTypes()) {
+                parameters.add(parameter.getCanonicalName());
+            }
+        }
+
+        private MethodKey( MethodMetadata method ) {
+            this.name = method.getName();
+            this.parameters = method.getParameters();
+        }
+
+        @Override
+        public boolean equals( Object obj ) {
+            if (!(obj instanceof MethodKey)) return false;
+
+            MethodKey other = (MethodKey)obj;
+            return name.equals(other.name) && parameters.equals(other.parameters);
+        }
+
+        @Override
+        public int hashCode() {
+            return HashCode.compute(name, parameters);
+        }
+
+        @Override
+        public String toString() {
+            return name + "(" + parameters + ")";
+        }
+
+    }
+}


Property changes on: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-sequencer-classfile/src/test/resources/NodeEntity.clazz
===================================================================
(Binary files differ)


Property changes on: trunk/extensions/dna-sequencer-classfile/src/test/resources/NodeEntity.clazz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-01 17:19:43 UTC (rev 1511)
+++ trunk/pom.xml	2010-01-01 17:46:39 UTC (rev 1512)
@@ -130,6 +130,7 @@
 		<!--module>extensions/dna-sequencer-esbMessage</module-->
 		<module>extensions/dna-sequencer-cnd</module>
 		<module>extensions/dna-sequencer-java</module>
+		<module>extensions/dna-sequencer-classfile</module>
 		<module>extensions/dna-sequencer-msoffice</module>
 		<module>extensions/dna-sequencer-text</module>
 		<module>extensions/dna-sequencer-xml</module>


Property changes on: trunk/utils/dna-jpa-ddl-gen
___________________________________________________________________
Name: svn:ignore
   + target



From dna-commits at lists.jboss.org  Fri Jan  1 13:02:31 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 1 Jan 2010 13:02:31 -0500
Subject: [dna-commits] DNA SVN: r1513 - in
	trunk/extensions/dna-sequencer-classfile:
	src/main/java/org/jboss/dna/sequencer/classfile and 1 other
	directories.
Message-ID: <201001011802.o01I2VjR027970@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-01 13:02:31 -0500 (Fri, 01 Jan 2010)
New Revision: 1513

Modified:
   trunk/extensions/dna-sequencer-classfile/
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java
Log:
DNA-62 Sequence Java class files to extract the class structure with annotations

Fixed 3 spurious @Overrides and added target folder to svn:ignore


Property changes on: trunk/extensions/dna-sequencer-classfile
___________________________________________________________________
Name: svn:ignore
   + target


Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	2010-01-01 17:46:39 UTC (rev 1512)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	2010-01-01 18:02:31 UTC (rev 1513)
@@ -38,7 +38,6 @@
 
     private ClassFileRecorder classFileRecorder = DEFAULT_CLASS_FILE_RECORDER;
 
-    @Override
     public void sequence( InputStream stream,
                           SequencerOutput output,
                           StreamSequencerContext context ) {

Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	2010-01-01 17:46:39 UTC (rev 1512)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	2010-01-01 18:02:31 UTC (rev 1513)
@@ -40,7 +40,6 @@
 
 public class DefaultClassFileRecorder implements ClassFileRecorder {
 
-    @Override
     public void recordClass( StreamSequencerContext context,
                              SequencerOutput output,
                              ClassMetadata classMetadata ) {

Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java	2010-01-01 17:46:39 UTC (rev 1512)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/metadata/FieldMetadata.java	2010-01-01 18:02:31 UTC (rev 1513)
@@ -91,7 +91,6 @@
         return annotations;
     }
 
-    @Override
     public int compareTo( FieldMetadata o ) {
         if (this.isStatic() && !o.isStatic()) {
             return 1;


From dna-commits at lists.jboss.org  Fri Jan  1 13:26:33 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 1 Jan 2010 13:26:33 -0500
Subject: [dna-commits] DNA SVN: r1514 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path.
Message-ID: <201001011826.o01IQXr7030343@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-01 13:26:33 -0500 (Fri, 01 Jan 2010)
New Revision: 1514

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryTransaction.java
Log:
Fixed Javadoc error

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryTransaction.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryTransaction.java	2010-01-01 18:02:31 UTC (rev 1513)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryTransaction.java	2010-01-01 18:26:33 UTC (rev 1514)
@@ -26,7 +26,7 @@
 import org.jboss.dna.graph.connector.map.MapRepositoryTransaction;
 
 /**
- * A transaction returned by the {@link PathRepository#startTransaction(boolean)}.
+ * A transaction for a {@link PathRepository}.
  * 
  * @see MapRepositoryTransaction
  */
@@ -37,7 +37,6 @@
      * committing the changes, but the transaction is still expected to be closed.
      * 
      * @see #rollback()
-     * @see PathRepository#startTransaction(boolean)
      */
     void commit();
 
@@ -46,7 +45,6 @@
      * rolling back the changes, but the transaction is still expected to be closed.
      * 
      * @see #commit()
-     * @see PathRepository#startTransaction(boolean)
      */
     void rollback();
 


From dna-commits at lists.jboss.org  Sat Jan  2 11:19:39 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 2 Jan 2010 11:19:39 -0500
Subject: [dna-commits] DNA SVN: r1515 - trunk/docs/examples/gettingstarted.
Message-ID: <201001021619.o02GJd0N004572@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-02 11:19:39 -0500 (Sat, 02 Jan 2010)
New Revision: 1515

Modified:
   trunk/docs/examples/gettingstarted/pom.xml
Log:
Removed repository example temporarily to keep it from hanging the build server

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2010-01-01 18:26:33 UTC (rev 1514)
+++ trunk/docs/examples/gettingstarted/pom.xml	2010-01-02 16:19:39 UTC (rev 1515)
@@ -10,7 +10,7 @@
 
   <modules>
     <module>sequencers</module>
-    <module>repositories</module>
+    <!-- module>repositories</module -->
   </modules>
 
   <dependencyManagement>


From dna-commits at lists.jboss.org  Sat Jan  2 11:30:15 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 2 Jan 2010 11:30:15 -0500
Subject: [dna-commits] DNA SVN: r1516 -
	trunk/docs/examples/gettingstarted/sequencers.
Message-ID: <201001021630.o02GUFfL006197@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-02 11:30:15 -0500 (Sat, 02 Jan 2010)
New Revision: 1516

Modified:
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
Log:
Corrected dependency scope on classfile sequencer to fix a CI break

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-02 16:19:39 UTC (rev 1515)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-02 16:30:15 UTC (rev 1516)
@@ -32,7 +32,6 @@
       <groupId>org.jboss.dna</groupId>
       <artifactId>dna-sequencer-classfile</artifactId>
       <version>${project.version}</version>
-      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>


From dna-commits at lists.jboss.org  Sat Jan  2 11:45:32 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 2 Jan 2010 11:45:32 -0500
Subject: [dna-commits] DNA SVN: r1517 -
	trunk/docs/examples/gettingstarted/sequencers/src/main/resources.
Message-ID: <201001021645.o02GjWtx007705@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-02 11:45:32 -0500 (Sat, 02 Jan 2010)
New Revision: 1517

Added:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/JcrRepository.clazz
Log:
Added missing file for sequencer example

Added: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/JcrRepository.clazz
===================================================================
(Binary files differ)


Property changes on: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/JcrRepository.clazz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream


From dna-commits at lists.jboss.org  Mon Jan  4 10:26:51 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 10:26:51 -0500
Subject: [dna-commits] DNA SVN: r1518 - in
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/request:
	processor and 1 other directory.
Message-ID: <201001041526.o04FQpJG012006@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-04 10:26:50 -0500 (Mon, 04 Jan 2010)
New Revision: 1518

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
Log:
DNA-549 Creating A New Property And Changing An Existing Property Should Have Different ChangeRequest Types

Applied patch that adds a boolean method (isNewProperty()) that indicates whether a property was created as a result of processing this request. It's a parallel to the same method in SetPropertyRequest.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java	2010-01-02 16:45:32 UTC (rev 1517)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java	2010-01-04 15:26:50 UTC (rev 1518)
@@ -39,6 +39,7 @@
     private Location actualLocation;
     private List<Object> actualAddedValues;
     private List<Object> actualRemovedValues;
+    private boolean actualCreation;
 
     public UpdateValuesRequest( String workspaceName,
                                 Location on,
@@ -148,6 +149,18 @@
     }
 
     /**
+     * Record that the property did not exist prior to the processing of this request and was actually created by this request.
+     * This method must be called when processing the request, and the actual location must have a {@link Location#getPath() path}
+     * .
+     * 
+     * @param created true if the property was created by this request, or false if this request updated an existing property
+     * @throws IllegalStateException if the request is frozen
+     */
+    public void setNewProperty( boolean created ) {
+        this.actualCreation = created;
+    }
+
+    /**
      * Get the actual location of the node that was updated.
      * 
      * @return the actual location, or null if the actual location was not set
@@ -176,6 +189,15 @@
     }
 
     /**
+     * Get whether the {@link #property() property} was created.
+     * 
+     * @return true if this request created the property, or false if this request changed an existing property
+     */
+    public boolean isNewProperty() {
+        return actualCreation;
+    }
+
+    /**
      * {@inheritDoc}
      * <p>
      * This method does not clone the results.
@@ -188,6 +210,7 @@
         UpdateValuesRequest request = new UpdateValuesRequest(workspaceName, actualLocation != null ? actualLocation : on,
                                                               propertyName, addedValues, removedValues);
         request.setActualLocation(actualLocation, actualAddedValues, actualRemovedValues);
+        request.setNewProperty(actualCreation);
         return request;
     }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2010-01-02 16:45:32 UTC (rev 1517)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2010-01-04 15:26:50 UTC (rev 1518)
@@ -822,6 +822,7 @@
         // Update the current values
         SetPropertyRequest setProperty = new SetPropertyRequest(on, workspaceName, newProperty);
         process(setProperty);
+        request.setNewProperty(setProperty.isNewProperty());
 
         if (setProperty.hasError()) {
             request.setError(setProperty.getError());


From dna-commits at lists.jboss.org  Mon Jan  4 10:29:25 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 10:29:25 -0500
Subject: [dna-commits] DNA SVN: r1519 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation.
Message-ID: <201001041529.o04FTPlG012217@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-04 10:29:24 -0500 (Mon, 04 Jan 2010)
New Revision: 1519

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
Log:
DNA-572 FederatedRepositoryConnection Can Freeze When Exception Thrown from RepositoryConnection.execute(...)

Applied patch that corrects one possible source of freezes in the federated connector by ensuring that a FederatedRequest is still submitted if the projection fails.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2010-01-04 15:26:50 UTC (rev 1518)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2010-01-04 15:29:24 UTC (rev 1519)
@@ -311,7 +311,6 @@
     public void process( VerifyNodeExistsRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -343,7 +342,6 @@
     public void process( ReadNodeRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -414,7 +412,6 @@
     public void process( ReadAllChildrenRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.of(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -504,7 +501,6 @@
     public void process( ReadAllPropertiesRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -538,7 +534,6 @@
     public void process( ReadPropertyRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.on(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -578,15 +573,18 @@
     public void process( ReadBranchRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, false);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
-        FederatedWorkspace workspace = getWorkspace(request, request.inWorkspace());
 
-        // And process the branch, creating ReadNodeRequests for each placeholder, and ReadBranchRequests for each proxy node...
-        if (request.maximumDepth() > 0) {
-            processBranch(federatedRequest, projectedNode, workspace, request.maximumDepth());
+        if (projectedNode != null) {
+            FederatedWorkspace workspace = getWorkspace(request, request.inWorkspace());
+
+            // And process the branch, creating ReadNodeRequests for each placeholder, and ReadBranchRequests for each proxy
+            // node...
+            if (request.maximumDepth() > 0) {
+                processBranch(federatedRequest, projectedNode, workspace, request.maximumDepth());
+            }
         }
 
         // Submit the requests for processing ...
@@ -645,10 +643,13 @@
     public void process( CreateNodeRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.under(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
 
         // Any non-read request should be submitted to the first ProxyNode ...
         PlaceholderNode placeholder = null;
@@ -724,11 +725,15 @@
     public void process( RemovePropertyRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.from(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -759,11 +764,15 @@
     public void process( UpdatePropertiesRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.on(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -794,11 +803,15 @@
     public void process( UpdateValuesRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.on(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -830,11 +843,15 @@
     public void process( SetPropertyRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.on(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -865,11 +882,15 @@
     public void process( DeleteChildrenRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // A delete should be executed against any ProxyNode that applies ...
         FederatedWorkspace workspace = getWorkspace(request, request.inWorkspace());
         boolean submit = deleteBranch(federatedRequest, projectedNode, workspace, getExecutionContext(), false);
@@ -892,11 +913,15 @@
     public void process( DeleteBranchRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // A delete should be executed against any ProxyNode that applies ...
         FederatedWorkspace workspace = getWorkspace(request, request.inWorkspace());
         boolean submit = deleteBranch(federatedRequest, projectedNode, workspace, getExecutionContext(), true);
@@ -965,9 +990,15 @@
     public void process( CopyBranchRequest request ) {
         // Figure out where the 'from' is projected ...
         ProjectedNode projectedFromNode = project(request.from(), request.fromWorkspace(), request, false);
-        if (projectedFromNode == null) return;
+        if (projectedFromNode == null) {
+            submit(new FederatedRequest(request));
+            return;
+        }
         ProjectedNode projectedIntoNode = project(request.into(), request.intoWorkspace(), request, true);
-        if (projectedIntoNode == null) return;
+        if (projectedIntoNode == null) {
+            submit(new FederatedRequest(request));
+            return;
+        }
 
         // Limitation: only able to project the copy if the 'from' and 'into' are in the same source & projection ...
         while (projectedFromNode != null) {
@@ -1023,9 +1054,15 @@
     public void process( CloneBranchRequest request ) {
         // Figure out where the 'from' is projected ...
         ProjectedNode projectedFromNode = project(request.from(), request.fromWorkspace(), request, false);
-        if (projectedFromNode == null) return;
+        if (projectedFromNode == null) {
+            submit(new FederatedRequest(request));
+            return;
+        }
         ProjectedNode projectedIntoNode = project(request.into(), request.intoWorkspace(), request, true);
-        if (projectedIntoNode == null) return;
+        if (projectedIntoNode == null) {
+            submit(new FederatedRequest(request));
+            return;
+        }
 
         // Limitation: only able to project the copy if the 'from' and 'into' are in the same source & projection ...
         while (projectedFromNode != null) {
@@ -1082,7 +1119,10 @@
     public void process( MoveBranchRequest request ) {
         // Figure out where the 'from' is projected ...
         ProjectedNode projectedFromNode = project(request.from(), request.inWorkspace(), request, true);
-        if (projectedFromNode == null) return;
+        if (projectedFromNode == null) {
+            submit(new FederatedRequest(request));
+            return;
+        }
 
         ProjectedNode projectedBeforeNode = request.before() != null ? project(request.before(),
                                                                                request.inWorkspace(),
@@ -1164,11 +1204,15 @@
     public void process( RenameNodeRequest request ) {
         // Figure out where the 'at' is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -1199,11 +1243,15 @@
     public void process( LockBranchRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -1234,11 +1282,15 @@
     public void process( UnlockBranchRequest request ) {
         // Figure out where this request is projected ...
         ProjectedNode projectedNode = project(request.at(), request.inWorkspace(), request, true);
-        if (projectedNode == null) return;
 
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
+        if (projectedNode == null) {
+            submit(federatedRequest);
+            return;
+        }
+
         // Any non-read request should be submitted to the first ProxyNode ...
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
@@ -1273,7 +1325,6 @@
             // Get the root location ...
             Location root = Location.create(getExecutionContext().getValueFactories().getPathFactory().createRootPath());
             ProjectedNode projectedNode = project(root, workspace.getName(), request, false);
-            if (projectedNode == null) return;
 
             // Create the federated request ...
             FederatedRequest federatedRequest = new FederatedRequest(request);
@@ -1378,5 +1429,4 @@
             channel.cancel(mayInterruptIfRunning);
         }
     }
-
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-04 15:26:50 UTC (rev 1518)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-04 15:29:24 UTC (rev 1519)
@@ -204,7 +204,7 @@
     @Override
     public void process( VerifyNodeExistsRequest request ) {
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.at();
         int numMerged = 0;
@@ -258,7 +258,7 @@
         Map<Name, Property> properties = request.getPropertiesByName();
         Map<Name, Integer> childSnsIndexes = new HashMap<Name, Integer>();
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.at();
         int numMerged = 0;
@@ -409,7 +409,7 @@
         Path federatedPath = request.of().getPath();
         Map<Name, Integer> childSnsIndexes = new HashMap<Name, Integer>();
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.of();
         int numMerged = 0;
@@ -506,7 +506,7 @@
     public void process( ReadAllPropertiesRequest request ) {
         Map<Name, Property> properties = request.getPropertiesByName();
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.at();
         int numMerged = 0;
@@ -568,7 +568,7 @@
     @Override
     public void process( ReadPropertyRequest request ) {
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.on();
         int numMerged = 0;
@@ -631,7 +631,7 @@
     @Override
     public void process( ReadBranchRequest request ) {
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.at();
         int numMerged = 0;
@@ -838,8 +838,8 @@
     @Override
     public void process( CreateNodeRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        Request projectedRequest = projected.getRequest();
+
+        Request projectedRequest = projected == null ? null : projected.getRequest();
         // Check the error first ...
         if (checkErrorOrCancel(request, projectedRequest)) return;
 
@@ -866,8 +866,8 @@
     @Override
     public void process( UpdatePropertiesRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        UpdatePropertiesRequest source = (UpdatePropertiesRequest)projected.getRequest();
+
+        UpdatePropertiesRequest source = projected == null ? null : (UpdatePropertiesRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location sourceLocation = source.getActualLocationOfNode();
         request.setActualLocationOfNode(projectToFederated(request.on(), projected.getProjection(), sourceLocation, request));
@@ -882,8 +882,8 @@
     @Override
     public void process( SetPropertyRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        SetPropertyRequest source = (SetPropertyRequest)projected.getRequest();
+
+        SetPropertyRequest source = projected == null ? null : (SetPropertyRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         // Set the actual location and created flags ...
         Location sourceLocation = source.getActualLocationOfNode();
@@ -899,8 +899,8 @@
     @Override
     public void process( RemovePropertyRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        SetPropertyRequest source = (SetPropertyRequest)projected.getRequest();
+
+        SetPropertyRequest source = projected == null ? null : (SetPropertyRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location sourceLocation = source.getActualLocationOfNode();
         request.setActualLocationOfNode(projectToFederated(request.from(), projected.getProjection(), sourceLocation, request));
@@ -914,6 +914,11 @@
     @Override
     public void process( DeleteBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+
+        // Do an initial check to make sure that there was no error on the source that prevented projection
+        Request projectedSource = projected == null ? null : projected.getRequest();
+        if (checkErrorOrCancel(request, projectedSource)) return;
+
         // Go through the projected requests, and look for the top-most node ...
         Location highest = null;
         while (projected != null) {
@@ -949,6 +954,11 @@
     @Override
     public void process( DeleteChildrenRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+
+        // Do an initial check to make sure that there was no error on the source that prevented projection
+        Request projectedSource = projected == null ? null : projected.getRequest();
+        if (checkErrorOrCancel(request, projectedSource)) return;
+
         // Go through the projected requests, and look for the top-most node ...
         Location highest = null;
         while (projected != null) {
@@ -976,8 +986,8 @@
     @Override
     public void process( RenameNodeRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        RenameNodeRequest source = (RenameNodeRequest)projected.getRequest();
+
+        RenameNodeRequest source = projected == null ? null : (RenameNodeRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -994,8 +1004,8 @@
     @Override
     public void process( CopyBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        CopyBranchRequest source = (CopyBranchRequest)projected.getRequest();
+
+        CopyBranchRequest source = projected == null ? null : (CopyBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1012,8 +1022,8 @@
     @Override
     public void process( CloneBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        CloneBranchRequest source = (CloneBranchRequest)projected.getRequest();
+
+        CloneBranchRequest source = projected == null ? null : (CloneBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1037,8 +1047,8 @@
     @Override
     public void process( MoveBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
-        assert !projected.hasNext();
-        MoveBranchRequest source = (MoveBranchRequest)projected.getRequest();
+
+        MoveBranchRequest source = projected == null ? null : (MoveBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1057,7 +1067,7 @@
     @Override
     public void process( VerifyWorkspaceRequest request ) {
         ProjectedRequest projectedRequest = federatedRequest.getFirstProjectedRequest();
-        assert projectedRequest != null;
+
         Location actualLocation = Location.create(getExecutionContext().getValueFactories().getPathFactory().createRootPath());
         while (projectedRequest != null) {
             VerifyNodeExistsRequest readFromSource = (VerifyNodeExistsRequest)projectedRequest.getRequest();


From dna-commits at lists.jboss.org  Mon Jan  4 10:33:20 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 10:33:20 -0500
Subject: [dna-commits] DNA SVN: r1520 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache
	and 6 other directories.
Message-ID: <201001041533.o04FXKTl013148@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-04 10:33:19 -0500 (Mon, 04 Jan 2010)
New Revision: 1520

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/CacheStatistics.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathCachePolicy.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractWritablePathWorkspace.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositorySource.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathWorkspace.java
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java
   trunk/extensions/dna-connector-filesystem/src/test/java/org/jboss/dna/connector/filesystem/FileSystemConnectorWritableTest.java
   trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepository.java
   trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataSource.java
   trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepositoryTest.java
   trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/TestEnvironment.java
Log:
DNA-615 PathRepository Should Provide Support for Caching

Applied patch that provides a default caching implementation for path-based repositories. The patch has the following salient features:

1. It adds a new base class (AbstractPathRepositorySource) for path repository sources that encapuslates some of the common required properties that have been cut-and-pasted a few times and manages the path repository cache for the source.
2. It adds PathRepositoryCache (a map of workspace names to WorkspaceCaches) and WorkspaceCache (a per-workspace Path to PathNode map).
3. It adds a beefed-up version of CachePolicy (called PathCachePolicy) that is used by the PathRepositoryCache to determine which implementation of WorkspaceCache to use. It is also used by the WorkspaceCache implementation to determine if a particular node should be cached, allowing for custom exclusion policies based on node size, node volatility, etc.
4. It integrates these changes with the FileSystemSource and JDBC Metadata source to demonstrate their efficacy.

It's fairly vanilla stuff, but it's built to be rather customizable. Also, changing the cache policy on the source at run-time is supported, so you're not limited to configuring the cache for a repo at startup. 

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,237 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import javax.naming.BinaryRefAddr;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.naming.StringRefAddr;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.cache.DefaultPathCachePolicy;
+import org.jboss.dna.graph.connector.path.cache.PathCachePolicy;
+import org.jboss.dna.graph.connector.path.cache.PathRepositoryCache;
+
+/**
+ * Basic implementation of the trivial {@link PathRepositorySource} methods and the {@link org.jboss.dna.graph.connector.path path
+ * repository cache life cycle}.
+ */
+public abstract class AbstractPathRepositorySource implements PathRepositorySource {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The default UUID that is used for root nodes in a store.
+     */
+    public static final String DEFAULT_ROOT_NODE_UUID = "cafebabe-cafe-babe-cafe-babecafebabe";
+
+    /**
+     * The default number of times that a request that failed due to system error should be retried
+     */
+    public static final int DEFAULT_RETRY_LIMIT = 0;
+
+    private static final int DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS = 30;
+
+    /**
+     * The default cache policy for this repository source (cache all nodes which remain valid for 30 seconds)
+     */
+    public static final PathCachePolicy DEFAULT_CACHE_POLICY = new DefaultPathCachePolicy(DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS);
+
+    protected int retryLimit = DEFAULT_RETRY_LIMIT;
+    protected String name;
+
+    protected transient RepositoryContext repositoryContext;
+    protected transient UUID rootNodeUuid = UUID.fromString(DEFAULT_ROOT_NODE_UUID);
+    protected transient PathCachePolicy cachePolicy = DEFAULT_CACHE_POLICY;
+
+    private transient PathRepositoryCache repositoryCache = new PathRepositoryCache(cachePolicy);
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.path.PathRepositorySource#areUpdatesAllowed()
+     */
+    public boolean areUpdatesAllowed() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.path.PathRepositorySource#getRepositoryContext()
+     */
+    public RepositoryContext getRepositoryContext() {
+        return repositoryContext;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#initialize(RepositoryContext)
+     */
+    public void initialize( RepositoryContext context ) throws RepositorySourceException {
+        CheckArg.isNotNull(context, "context");
+        this.repositoryContext = context;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.path.PathRepositorySource#getCachePolicy()
+     */
+    public PathCachePolicy getCachePolicy() {
+        return this.cachePolicy;
+    }
+
+    /**
+     * Sets the cache policy for the repository and replaces the path repository cache with a new path repository cache tied to
+     * the new cache policy
+     * 
+     * @param cachePolicy the new cache policy; may not be null
+     */
+    public void setCachePolicy( PathCachePolicy cachePolicy ) {
+        CheckArg.isNotNull(cachePolicy, "cachePolicy");
+
+        PathRepositoryCache oldCache = repositoryCache;
+        this.cachePolicy = cachePolicy;
+        this.repositoryCache = new PathRepositoryCache(cachePolicy);
+
+        oldCache.close();
+    }
+
+    /**
+     * @return rootNodeUuid
+     */
+    public UUID getRootNodeUuid() {
+        return rootNodeUuid;
+    }
+
+    /**
+     * @param rootNodeUuid Sets rootNodeUuid to the specified value.
+     * @throws IllegalArgumentException if the string value cannot be converted to UUID
+     */
+    public void setRootNodeUuid( String rootNodeUuid ) {
+        if (rootNodeUuid != null && rootNodeUuid.trim().length() == 0) rootNodeUuid = DEFAULT_ROOT_NODE_UUID;
+        this.rootNodeUuid = UUID.fromString(rootNodeUuid);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#close()
+     */
+    public void close() {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getName()
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the name of the repository source. The name should be unique among loaded repository sources.
+     * 
+     * @param name the new name for the repository source; may not be empty
+     */
+    public void setName( String name ) {
+        if (name != null) {
+            name = name.trim();
+            if (name.length() == 0) name = null;
+        }
+
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getRetryLimit()
+     */
+    public int getRetryLimit() {
+        return retryLimit;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#setRetryLimit(int limit)
+     */
+    public void setRetryLimit( int limit ) {
+        this.retryLimit = limit < 0 ? 0 : limit;
+    }
+
+    /**
+     * Extracts the values from the given reference, automatically translating {@link BinaryRefAddr} instances into the
+     * deserialized classes that they represent.
+     * 
+     * @param ref the reference from which the values should be extracted
+     * @return a map of value names to values from the reference
+     * @throws IOException if there is an error deserializing a {@code BinaryRefAddr}
+     * @throws ClassNotFoundException if a serialized class cannot be deserialized because its class is not in the classpath
+     */
+    protected Map<String, Object> valuesFrom( Reference ref ) throws IOException, ClassNotFoundException {
+        Map<String, Object> values = new HashMap<String, Object>();
+
+        Enumeration<?> en = ref.getAll();
+        while (en.hasMoreElements()) {
+            RefAddr subref = (RefAddr)en.nextElement();
+            if (subref instanceof StringRefAddr) {
+                String key = subref.getType();
+                Object value = subref.getContent();
+                if (value != null) values.put(key, value.toString());
+            } else if (subref instanceof BinaryRefAddr) {
+                String key = subref.getType();
+                Object value = subref.getContent();
+                if (value instanceof byte[]) {
+                    // Deserialize ...
+                    ByteArrayInputStream bais = new ByteArrayInputStream((byte[])value);
+                    ObjectInputStream ois = new ObjectInputStream(bais);
+                    value = ois.readObject();
+                    values.put(key, value);
+                }
+            }
+        }
+
+        return values;
+    }
+
+    /**
+     * @return the active path repository cache; never null
+     */
+    public PathRepositoryCache getPathRepositoryCache() {
+        return repositoryCache;
+    }
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractWritablePathWorkspace.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractWritablePathWorkspace.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractWritablePathWorkspace.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.graph.connector.path;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 import org.jboss.dna.graph.ExecutionContext;
@@ -112,6 +113,17 @@
         return newCopy;
     }
 
+    public PathNode removeProperties( ExecutionContext context,
+                                      Path nodePath,
+                                      Iterable<Name> propertyNames ) {
+        Map<Name, Property> properties = new HashMap<Name, Property>();
+        for (Name propertyName : propertyNames) {
+            properties.put(propertyName, null);
+        }
+
+        return setProperties(context, nodePath, properties);
+    }
+
     public QueryResults query( ExecutionContext context,
                                AccessQueryRequest accessQuery ) {
         return null;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/DefaultPathNode.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -8,6 +8,8 @@
 import java.util.Set;
 import java.util.UUID;
 import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.text.NoOpEncoder;
+import org.jboss.dna.common.text.TextEncoder;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
@@ -21,6 +23,8 @@
 @Immutable
 public class DefaultPathNode implements PathNode {
 
+    private final static TextEncoder TO_STRING_ENCODER = new NoOpEncoder();
+
     private final Path path;
     private final Map<Name, Property> properties;
     private final List<Segment> childSegments;
@@ -94,5 +98,12 @@
         return null;
     }
 
+    @Override
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+        buff.append(path.getString(TO_STRING_ENCODER)).append('(').append(properties.keySet()).append(')');
+        return buff.toString();
+    }
 
+    
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepository.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -20,38 +20,21 @@
     protected final ConcurrentMap<String, PathWorkspace> workspaces = new ConcurrentHashMap<String, PathWorkspace>();
 
     /**
-     * Creates a {@code PathRepository} with the given repository source name, root node UUID, and a default workspace named
-     * {@code ""} (the empty string).
+     * Creates a {@code PathRepository} with the given repository source, root node UUID, and a default workspace with the given
+     * name.
      * 
-     * @param sourceName the name of the repository source for use in error and informational messages; may not be null or empty
-     * @param rootNodeUuid the UUID that will be used as the root node UUID for each workspace in the repository; may not be null
-     *        or empty
+     * @param source the path repository source; may not be null
      */
-    protected PathRepository( String sourceName,
-                              UUID rootNodeUuid ) {
-        this(sourceName, rootNodeUuid, null);
+    protected PathRepository( PathRepositorySource source ) {
+        CheckArg.isNotNull(source, "source");
+        CheckArg.isNotEmpty(source.getName(), "source.name");
+        CheckArg.isNotNull(source.getRootNodeUuid(), "source.rootNodeUUID");
+        this.rootNodeUuid = source.getRootNodeUuid();
+        this.sourceName = source.getName();
+        this.defaultWorkspaceName = source.getDefaultWorkspaceName() != null ? source.getDefaultWorkspaceName() : "";
     }
 
     /**
-     * Creates a {@code PathRepository} with the given repository source name, root node UUID, and a default workspace with the
-     * given name.
-     * 
-     * @param sourceName the name of the repository source for use in error and informational messages; may not be null or empty
-     * @param rootNodeUuid the UUID that will be used as the root node UUID for each workspace in the repository; may not be null
-     *        or empty
-     * @param defaultWorkspaceName the name of the default, auto-created workspace
-     */
-    protected PathRepository( String sourceName,
-                              UUID rootNodeUuid,
-                              String defaultWorkspaceName ) {
-        CheckArg.isNotEmpty(sourceName, "sourceName");
-        CheckArg.isNotNull(rootNodeUuid, "rootNodeUUID");
-        this.rootNodeUuid = rootNodeUuid;
-        this.sourceName = sourceName;
-        this.defaultWorkspaceName = defaultWorkspaceName != null ? defaultWorkspaceName : "";
-    }
-
-    /**
      * Returns the UUID used by the root nodes in each workspace.
      * <p>
      * Note that the root nodes themselves are distinct objects in each workspace and a change to the root node of one workspace
@@ -113,6 +96,7 @@
         return false;
     }
 
+
     PathRequestProcessor createRequestProcessor( ExecutionContext context,
                                                  PathRepositorySource source ) {
         RepositoryContext repositoryContext = source.getRepositoryContext();

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositoryConnection.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -34,7 +34,7 @@
      * {@inheritDoc}
      */
     public CachePolicy getDefaultCachePolicy() {
-        return source.getDefaultCachePolicy();
+        return source.getCachePolicy();
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositorySource.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRepositorySource.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -1,8 +1,10 @@
 package org.jboss.dna.graph.connector.path;
 
+import java.util.UUID;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.path.cache.PathCachePolicy;
 
 /**
  * An extension of the {@link RepositorySource} class that provides a {@link CachePolicy cache policy} and a
@@ -28,17 +30,30 @@
     void setUpdatesAllowed( boolean updatesAllowed );
 
     /**
-     * Returns the {@link CachePolicy cache policy} for the repository source
+     * Returns the {@link PathCachePolicy cache policy} for the repository source
      * 
-     * @return the {@link CachePolicy cache policy} for the repository source
+     * @return the {@link PathCachePolicy cache policy} for the repository source
      */
-    CachePolicy getDefaultCachePolicy();
+    PathCachePolicy getCachePolicy();
 
     /**
+     * Get the UUID that is used for the root node of each workspace
+     * 
+     * @return the UUID that is used for the root node of each workspace
+     */
+    UUID getRootNodeUuid();
+
+    /**
+     * Get the name of the default workspace.
+     * 
+     * @return the name of the workspace that should be used by default; never null
+     */
+    String getDefaultWorkspaceName();
+
+    /**
      * Returns the {@link RepositoryContext repository context} for the repository source
      * 
      * @return the {@link RepositoryContext repository context} for the repository source
      */
     RepositoryContext getRepositoryContext();
-
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/PathRequestProcessor.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -498,7 +498,7 @@
         WritablePathWorkspace newWorkspace = (WritablePathWorkspace)workspace;
 
         // Now set (or remove) the properties to the supplied node ...
-        newWorkspace.setProperties(getExecutionContext(), node.getPath(), request.properties().values());
+        newWorkspace.setProperties(getExecutionContext(), node.getPath(), request.properties());
 
         request.setActualLocationOfNode(Location.create(node.getPath(), node.getUuid()));
         recordChange(request);

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathRepository.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathRepository.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -23,7 +23,6 @@
  */
 package org.jboss.dna.graph.connector.path;
 
-import java.util.UUID;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.Path;
@@ -37,17 +36,10 @@
 @ThreadSafe
 public abstract class WritablePathRepository extends PathRepository {
 
-    public WritablePathRepository( String sourceName,
-                                   UUID rootNodeUuid,
-                                   String defaultWorkspaceName ) {
-        super(sourceName, rootNodeUuid, defaultWorkspaceName);
+    public WritablePathRepository( PathRepositorySource source ) {
+        super(source);
     }
 
-    public WritablePathRepository( String sourceName,
-                                   UUID rootNodeUuid ) {
-        super(sourceName, rootNodeUuid);
-    }
-
     /**
      * Creates a new workspace with the given name containing only a root node.
      * <p>
@@ -141,7 +133,7 @@
             PathNode root = workspace.getNode(rootPath);
             PathNode origRoot = original.getNode(rootPath);
             workspace.removeProperties(context, rootPath, root.getProperties().keySet());
-            workspace.setProperties(context, rootPath, origRoot.getProperties().values());
+            workspace.setProperties(context, rootPath, origRoot.getProperties());
 
             // Loop over each child and call this method to copy the immediate children (and below).
             for (Segment childSegment : origRoot.getChildSegments()) {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathWorkspace.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathWorkspace.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/WritablePathWorkspace.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -135,7 +135,7 @@
      */
     public PathNode setProperties( ExecutionContext context,
                                    Path nodePath,
-                                   Iterable<Property> properties );
+                                   Map<Name, Property> properties );
 
     /**
      * Removes the properties with the given names

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/CacheStatistics.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/CacheStatistics.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/CacheStatistics.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,53 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+/**
+ * This interface provides access to statistics for an individual workspace cache.
+ */
+public interface CacheStatistics {
+
+    /**
+     * @return the number of times that a node was written to the cache
+     */
+    long getWrites();
+
+    /**
+     * @return the number of times that a node was retrieved from the cache
+     */
+    long getHits();
+
+    /**
+     * @return the number of times that an attempt to retrieve a node from the cache failed because the node was not yet in the
+     *         cache.
+     */
+    long getMisses();
+
+    /**
+     * @return the number of times that an attempt to retrieve a node from the cache failed because the node had previously been
+     *         placed in the cache, but the time to live for the node in the cache had expired
+     */
+    long getExpirations();
+
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/CacheStatistics.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,63 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.connector.path.PathNode;
+
+/**
+ * Trivial path cache policy implementation that caches all nodes in an in-memory cache.
+ * <p>
+ * As a result, this cache policy may not be safe for use with some large repositories as it does not attempt to limit cache
+ * attempts based on the size of the node or the current size of the cache.
+ * </p>
+ */
+ at Immutable
+public class DefaultPathCachePolicy implements PathCachePolicy {
+
+    private static final long serialVersionUID = 1L;
+
+    private final long cacheTimeToLiveInSeconds;
+
+    public DefaultPathCachePolicy( long cacheTimeToLiveInSeconds ) {
+        super();
+        this.cacheTimeToLiveInSeconds = cacheTimeToLiveInSeconds;
+    }
+
+    /**
+     * @return true for all nodes
+     * @see PathCachePolicy#shouldCache(PathNode)
+     */
+    public boolean shouldCache( PathNode node ) {
+        return true;
+    }
+
+    public long getTimeToLive() {
+        return this.cacheTimeToLiveInSeconds;
+    }
+
+    public Class<? extends WorkspaceCache> getCacheClass() {
+        return InMemoryWorkspaceCache.class;
+    }
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,147 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import java.lang.ref.SoftReference;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicLong;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.graph.connector.path.PathNode;
+import org.jboss.dna.graph.property.Path;
+
+/**
+ * Implementation of {@link WorkspaceCache} that stores all nodes in-memory.
+ */
+ at ThreadSafe
+public class InMemoryWorkspaceCache implements WorkspaceCache {
+    private final ConcurrentMap<Path, CacheEntry> nodesByPath = new ConcurrentHashMap<Path, CacheEntry>();
+    private PathCachePolicy policy = null;
+    private InMemoryStatistics statistics = new InMemoryStatistics();
+
+    public void initialize( PathCachePolicy policy ) {
+        if (this.policy != null) {
+            throw new IllegalStateException();
+        }
+
+        this.policy = policy;
+    }
+
+    public void clearStatistics() {
+        statistics = new InMemoryStatistics();
+    }
+
+    public CacheStatistics getStatistics() {
+        return this.statistics;
+    }
+
+    public PathNode get( Path path ) {
+        assert path != null;
+
+        CacheEntry entry = nodesByPath.get(path);
+        if (entry == null) {
+            statistics.misses.getAndIncrement();
+            return null;
+        }
+
+        PathNode node = entry.getNode();
+        if (node != null) {
+            statistics.hits.getAndIncrement();
+            return node;
+        }
+
+        nodesByPath.remove(path, entry);
+        statistics.expirations.getAndIncrement();
+        return null;
+    }
+
+    public void set( PathNode node ) {
+        assert node != null;
+
+        if (!policy.shouldCache(node)) return;
+        
+        statistics.writes.getAndIncrement();
+        nodesByPath.put(node.getPath(), new CacheEntry(node));
+    }
+
+    public void invalidate( Path path ) {
+        assert path != null;
+
+        for (Iterator<Path> iter = nodesByPath.keySet().iterator(); iter.hasNext();) {
+            Path key = iter.next();
+            if (key.isAtOrBelow(path)) {
+                iter.remove();
+            }
+        }
+    }
+
+    public void close() {
+        assert this.statistics != null : "Attempt to close an already-closed cache";
+
+        this.nodesByPath.clear();
+        this.statistics = null;
+    }
+
+    class CacheEntry {
+        private final SoftReference<PathNode> ref;
+        private final long expiryTime;
+
+        CacheEntry( PathNode node ) {
+            ref = new SoftReference<PathNode>(node);
+            expiryTime = System.currentTimeMillis() + (policy.getTimeToLive() * 1000);
+        }
+
+        PathNode getNode() {
+            if (System.currentTimeMillis() > expiryTime) {
+                return null;
+            }
+
+            return ref.get();
+        }
+    }
+
+    class InMemoryStatistics implements CacheStatistics {
+        private final AtomicLong writes = new AtomicLong(0);
+        private final AtomicLong hits = new AtomicLong(0);
+        private final AtomicLong misses = new AtomicLong(0);
+        private final AtomicLong expirations = new AtomicLong(0);
+
+        public long getWrites() {
+            return writes.get();
+        }
+
+        public long getHits() {
+            return hits.get();
+        }
+
+        public long getMisses() {
+            return misses.get();
+        }
+
+        public long getExpirations() {
+            return expirations.get();
+        }
+    }
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathCachePolicy.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathCachePolicy.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathCachePolicy.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,49 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import org.jboss.dna.graph.cache.CachePolicy;
+import org.jboss.dna.graph.connector.path.PathNode;
+
+/**
+ * The {@PathCachePolicy} provides a method for selectively allowing or disallowing nodes to be cached based on
+ * their size, volatility, or any other factor that can be determined for the node.
+ */
+public interface PathCachePolicy extends CachePolicy {
+
+    /**
+     * Indicates whether the node should be cached .
+     * 
+     * @param node the node that may or may not be cached; may not be null
+     * @return true if the node should be cached and false if it should not be cached
+     */
+    boolean shouldCache( PathNode node );
+
+    /**
+     * Return the class to be used as the cache implementation
+     * 
+     * @return the cache class
+     */
+    Class<? extends WorkspaceCache> getCacheClass();
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathCachePolicy.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,86 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import net.jcip.annotations.ThreadSafe;
+
+/**
+ * The repository-source level cache of workspace names to {@link WorkspaceCache workspace caches}.
+ * <p>
+ * This object gets created for each repository whenever the {@link PathCachePolicy cache policy} is set. When the cache policy is
+ * modified, the old {@code PathRepositoryCache} is {@link #close() closed} after the new path repository cache is created.
+ * </p>
+ */
+ at ThreadSafe
+public class PathRepositoryCache {
+
+    private final PathCachePolicy policy;
+    private final ConcurrentMap<String, WorkspaceCache> cachesByName = new ConcurrentHashMap<String, WorkspaceCache>();
+
+    public PathRepositoryCache( PathCachePolicy policy ) {
+        this.policy = policy;
+    }
+
+    public void close() {
+        for (WorkspaceCache cache : cachesByName.values()) {
+            cache.close();
+        }
+    }
+
+    /**
+     * Gets the cache for the named workspace, creating a cache if necessary. Subsequent calls to this method with the same
+     * workspace name must return the exact same cache instance.
+     * 
+     * @param workspaceName the name of the workspace for which the cache should be returned.
+     * @return the cache instance associated with the workspace; never null
+     * @throws IllegalStateException if no cache exists for this workspace and an instance of the
+     *         {@link PathCachePolicy#getCacheClass() cache class from the policy} cannot be created.
+     */
+    public WorkspaceCache getCache( String workspaceName ) {
+        WorkspaceCache cache = cachesByName.get(workspaceName);
+        if (cache != null) return cache;
+
+        cache = newCache();
+        cachesByName.putIfAbsent(workspaceName, cache);
+
+        return cachesByName.get(workspaceName);
+    }
+
+    private final WorkspaceCache newCache() {
+        WorkspaceCache cache = null;
+
+        try {
+            cache = policy.getCacheClass().newInstance();
+            cache.initialize(policy);
+        } catch (IllegalAccessException iae) {
+            throw new IllegalStateException(iae);
+        } catch (InstantiationException ie) {
+            throw new IllegalStateException(ie);
+        }
+        return cache;
+    }
+
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,91 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.graph.connector.path.PathNode;
+import org.jboss.dna.graph.property.Path;
+
+/**
+ * The basic contract for a workspace-level cache of paths to the nodes stored at that path.
+ * <p>
+ * Implementations must provide a no-argument constructor in order to be instantiated by {@link PathRepositoryCache}. After
+ * instantiation, the {@link #initialize(PathCachePolicy)} method will be called to inject the cache policy into the
+ * implementation.
+ * </p>
+ * <p>
+ * Implementations must be thread-safe.
+ * </p>
+ */
+ at ThreadSafe
+public interface WorkspaceCache {
+
+    /**
+     * Injects the cache policy into the cache
+     * 
+     * @param policy the active cache policy for the repository source with which this cache is associated
+     * @throws IllegalStateException if this method is called on a cache that has already been initialized.
+     */
+    public void initialize( PathCachePolicy policy );
+
+    /**
+     * Clears all statistics for this cache
+     */
+    public void clearStatistics();
+
+    /**
+     * @return the statistics since the most recent of the cache initialization or the last call to {@link #clearStatistics()};
+     *         never null
+     */
+    public CacheStatistics getStatistics();
+
+    /**
+     * Retrieves the cached node with the given path, it it exists and is valid
+     * 
+     * @param path the path for the node to be retrieved
+     * @return the cached node with the given path; may be null if no node with that path is cached or a node with that path is
+     *         cached but is deemed invalid for implementation-specific reasons
+     */
+    public PathNode get( Path path );
+
+    /**
+     * Attempts to cache the given node. Implementations must call {@link PathCachePolicy#shouldCache(PathNode)} on the policy
+     * from the {@link #initialize(PathCachePolicy)} method to determine if the node should be cached.
+     * 
+     * @param node the node that is to be cached; may not be null
+     */
+    public void set( PathNode node );
+
+    /**
+     * Invalidates all nodes in the cache that have the given path or have a path that is an ancestor of the given path
+     * 
+     * @param path the root of the branch of nodes that are to be invalidated; may not be null
+     */
+    public void invalidate( Path path );
+
+    /**
+     * Indicates that the cache is no longer in use and should relinquish any resources.
+     */
+    public void close();
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,42 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ * 
+ * The {@link PathRepositoryCache} class and its supporting classes provide a standard caching mechanism for path-based repositories.  Users of any path repository
+ * based on {@link org.jboss.dna.graph.connector.path.AbstractPathRepositorySource} can call {@link org.jboss.dna.graph.connector.path.AbstractPathRepositorySource#setCachePolicy(PathCachePolicy)} to
+ * configure the caching for that repository.  This method can be invoked at run-time to modify the cache properties of an in-use repository.
+ * <p>
+ * Each {@code AbstractPathRepositorySource} has a local instance of {@link PathRepositoryCache} that reads the {@code PathCachePolicy} for the source and uses it to create instances of
+ * {@link WorkspaceCache} for each workspace in the repository.  When a workspace cache instance is requested for the first time from the {@link PathRepositoryCache#getCache(String)} method,
+ * an instance of the class is created using the no-argument constructor for the class and {@link WorkspaceCache#initialize(PathCachePolicy)} is called with the current cache policy. 
+ * </p>
+ * <p>
+ * When {@link org.jboss.dna.graph.connector.path.AbstractPathRepositorySource#setCachePolicy(PathCachePolicy) the cache policy is changed} on the source, the existing {@code PathRepositoryCache}
+ * is {@link PathRepositoryCache#close() closed} and a new path repository cache is created.
+ * </p> 
+ * 
+ */
+
+package org.jboss.dna.graph.connector.path.cache;
+


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	                        (rev 0)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -0,0 +1,165 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path;
+
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.cache.CacheStatistics;
+import org.jboss.dna.graph.connector.path.cache.PathCachePolicy;
+import org.jboss.dna.graph.connector.path.cache.PathRepositoryCache;
+import org.jboss.dna.graph.connector.path.cache.WorkspaceCache;
+import org.jboss.dna.graph.property.Path;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AbstractPathRepositorySourceTest {
+
+    private AbstractPathRepositorySource source;
+
+    @SuppressWarnings( "serial" )
+    @Before
+    public void beforeEach() throws Exception {
+        source = new AbstractPathRepositorySource() {
+
+            public String getDefaultWorkspaceName() {
+                return null;
+            }
+
+            public void setUpdatesAllowed( boolean updatesAllowed ) {
+            }
+
+            public RepositorySourceCapabilities getCapabilities() {
+                return null;
+            }
+
+            public RepositoryConnection getConnection() throws RepositorySourceException {
+                return null;
+            }
+
+            public Reference getReference() throws NamingException {
+                return null;
+            }
+        };
+    }
+
+    @Test
+    public void shouldProvideDefaultCachePolicy() throws Exception {
+        assertThat(source.getCachePolicy(), is(notNullValue()));
+    }
+
+    @Test
+    public void shouldProvideDefaultPathRepositoryCache() throws Exception {
+        assertThat(source.getPathRepositoryCache(), is(notNullValue()));
+    }
+
+    @Test
+    public void shouldMakeNewRepositoryCacheWhenCachePolicyIsChanged() throws Exception {
+        PathCachePolicy policy1 = new MockCachePolicy();
+        source.setCachePolicy(policy1);
+
+        PathRepositoryCache cache1 = source.getPathRepositoryCache();
+        assertThat(cache1, is(notNullValue()));
+
+        PathCachePolicy policy2 = new MockCachePolicy();
+        source.setCachePolicy(policy2);
+
+        assertThat(source.getCachePolicy(), is(policy2));
+        assertThat(source.getCachePolicy(), is(not(policy1)));
+
+        PathRepositoryCache cache2 = source.getPathRepositoryCache();
+        assertThat(cache2, is(notNullValue()));
+        assertThat(cache2, is(not(cache1)));
+    }
+
+    @Test
+    public void shouldCloseOldWorkspaceCacheWhenCachePolicyIsChanged() throws Exception {
+        PathCachePolicy policy1 = new MockCachePolicy();
+        source.setCachePolicy(policy1);
+
+        PathRepositoryCache repositoryCache = source.getPathRepositoryCache();
+        MockWorkspaceCache cache = (MockWorkspaceCache)repositoryCache.getCache("foo");
+        assertThat(cache, is(notNullValue()));
+
+        source.setCachePolicy(new MockCachePolicy());
+
+        assertThat(cache.closed, is(true));
+    }
+
+    @SuppressWarnings( "serial" )
+    class MockCachePolicy implements PathCachePolicy {
+
+        public Class<? extends WorkspaceCache> getCacheClass() {
+            return MockWorkspaceCache.class;
+        }
+
+        public boolean shouldCache( PathNode node ) {
+            return false;
+        }
+
+        public long getTimeToLive() {
+            return 0;
+        }
+
+    }
+
+    public static class MockWorkspaceCache implements WorkspaceCache {
+
+        boolean closed = false;
+        PathCachePolicy policy;
+
+        public void initialize( PathCachePolicy policy ) {
+            this.policy = policy;
+        }
+
+        public void clearStatistics() {
+        }
+
+        public void close() {
+            closed = true;
+        }
+
+        public PathNode get( Path path ) {
+            return null;
+        }
+
+        public CacheStatistics getStatistics() {
+            return null;
+        }
+
+        public void invalidate( Path path ) {
+        }
+
+        public void set( PathNode node ) {
+        }
+
+    }
+}


Property changes on: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRepository.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -51,6 +51,7 @@
 import org.jboss.dna.graph.connector.path.PathNode;
 import org.jboss.dna.graph.connector.path.WritablePathRepository;
 import org.jboss.dna.graph.connector.path.WritablePathWorkspace;
+import org.jboss.dna.graph.connector.path.cache.WorkspaceCache;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.graph.property.Binary;
 import org.jboss.dna.graph.property.BinaryFactory;
@@ -80,7 +81,7 @@
     private File repositoryRoot;
 
     public FileSystemRepository( FileSystemSource source ) {
-        super(source.getName(), source.getRootNodeUuid(), source.getDefaultWorkspaceName());
+        super(source);
 
         this.source = source;
         initialize();
@@ -125,6 +126,11 @@
         }
     }
 
+
+    public WorkspaceCache getCache( String workspaceName ) {
+        return source.getPathRepositoryCache().getCache(workspaceName);
+    }
+
     /**
      * Internal method that creates a workspace and adds it to the map of active workspaces without checking to see if
      * {@link FileSystemSource#isCreatingWorkspacesAllowed() the source allows creating workspaces}. This is useful when setting
@@ -376,7 +382,18 @@
                                                                               getName(),
                                                                               getSourceName()));
             }
-            return getNode(newPath);
+
+            PathNode node = getNode(newPath);
+
+            List<Segment> newChildren = new ArrayList<Segment>(parentNode.getChildSegments().size() + 1);
+            newChildren.addAll(parentNode.getChildSegments());
+            newChildren.add(node.getPath().getLastSegment());
+
+            WorkspaceCache cache = getCache(getName());
+            cache.set(new DefaultPathNode(parentNode.getPath(), parentNode.getUuid(), parentNode.getProperties(), newChildren));
+            cache.set(node);
+
+            return node;
         }
 
         public boolean removeNode( ExecutionContext context,
@@ -411,57 +428,16 @@
             return true;
         }
 
-        public PathNode removeProperties( ExecutionContext context,
-                                          Path nodePath,
-                                          Iterable<Name> propertyNames ) {
-
-            PathNode targetNode = getNode(nodePath);
-            if (targetNode == null) return null;
-            if (source.getCustomPropertiesFactory() == null) return targetNode;
-
-            Property primaryTypeProp = targetNode.getProperty(JcrLexicon.PRIMARY_TYPE);
-            Name primaryTypeName = (Name)primaryTypeProp.getFirstValue();
-            Map<Name, Property> properties = new HashMap<Name, Property>(targetNode.getProperties());
-
-            for (Name propertyName : propertyNames) {
-                properties.remove(propertyName);
-            }
-
-            CustomPropertiesFactory customPropertiesFactory = source.customPropertiesFactory();
-            Location location = Location.create(nodePath, targetNode.getUuid());
-
-            /*
-             * You can't remove any of the protected properties that the repository provides by default, but you could
-             * remove custom properties.
-             */
-            if (JcrNtLexicon.FILE.equals(primaryTypeName)) {
-                customPropertiesFactory.recordFileProperties(context, getSourceName(), location, fileFor(nodePath), properties);
-            } else if (DnaLexicon.RESOURCE.equals(primaryTypeName)) {
-                File file = fileFor(nodePath.getParent());
-                customPropertiesFactory.recordResourceProperties(context, getSourceName(), location, file, properties);
-            } else {
-                File file = fileFor(nodePath);
-                customPropertiesFactory.recordDirectoryProperties(context, getSourceName(), location, file, properties);
-            }
-
-            return getNode(nodePath);
-        }
-
         public PathNode setProperties( ExecutionContext context,
                                        Path nodePath,
-                                       Iterable<Property> newProperties ) {
+                                       Map<Name, Property> properties ) {
             PathNode targetNode = getNode(nodePath);
             if (targetNode == null) return null;
             if (source.getCustomPropertiesFactory() == null) return targetNode;
 
             Property primaryTypeProp = targetNode.getProperty(JcrLexicon.PRIMARY_TYPE);
             Name primaryTypeName = (Name)primaryTypeProp.getFirstValue();
-            Map<Name, Property> properties = new HashMap<Name, Property>(targetNode.getProperties());
 
-            for (Property newProperty : newProperties) {
-                properties.put(newProperty.getName(), newProperty);
-            }
-
             CustomPropertiesFactory customPropertiesFactory = source.customPropertiesFactory();
             Location location = Location.create(nodePath, targetNode.getUuid());
 
@@ -479,7 +455,10 @@
                 customPropertiesFactory.recordDirectoryProperties(context, getSourceName(), location, file, properties);
             }
 
-            return getNode(nodePath);
+            PathNode node = getNode(nodePath);
+            getCache(getName()).set(node);
+
+            return node;
         }
 
         @Override
@@ -492,7 +471,11 @@
             if (beforeNode != null) {
                 throw new InvalidRequestException(FileSystemI18n.nodeOrderingNotSupported.text(getSourceName()));
             }
-            return super.moveNode(context, node, desiredNewName, originalWorkspace, newParent, beforeNode);
+            PathNode movedNode = super.moveNode(context, node, desiredNewName, originalWorkspace, newParent, beforeNode);
+
+            getCache(getName()).invalidate(node.getPath());
+
+            return movedNode;
         }
 
         public Path getLowestExistingPath( Path path ) {
@@ -525,6 +508,11 @@
         }
 
         public PathNode getNode( Path path ) {
+            WorkspaceCache cache = getCache(getName());
+
+            PathNode node = cache.get(path);
+            if (node != null) return node;
+
             Map<Name, Property> properties = new HashMap<Name, Property>();
 
             PropertyFactory factory = context.getPropertyFactory();
@@ -615,9 +603,11 @@
             }
             properties.put(JcrLexicon.PRIMARY_TYPE, factory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE));
             properties.put(JcrLexicon.CREATED, factory.create(JcrLexicon.CREATED, dateFactory.create(file.lastModified())));
-            return new DefaultPathNode(path, null, properties,
+            node = new DefaultPathNode(path, null, properties,
                                        Collections.singletonList(pathFactory.createSegment(JcrLexicon.CONTENT)));
 
+            cache.set(node);
+            return node;
         }
 
         /**

Modified: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemSource.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -24,33 +24,26 @@
 
 package org.jboss.dna.connector.filesystem;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.regex.Pattern;
 import javax.naming.BinaryRefAddr;
 import javax.naming.Context;
-import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.StringRefAddr;
 import javax.naming.spi.ObjectFactory;
-import net.jcip.annotations.Immutable;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.common.util.CheckArg;
@@ -59,14 +52,12 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.Location;
-import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
 import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractPathRepositorySource;
 import org.jboss.dna.graph.connector.path.PathRepositoryConnection;
-import org.jboss.dna.graph.connector.path.PathRepositorySource;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NamespaceRegistry;
 import org.jboss.dna.graph.property.Property;
@@ -77,7 +68,7 @@
  * workspace. New workspaces can be created, as long as the names represent valid paths to existing directories.
  */
 @ThreadSafe
-public class FileSystemSource implements PathRepositorySource, ObjectFactory {
+public class FileSystemSource extends AbstractPathRepositorySource implements ObjectFactory {
 
     /**
      * An immutable {@link CustomPropertiesFactory} implementation that is used by default when none is provided. Note that this
@@ -96,8 +87,6 @@
     public static final String DEFAULT_NAME_OF_DEFAULT_WORKSPACE = "default";
 
     protected static final String SOURCE_NAME = "sourceName";
-    protected static final String CACHE_TIME_TO_LIVE_IN_MILLISECONDS = "cacheTimeToLiveInMilliseconds";
-    protected static final String RETRY_LIMIT = "retryLimit";
     protected static final String DEFAULT_WORKSPACE = "defaultWorkspace";
     protected static final String WORKSPACE_ROOT = "workspaceRootPath";
     protected static final String PREDEFINED_WORKSPACE_NAMES = "predefinedWorkspaceNames";
@@ -128,18 +117,12 @@
      */
     protected static final boolean SUPPORTS_REFERENCES = false;
 
-    public static final int DEFAULT_RETRY_LIMIT = 0;
-    public static final int DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS = 60 * 5; // 5 minutes
     public static final int DEFAULT_MAX_PATH_LENGTH = 255; // 255 for windows users
     public static final String DEFAULT_EXCLUSION_PATTERN = null;
 
-    private volatile String name;
-    private volatile int retryLimit = DEFAULT_RETRY_LIMIT;
-    private volatile int cacheTimeToLiveInMilliseconds = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS * 1000;
     private volatile String defaultWorkspaceName = DEFAULT_NAME_OF_DEFAULT_WORKSPACE;
     private volatile String workspaceRootPath;
     private volatile String[] predefinedWorkspaces = new String[] {};
-    private volatile UUID rootNodeUuid = UUID.randomUUID();
     private volatile int maxPathLength = DEFAULT_MAX_PATH_LENGTH;
     private volatile String exclusionPattern = DEFAULT_EXCLUSION_PATTERN;
     private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(
@@ -148,8 +131,6 @@
                                                                                                   SUPPORTS_EVENTS,
                                                                                                   DEFAULT_SUPPORTS_CREATING_WORKSPACES,
                                                                                                   SUPPORTS_REFERENCES);
-    private transient RepositoryContext repositoryContext;
-    private transient CachePolicy defaultCachePolicy;
     private transient FileSystemRepository repository;
     private volatile CustomPropertiesFactory customPropertiesFactory;
 
@@ -169,28 +150,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#getName()
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set the name for the source
-     * 
-     * @param name the new name for the source
-     */
-    public synchronized void setName( String name ) {
-        if (name != null) {
-            name = name.trim();
-            if (name.length() == 0) name = null;
-        }
-        this.name = name;
-    }
-
-    /**
      * Get whether this source supports updates.
      * 
      * @return true if this source supports updates, or false if this source only supports reading content.
@@ -255,25 +214,6 @@
     }
 
     /**
-     * Get the UUID that is used for the root node of each workspace
-     * 
-     * @return the UUID that is used for the root node of each workspace
-     */
-    public UUID getRootNodeUuid() {
-        return rootNodeUuid;
-    }
-
-    /**
-     * Set the {@code jcr:uuid} property of the root node in each workspace to the given value.
-     * 
-     * @param rootNodeUuid the UUID to use for the root nodes of all workspaces
-     */
-    public synchronized void setRootNodeUuid( String rootNodeUuid ) {
-        CheckArg.isNotNull(rootNodeUuid, "rootNodeUuid");
-        this.rootNodeUuid = UUID.fromString(rootNodeUuid);
-    }
-
-    /**
      * Get the maximum path length (in characters) allowed by the underlying file system
      * 
      * @return the maximum path length (in characters) allowed by the underlying file system
@@ -377,6 +317,7 @@
      * @return true if this source allows updates by clients, or false if no updates are allowed
      * @see #setUpdatesAllowed(boolean)
      */
+    @Override
     public boolean areUpdatesAllowed() {
         return capabilities.supportsUpdates();
     }
@@ -395,45 +336,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#getRetryLimit()
-     */
-    public int getRetryLimit() {
-        return retryLimit;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#setRetryLimit(int)
-     */
-    public synchronized void setRetryLimit( int limit ) {
-        this.retryLimit = limit < 0 ? 0 : limit;
-    }
-
-    /**
-     * Get the time in milliseconds that content returned from this source may used while in the cache.
-     * 
-     * @return the time to live, in milliseconds, or 0 if the time to live is not specified by this source
-     */
-    public int getCacheTimeToLiveInMilliseconds() {
-        return cacheTimeToLiveInMilliseconds;
-    }
-
-    /**
-     * Set the time in milliseconds that content returned from this source may used while in the cache.
-     * 
-     * @param cacheTimeToLive the time to live, in milliseconds; 0 if the time to live is not specified by this source; or a
-     *        negative number for the default value
-     */
-    public synchronized void setCacheTimeToLiveInMilliseconds( int cacheTimeToLive ) {
-        if (cacheTimeToLive < 0) cacheTimeToLive = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS;
-        this.cacheTimeToLiveInMilliseconds = cacheTimeToLive;
-        this.defaultCachePolicy = cacheTimeToLiveInMilliseconds > 0 ? new FileSystemCachePolicy(cacheTimeToLiveInMilliseconds) : null;
-    }
-
-    /**
      * Get the factory that is used to create custom properties on "nt:folder", "nt:file", and "nt:resource" nodes.
      * 
      * @return the factory, or null if no custom properties are to be created
@@ -458,23 +360,6 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#initialize(org.jboss.dna.graph.connector.RepositoryContext)
-     */
-    public synchronized void initialize( RepositoryContext context ) throws RepositorySourceException {
-        this.repositoryContext = context;
-    }
-
-    public RepositoryContext getRepositoryContext() {
-        return this.repositoryContext;
-    }
-
-    public CachePolicy getDefaultCachePolicy() {
-        return defaultCachePolicy;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
      * @see javax.naming.Referenceable#getReference()
      */
     public synchronized Reference getReference() {
@@ -485,8 +370,6 @@
         if (getName() != null) {
             ref.add(new StringRefAddr(SOURCE_NAME, getName()));
         }
-        ref.add(new StringRefAddr(CACHE_TIME_TO_LIVE_IN_MILLISECONDS, Integer.toString(getCacheTimeToLiveInMilliseconds())));
-        ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
         ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDefaultWorkspaceName()));
         ref.add(new StringRefAddr(ALLOW_CREATING_WORKSPACES, Boolean.toString(isCreatingWorkspacesAllowed())));
         ref.add(new StringRefAddr(EXCLUSION_PATTERN, exclusionPattern));
@@ -518,30 +401,9 @@
                                      Context nameCtx,
                                      Hashtable<?, ?> environment ) throws Exception {
         if (obj instanceof Reference) {
-            Map<String, Object> values = new HashMap<String, Object>();
-            Reference ref = (Reference)obj;
-            Enumeration<?> en = ref.getAll();
-            while (en.hasMoreElements()) {
-                RefAddr subref = (RefAddr)en.nextElement();
-                if (subref instanceof StringRefAddr) {
-                    String key = subref.getType();
-                    Object value = subref.getContent();
-                    if (value != null) values.put(key, value.toString());
-                } else if (subref instanceof BinaryRefAddr) {
-                    String key = subref.getType();
-                    Object value = subref.getContent();
-                    if (value instanceof byte[]) {
-                        // Deserialize ...
-                        ByteArrayInputStream bais = new ByteArrayInputStream((byte[])value);
-                        ObjectInputStream ois = new ObjectInputStream(bais);
-                        value = ois.readObject();
-                        values.put(key, value);
-                    }
-                }
-            }
+            Map<String, Object> values = valuesFrom((Reference)obj);
+
             String sourceName = (String)values.get(SOURCE_NAME);
-            String cacheTtlInMillis = (String)values.get(CACHE_TIME_TO_LIVE_IN_MILLISECONDS);
-            String retryLimit = (String)values.get(RETRY_LIMIT);
             String defaultWorkspace = (String)values.get(DEFAULT_WORKSPACE);
             String createWorkspaces = (String)values.get(ALLOW_CREATING_WORKSPACES);
             String exclusionPattern = (String)values.get(EXCLUSION_PATTERN);
@@ -558,8 +420,6 @@
             // Create the source instance ...
             FileSystemSource source = new FileSystemSource();
             if (sourceName != null) source.setName(sourceName);
-            if (cacheTtlInMillis != null) source.setCacheTimeToLiveInMilliseconds(Integer.parseInt(cacheTtlInMillis));
-            if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
             if (defaultWorkspace != null) source.setDefaultWorkspaceName(defaultWorkspace);
             if (createWorkspaces != null) source.setCreatingWorkspacesAllowed(Boolean.parseBoolean(createWorkspaces));
             if (workspaceNames != null && workspaceNames.length != 0) source.setPredefinedWorkspaceNames(workspaceNames);
@@ -588,14 +448,6 @@
     }
 
 
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#close()
-     */
-    public synchronized void close() {
-    }
-
     protected static class StandardPropertiesFactory implements CustomPropertiesFactory {
         private static final long serialVersionUID = 1L;
         private final Collection<Property> empty = Collections.emptyList();
@@ -719,20 +571,4 @@
         }
 
     }
-
-    @Immutable
-    /*package*/class FileSystemCachePolicy implements CachePolicy {
-        private static final long serialVersionUID = 1L;
-        private final int ttl;
-
-        /*package*/FileSystemCachePolicy( int ttl ) {
-            this.ttl = ttl;
-        }
-
-        public long getTimeToLive() {
-            return ttl;
-        }
-
-    }
-
 }

Modified: trunk/extensions/dna-connector-filesystem/src/test/java/org/jboss/dna/connector/filesystem/FileSystemConnectorWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/test/java/org/jboss/dna/connector/filesystem/FileSystemConnectorWritableTest.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-filesystem/src/test/java/org/jboss/dna/connector/filesystem/FileSystemConnectorWritableTest.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -155,7 +155,6 @@
         File newFolder = new File(testWorkspaceRoot, "testFolder");
         assertThat(newFolder.exists(), is(true));
         assertThat(newFolder.isDirectory(), is(true));
-        System.out.println("Created new folder at: " + newFolder.getCanonicalPath());
 
         graph.create("/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
         graph.create("/testFolder/testFile/jcr:content")

Modified: trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepository.java
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepository.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepository.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -48,6 +48,7 @@
 import org.jboss.dna.graph.connector.path.PathNode;
 import org.jboss.dna.graph.connector.path.PathRepository;
 import org.jboss.dna.graph.connector.path.PathWorkspace;
+import org.jboss.dna.graph.connector.path.cache.WorkspaceCache;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.graph.property.Path;
@@ -75,7 +76,7 @@
     private int databaseMinorVersion;
 
     public JdbcMetadataRepository( JdbcMetadataSource source ) {
-        super(source.getName(), source.getRootUuid(), source.getDefaultWorkspaceName());
+        super(source);
         this.source = source;
         initialize();
     }
@@ -122,6 +123,10 @@
         }
     }
 
+    public WorkspaceCache getCache( String workspaceName ) {
+        return source.getPathRepositoryCache().getCache(workspaceName);
+    }
+
     Connection getConnection() {
         try {
             return source.getDataSource().getConnection();
@@ -144,9 +149,11 @@
     private class JdbcMetadataWorkspace implements PathWorkspace {
 
         private final String name;
+        private final WorkspaceCache cache;
 
         JdbcMetadataWorkspace( String name ) {
             this.name = name;
+            cache = getCache(name);
         }
 
         public Path getLowestExistingPath( Path path ) {
@@ -176,37 +183,45 @@
         public PathNode getNode( Path path ) {
             assert path != null;
 
+            PathNode node = cache.get(path);
+            if (node != null) return node;
+
             List<Segment> segments = path.getSegmentsList();
             switch (segments.size()) {
                 case 0:
-                    return getRoot();
+                    node = getRoot();
+                    break;
                 case 1:
-                    return catalogNodeFor(segments);
+                    node = catalogNodeFor(segments);
+                    break;
                 case 2:
-                    return schemaNodeFor(segments);
+                    node = schemaNodeFor(segments);
+                    break;
                 case 3:
                     if (TABLES_SEGMENT_NAME.equals(segments.get(2).getName().getLocalName())) {
-                        return tablesNodeFor(segments);
+                        node = tablesNodeFor(segments);
                     } else if (PROCEDURES_SEGMENT_NAME.equals(segments.get(2).getName().getLocalName())) {
-                        return proceduresNodeFor(segments);
+                        node = proceduresNodeFor(segments);
                     }
-
-                    return null;
+                    break;
                 case 4:
                     if (TABLES_SEGMENT_NAME.equals(segments.get(2).getName().getLocalName())) {
-                        return tableNodeFor(segments);
+                        node = tableNodeFor(segments);
                     } else if (PROCEDURES_SEGMENT_NAME.equals(segments.get(2).getName().getLocalName())) {
-                        return procedureNodeFor(segments);
+                        node = procedureNodeFor(segments);
                     }
-                    return null;
+                    break;
                 case 5:
                     if (TABLES_SEGMENT_NAME.equals(segments.get(2).getName().getLocalName())) {
-                        return columnNodeFor(segments);
+                        node = columnNodeFor(segments);
                     }
-                    return null;
+                    break;
                 default:
                     return null;
             }
+
+            if (node != null) cache.set(node);
+            return node;
         }
 
         private PathNode catalogNodeFor( List<Segment> segments ) throws RepositorySourceException {
@@ -759,7 +774,7 @@
         }
 
         public UUID getUuid() {
-            return source.getRootUuid();
+            return source.getRootNodeUuid();
         }
 
         public Map<Name, Property> getProperties() {

Modified: trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataSource.java
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataSource.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataSource.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -24,14 +24,10 @@
 package org.jboss.dna.connector.meta.jdbc;
 
 import java.beans.PropertyVetoException;
-import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Map;
-import java.util.UUID;
 import javax.naming.Context;
 import javax.naming.InitialContext;
-import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.StringRefAddr;
 import javax.naming.spi.ObjectFactory;
@@ -40,17 +36,15 @@
 import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
 import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractPathRepositorySource;
 import org.jboss.dna.graph.connector.path.PathRepositoryConnection;
-import org.jboss.dna.graph.connector.path.PathRepositorySource;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 
 @ThreadSafe
-public class JdbcMetadataSource implements PathRepositorySource, ObjectFactory {
+public class JdbcMetadataSource extends AbstractPathRepositorySource implements ObjectFactory {
 
     private static final long serialVersionUID = 1L;
 
@@ -99,11 +93,6 @@
     public static final boolean SUPPORTS_CREATING_WORKSPACES = false;
 
     /**
-     * The default UUID that is used for root nodes in a store.
-     */
-    public static final String DEFAULT_ROOT_NODE_UUID = "cafebabe-cafe-babe-cafe-babecafebabe";
-
-    /**
      * The initial {@link #getDefaultWorkspaceName() name of the default workspace} is "{@value} ", unless otherwise specified.
      */
     public static final String DEFAULT_NAME_OF_DEFAULT_WORKSPACE = "default";
@@ -120,8 +109,7 @@
      */
     public static final String DEFAULT_NAME_OF_DEFAULT_SCHEMA = "default";
 
-    private static final int DEFAULT_RETRY_LIMIT = 0;
-    private static final int DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS = 60 * 5; // 5 minutes
+
     private static final int DEFAULT_MAXIMUM_CONNECTIONS_IN_POOL = 5;
     private static final int DEFAULT_MINIMUM_CONNECTIONS_IN_POOL = 0;
     private static final int DEFAULT_MAXIMUM_CONNECTION_IDLE_TIME_IN_SECONDS = 60 * 10; // 10 minutes
@@ -130,22 +118,18 @@
     private static final int DEFAULT_IDLE_TIME_IN_SECONDS_BEFORE_TESTING_CONNECTIONS = 60 * 3; // 3 minutes
     private static final MetadataCollector DEFAULT_METADATA_COLLECTOR = new JdbcMetadataCollector();
 
-    private volatile String name;
     private volatile String dataSourceJndiName;
     private volatile String username;
     private volatile String password;
     private volatile String url;
     private volatile String driverClassName;
     private volatile String driverClassloaderName;
-    private volatile String rootNodeUuid = DEFAULT_ROOT_NODE_UUID;
     private volatile int maximumConnectionsInPool = DEFAULT_MAXIMUM_CONNECTIONS_IN_POOL;
     private volatile int minimumConnectionsInPool = DEFAULT_MINIMUM_CONNECTIONS_IN_POOL;
     private volatile int maximumConnectionIdleTimeInSeconds = DEFAULT_MAXIMUM_CONNECTION_IDLE_TIME_IN_SECONDS;
     private volatile int maximumSizeOfStatementCache = DEFAULT_MAXIMUM_NUMBER_OF_STATEMENTS_TO_CACHE;
     private volatile int numberOfConnectionsToAcquireAsNeeded = DEFAULT_NUMBER_OF_CONNECTIONS_TO_ACQUIRE_AS_NEEDED;
     private volatile int idleTimeInSecondsBeforeTestingConnections = DEFAULT_IDLE_TIME_IN_SECONDS_BEFORE_TESTING_CONNECTIONS;
-    private volatile int retryLimit = DEFAULT_RETRY_LIMIT;
-    private volatile int cacheTimeToLiveInMilliseconds = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS * 1000;
     private volatile String defaultWorkspace = DEFAULT_NAME_OF_DEFAULT_WORKSPACE;
     private volatile String defaultCatalogName = DEFAULT_NAME_OF_DEFAULT_CATALOG;
     private volatile String defaultSchemaName = DEFAULT_NAME_OF_DEFAULT_SCHEMA;
@@ -157,52 +141,14 @@
                                                                                                   SUPPORTS_CREATING_WORKSPACES,
                                                                                                   SUPPORTS_REFERENCES);
     private transient DataSource dataSource;
-    private transient CachePolicy cachePolicy;
     private transient JdbcMetadataRepository repository;
-    private transient RepositoryContext repositoryContext;
-    private transient UUID rootUuid = UUID.fromString(rootNodeUuid);
     private transient MetadataCollector metadataCollector = DEFAULT_METADATA_COLLECTOR;
 
     final JdbcMetadataRepository repository() {
         return this.repository;
     }
 
-    /**
-     * Set the time in milliseconds that content returned from this source may used while in the cache.
-     * 
-     * @param cacheTimeToLive the time to live, in milliseconds; 0 if the time to live is not specified by this source; or a
-     *        negative number for the default value
-     */
-    public synchronized void setCacheTimeToLiveInMilliseconds( int cacheTimeToLive ) {
-        if (cacheTimeToLive < 0) cacheTimeToLive = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS;
-        this.cacheTimeToLiveInMilliseconds = cacheTimeToLive;
-        if (this.cacheTimeToLiveInMilliseconds == 0) {
-            this.cachePolicy = null;
-        } else {
-            final int ttl = this.cacheTimeToLiveInMilliseconds;
-            this.cachePolicy = new CachePolicy() {
-
-                private static final long serialVersionUID = 1L;
-
-                public long getTimeToLive() {
-                    return ttl;
-                }
-            };
-        }
-    }
-
-    public long getCacheTimeToLiveInMilliseconds() {
-        return this.cacheTimeToLiveInMilliseconds;
-    }
-
-    public CachePolicy getDefaultCachePolicy() {
-        return this.cachePolicy;
-    }
-
-    public RepositoryContext getRepositoryContext() {
-        return this.repositoryContext;
-    }
-
+    @Override
     public void close() {
         if (this.dataSource instanceof ComboPooledDataSource) {
             ((ComboPooledDataSource)this.dataSource).close();
@@ -299,51 +245,13 @@
         return new PathRepositoryConnection(this, repository);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.jboss.dna.graph.connector.RepositorySource#getName()
-     */
-    public String getName() {
-        return this.name;
-    }
-
-    public void setName( String name ) {
-        this.name = name;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.jboss.dna.graph.connector.RepositorySource#getRetryLimit()
-     */
-    public int getRetryLimit() {
-        return this.retryLimit;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.jboss.dna.graph.connector.RepositorySource#initialize(org.jboss.dna.graph.connector.RepositoryContext)
-     */
-    public void initialize( RepositoryContext context ) throws RepositorySourceException {
-        this.repositoryContext = context;
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.jboss.dna.graph.connector.RepositorySource#setRetryLimit(int)
-     */
-    public void setRetryLimit( int limit ) {
-        this.retryLimit = limit;
-
-    }
-
     public Reference getReference() {
         String className = getClass().getName();
         String factoryClassName = this.getClass().getName();
         Reference ref = new Reference(className, factoryClassName, null);
 
         ref.add(new StringRefAddr(SOURCE_NAME, getName()));
-        ref.add(new StringRefAddr(ROOT_NODE_UUID, getRootNodeUuid()));
+        ref.add(new StringRefAddr(ROOT_NODE_UUID, getRootNodeUuid().toString()));
         ref.add(new StringRefAddr(DATA_SOURCE_JNDI_NAME, getDataSourceJndiName()));
         ref.add(new StringRefAddr(USERNAME, getUsername()));
         ref.add(new StringRefAddr(PASSWORD, getPassword()));
@@ -359,7 +267,6 @@
                                   Integer.toString(getNumberOfConnectionsToAcquireAsNeeded())));
         ref.add(new StringRefAddr(IDLE_TIME_IN_SECONDS_BEFORE_TESTING_CONNECTIONS,
                                   Integer.toString(getIdleTimeInSecondsBeforeTestingConnections())));
-        ref.add(new StringRefAddr(CACHE_TIME_TO_LIVE_IN_MILLISECONDS, Long.toString(getCacheTimeToLiveInMilliseconds())));
         ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDefaultWorkspaceName()));
         ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
 
@@ -378,38 +285,28 @@
             return null;
         }
 
-        Map<String, String> values = new HashMap<String, String>();
-        Reference ref = (Reference)obj;
-        Enumeration<?> en = ref.getAll();
-        while (en.hasMoreElements()) {
-            RefAddr subref = (RefAddr)en.nextElement();
-            if (subref instanceof StringRefAddr) {
-                String key = subref.getType();
-                Object value = subref.getContent();
-                if (value != null) values.put(key, value.toString());
-            }
-        }
-        String sourceName = values.get(SOURCE_NAME);
-        String rootNodeUuid = values.get(ROOT_NODE_UUID);
-        String dataSourceJndiName = values.get(DATA_SOURCE_JNDI_NAME);
-        String username = values.get(USERNAME);
-        String password = values.get(PASSWORD);
-        String url = values.get(URL);
-        String driverClassName = values.get(DRIVER_CLASS_NAME);
-        String driverClassloaderName = values.get(DRIVER_CLASSLOADER_NAME);
-        String maxConnectionsInPool = values.get(MAXIMUM_CONNECTIONS_IN_POOL);
-        String minConnectionsInPool = values.get(MINIMUM_CONNECTIONS_IN_POOL);
-        String maxConnectionIdleTimeInSec = values.get(MAXIMUM_CONNECTION_IDLE_TIME_IN_SECONDS);
-        String maxSizeOfStatementCache = values.get(MAXIMUM_SIZE_OF_STATEMENT_CACHE);
-        String acquisitionIncrement = values.get(NUMBER_OF_CONNECTIONS_TO_BE_ACQUIRED_AS_NEEDED);
-        String idleTimeInSeconds = values.get(IDLE_TIME_IN_SECONDS_BEFORE_TESTING_CONNECTIONS);
-        String cacheTtlInMillis = values.get(CACHE_TIME_TO_LIVE_IN_MILLISECONDS);
-        String retryLimit = values.get(RETRY_LIMIT);
-        String defaultWorkspace = values.get(DEFAULT_WORKSPACE);
-        String defaultCatalogName = values.get(DEFAULT_CATALOG_NAME);
-        String defaultSchemaName = values.get(DEFAULT_SCHEMA_NAME);
-        String metadataCollectorClassName = values.get(METADATA_COLLECTOR_CLASS_NAME);
+        Map<String, Object> values = valuesFrom((Reference)obj);
 
+        String sourceName = (String)values.get(SOURCE_NAME);
+        String rootNodeUuid = (String)values.get(ROOT_NODE_UUID);
+        String dataSourceJndiName = (String)values.get(DATA_SOURCE_JNDI_NAME);
+        String username = (String)values.get(USERNAME);
+        String password = (String)values.get(PASSWORD);
+        String url = (String)values.get(URL);
+        String driverClassName = (String)values.get(DRIVER_CLASS_NAME);
+        String driverClassloaderName = (String)values.get(DRIVER_CLASSLOADER_NAME);
+        String maxConnectionsInPool = (String)values.get(MAXIMUM_CONNECTIONS_IN_POOL);
+        String minConnectionsInPool = (String)values.get(MINIMUM_CONNECTIONS_IN_POOL);
+        String maxConnectionIdleTimeInSec = (String)values.get(MAXIMUM_CONNECTION_IDLE_TIME_IN_SECONDS);
+        String maxSizeOfStatementCache = (String)values.get(MAXIMUM_SIZE_OF_STATEMENT_CACHE);
+        String acquisitionIncrement = (String)values.get(NUMBER_OF_CONNECTIONS_TO_BE_ACQUIRED_AS_NEEDED);
+        String idleTimeInSeconds = (String)values.get(IDLE_TIME_IN_SECONDS_BEFORE_TESTING_CONNECTIONS);
+        String retryLimit = (String)values.get(RETRY_LIMIT);
+        String defaultWorkspace = (String)values.get(DEFAULT_WORKSPACE);
+        String defaultCatalogName = (String)values.get(DEFAULT_CATALOG_NAME);
+        String defaultSchemaName = (String)values.get(DEFAULT_SCHEMA_NAME);
+        String metadataCollectorClassName = (String)values.get(METADATA_COLLECTOR_CLASS_NAME);
+
         // Create the source instance ...
         JdbcMetadataSource source = new JdbcMetadataSource();
         if (sourceName != null) source.setName(sourceName);
@@ -426,7 +323,6 @@
         if (maxSizeOfStatementCache != null) source.setMaximumSizeOfStatementCache(Integer.parseInt(maxSizeOfStatementCache));
         if (acquisitionIncrement != null) source.setNumberOfConnectionsToAcquireAsNeeded(Integer.parseInt(acquisitionIncrement));
         if (idleTimeInSeconds != null) source.setIdleTimeInSecondsBeforeTestingConnections(Integer.parseInt(idleTimeInSeconds));
-        if (cacheTtlInMillis != null) source.setCacheTimeToLiveInMilliseconds(Integer.parseInt(cacheTtlInMillis));
         if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
         if (defaultWorkspace != null) source.setDefaultWorkspaceName(defaultWorkspace);
         if (defaultCatalogName != null) source.setDefaultCatalogName(defaultCatalogName);
@@ -627,30 +523,6 @@
     }
 
     /**
-     * @return rootNodeUuid
-     */
-    public String getRootNodeUuid() {
-        return rootNodeUuid;
-    }
-
-    /**
-     * @return rootUuid
-     */
-    public UUID getRootUuid() {
-        return rootUuid;
-    }
-
-    /**
-     * @param rootNodeUuid Sets rootNodeUuid to the specified value.
-     * @throws IllegalArgumentException if the string value cannot be converted to UUID
-     */
-    public void setRootNodeUuid( String rootNodeUuid ) {
-        if (rootNodeUuid != null && rootNodeUuid.trim().length() == 0) rootNodeUuid = DEFAULT_ROOT_NODE_UUID;
-        this.rootUuid = UUID.fromString(rootNodeUuid);
-        this.rootNodeUuid = rootNodeUuid;
-    }
-
-    /**
      * Get the name of the default workspace.
      * 
      * @return the name of the workspace that should be used by default, or null if there is no default workspace
@@ -752,10 +624,6 @@
         return metadataCollector;
     }
 
-    public boolean areUpdatesAllowed() {
-        return false;
-    }
-
     /**
      * In-memory connectors aren't shared and cannot be loaded from external sources if updates are not allowed. Therefore, in
      * order to avoid setting up an in-memory connector that is permanently empty (presumably, not a desired outcome), all

Modified: trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepositoryTest.java
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepositoryTest.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/JdbcMetadataRepositoryTest.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -32,6 +32,7 @@
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Types;
 import java.util.Map;
 import java.util.Set;
@@ -101,8 +102,12 @@
         workspace = repository.getWorkspace(source.getDefaultWorkspaceName());
         assertThat(workspace, is(notNullValue()));
 
+        try {
         TestEnvironment.executeDdl(this.source.getDataSource(), "create.ddl", this);
+        } catch (SQLException se) {
 
+        }
+
         DataSource dataSource = source.getDataSource();
         Connection conn = dataSource.getConnection();
         DatabaseMetaData dmd = conn.getMetaData();

Modified: trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/TestEnvironment.java
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/TestEnvironment.java	2010-01-04 15:29:24 UTC (rev 1519)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/test/java/org/jboss/dna/connector/meta/jdbc/TestEnvironment.java	2010-01-04 15:33:19 UTC (rev 1520)
@@ -70,9 +70,6 @@
         value = properties.getProperty("jpaSource.maximumConnectionIdleTimeInSeconds");
         if (isValue(value)) source.setMaximumConnectionIdleTimeInSeconds(Integer.parseInt(value));
 
-        value = properties.getProperty("jpaSource.cacheTimeToLiveInMilliseconds");
-        if (isValue(value)) source.setCacheTimeToLiveInMilliseconds(Integer.parseInt(value));
-
         value = properties.getProperty("jpaSource.defaultWorkspaceName");
         if (isValue(value)) source.setDefaultWorkspaceName(value);
 


From dna-commits at lists.jboss.org  Mon Jan  4 14:10:53 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 14:10:53 -0500
Subject: [dna-commits] DNA SVN: r1521 - trunk/extensions/dna-search-lucene.
Message-ID: <201001041910.o04JArWb030072@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-04 14:10:52 -0500 (Mon, 04 Jan 2010)
New Revision: 1521

Modified:
   trunk/extensions/dna-search-lucene/
Log:
ignoring target directory in extensions/dna-search-lucene


Property changes on: trunk/extensions/dna-search-lucene
___________________________________________________________________
Name: svn:ignore
   + target



From dna-commits at lists.jboss.org  Mon Jan  4 15:11:45 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 15:11:45 -0500
Subject: [dna-commits] DNA SVN: r1522 - in
	trunk/dna-graph/src/main/java/org/jboss/dna/graph: request
	and 1 other directories.
Message-ID: <201001042011.o04KBjHi010525@svn01.web.mwc.hst.phx2.redhat.com>

Author: elvisisking
Date: 2010-01-04 15:11:45 -0500 (Mon, 04 Jan 2010)
New Revision: 1522

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/NetChangeObserver.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
Log:
DNA-549 Creating A New Property And Changing An Existing Property Should Have Different ChangeRequest Types: The request processor now sets the actual property on the UpdateValuesRequest. This property is used by the NetChangeObserver. Reviewed by Randall H.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/NetChangeObserver.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/NetChangeObserver.java	2010-01-04 19:10:52 UTC (rev 1521)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/NetChangeObserver.java	2010-01-04 20:11:45 UTC (rev 1522)
@@ -225,12 +225,18 @@
                 // the new location is a new node event
                 details.addEventType(ChangeType.NODE_ADDED);
             } else if (change instanceof UpdateValuesRequest) {
-                // TODO need to know if this is a new property
                 UpdateValuesRequest updateValuesRequest = (UpdateValuesRequest)change;
 
                 if (!updateValuesRequest.addedValues().isEmpty() || !updateValuesRequest.removedValues().isEmpty()) {
-                    details.addEventType(ChangeType.PROPERTY_CHANGED);
-                    // TODO need to set property like details.changeProperty(property);
+                    assert (updateValuesRequest.getActualProperty() != null);
+
+                    if (updateValuesRequest.isNewProperty()) {
+                        details.addEventType(ChangeType.PROPERTY_ADDED);
+                        details.addProperty(updateValuesRequest.getActualProperty());
+                    } else {
+                        details.addEventType(ChangeType.PROPERTY_CHANGED);
+                        details.changeProperty(updateValuesRequest.getActualProperty());
+                    }
                 } else if (details.getEventTypes().isEmpty()) {
                     // details was just created for this request and now it is not needed
                     deleteLocationDetails(workspace, location, detailsByLocationByWorkspace);

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java	2010-01-04 19:10:52 UTC (rev 1521)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UpdateValuesRequest.java	2010-01-04 20:11:45 UTC (rev 1522)
@@ -2,6 +2,7 @@
 
 import java.util.Collections;
 import java.util.List;
+import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.property.Name;
@@ -40,6 +41,7 @@
     private List<Object> actualAddedValues;
     private List<Object> actualRemovedValues;
     private boolean actualCreation;
+    private Property actualProperty;
 
     public UpdateValuesRequest( String workspaceName,
                                 Location on,
@@ -150,15 +152,29 @@
 
     /**
      * Record that the property did not exist prior to the processing of this request and was actually created by this request.
-     * This method must be called when processing the request, and the actual location must have a {@link Location#getPath() path}
-     * .
+     * This method must be called when processing the request, and the actual location must have a {@link Location#getPath() path}.
      * 
+     * @param property the property being created or updated (may not be <code>null</code>)
      * @param created true if the property was created by this request, or false if this request updated an existing property
      * @throws IllegalStateException if the request is frozen
+     * @throws IllegalArgumentException if the property is <code>null</code>
      */
-    public void setNewProperty( boolean created ) {
+    public void setActualProperty( Property property,
+                                   boolean created ) {
+        CheckArg.isNotNull(property, "property");
+        checkNotFrozen();
+        this.actualProperty = property;
         this.actualCreation = created;
     }
+    
+    /**
+     * Get the actual node property that was created or updated.
+     * 
+     * @return the actual property or <code>null</code> if the actual property was not set
+     */
+    public Property getActualProperty() {
+        return this.actualProperty;
+    }
 
     /**
      * Get the actual location of the node that was updated.
@@ -210,7 +226,11 @@
         UpdateValuesRequest request = new UpdateValuesRequest(workspaceName, actualLocation != null ? actualLocation : on,
                                                               propertyName, addedValues, removedValues);
         request.setActualLocation(actualLocation, actualAddedValues, actualRemovedValues);
-        request.setNewProperty(actualCreation);
+        
+        // don't call request.setActualProperty(Property, boolean) here as the actual property may have not been set
+        request.actualProperty = actualProperty;
+        request.actualCreation = actualCreation;
+        
         return request;
     }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2010-01-04 19:10:52 UTC (rev 1521)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2010-01-04 20:11:45 UTC (rev 1522)
@@ -822,13 +822,13 @@
         // Update the current values
         SetPropertyRequest setProperty = new SetPropertyRequest(on, workspaceName, newProperty);
         process(setProperty);
-        request.setNewProperty(setProperty.isNewProperty());
 
         if (setProperty.hasError()) {
             request.setError(setProperty.getError());
         } else {
-            // Set the actual location ...
+            // Set the actual location and property
             request.setActualLocation(setProperty.getActualLocationOfNode(), request.addedValues(), actualRemovedValues);
+            request.setActualProperty(newProperty, setProperty.isNewProperty());
         }
 
     }


From dna-commits at lists.jboss.org  Mon Jan  4 15:58:22 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 4 Jan 2010 15:58:22 -0500
Subject: [dna-commits] DNA SVN: r1523 - in trunk:
	dna-common/src/test/java/org/jboss/dna/common/util and 9
	other directories.
Message-ID: <201001042058.o04KwM7e015424@svn01.web.mwc.hst.phx2.redhat.com>

Author: elvisisking
Date: 2010-01-04 15:58:21 -0500 (Mon, 04 Jan 2010)
New Revision: 1523

Modified:
   trunk/dna-common/src/main/java/org/jboss/dna/common/util/ClassUtil.java
   trunk/dna-common/src/test/java/org/jboss/dna/common/util/HashCodeTest.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/IJcrConstants.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Status.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Utils.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/http/HttpClientConnection.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FileNode.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FolderNode.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/IJsonConstants.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonNode.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClient.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonUtils.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/RepositoryNode.java
   trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/ServerNode.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/StatusTest.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/UtilsTest.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/RepositoryTest.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/ServerTest.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/WorkspaceTest.java
   trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClientTest.java
Log:
DNA-619 Remove Eclipse IDE Comments That Denote A String Need Not Be Externalized: All //NON-NLS-x$ comments have been removed from the codebase.

Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/util/ClassUtil.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/ClassUtil.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/ClassUtil.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -94,7 +94,7 @@
     private static boolean addSeparator( boolean separatorNeeded,
                                          StringBuffer text ) {
         if (separatorNeeded) {
-            text.append(", "); //$NON-NLS-1$
+            text.append(", ");
         }
         return true;
     }
@@ -125,7 +125,7 @@
      */
     public static String nonPackageQualifiedName( final Class<?> clazz ) {
         // if (clazz == null) {
-        // throw new IllegalArgumentException(I18n.format(CommonI18n.mustNotBeNull, "Class")); //$NON-NLS-1$
+        // throw new IllegalArgumentException(I18n.format(CommonI18n.mustNotBeNull, "Class"));
         // }
         String name = clazz.getName();
         return name.substring(name.lastIndexOf('.') + 1);
@@ -138,7 +138,7 @@
      */
     public static String nonPackageQualifiedName( final Object object ) {
         // if (object == null) {
-        // throw new IllegalArgumentException(I18n.format(CommonI18n.mustNotBeNull, "Object")); //$NON-NLS-1$
+        // throw new IllegalArgumentException(I18n.format(CommonI18n.mustNotBeNull, "Object"));
         // }
         return nonPackageQualifiedName(object.getClass());
     }

Modified: trunk/dna-common/src/test/java/org/jboss/dna/common/util/HashCodeTest.java
===================================================================
--- trunk/dna-common/src/test/java/org/jboss/dna/common/util/HashCodeTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/dna-common/src/test/java/org/jboss/dna/common/util/HashCodeTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -59,7 +59,7 @@
     @Test
     public void shouldAcceptNullArguments() {
         assertThat(HashCode.compute((Object)null), is(0));
-        assertThat(HashCode.compute("abc", (Object)null), is(not(0))); //$NON-NLS-1$
+        assertThat(HashCode.compute("abc", (Object)null), is(not(0)));
     }
 
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -84,7 +84,7 @@
     public static final Name TYPE_DROP_SYNONYM_STATEMENT 			= new BasicName(Namespace.URI, "dropSynonymStatement");
     public static final Name TYPE_DROP_TRIGGER_STATEMENT 			= new BasicName(Namespace.URI, "dropTriggerStatement");
     
-    public static final Name UNIQUE_INDEX 			= new BasicName(Namespace.URI, "unique"); //$NON-NLS-1$
-    public static final Name TABLE_NAME 			= new BasicName(Namespace.URI, "tableName"); //$NON-NLS-1$
-    public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new BasicName(Namespace.URI, "generatedColumnSpecClause"); //$NON-NLS-1$
+    public static final Name UNIQUE_INDEX 			= new BasicName(Namespace.URI, "unique");
+    public static final Name TABLE_NAME 			= new BasicName(Namespace.URI, "tableName");
+    public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new BasicName(Namespace.URI, "generatedColumnSpecClause");
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -37,7 +37,7 @@
     }
 
     // MIXINS
-    public static final Name TYPE_BACKSLASH_TERMINATOR = new BasicName(Namespace.URI, "backslashTerminator"); //$NON-NLS-1$
+    public static final Name TYPE_BACKSLASH_TERMINATOR = new BasicName(Namespace.URI, "backslashTerminator");
     
     public static final Name TYPE_CREATE_CLUSTER_STATEMENT 			= new BasicName(Namespace.URI, "createIndexStatement");
     public static final Name TYPE_CREATE_CONTEXT_STATEMENT 			= new BasicName(Namespace.URI, "createContextStatement");
@@ -151,11 +151,11 @@
     public static final Name TYPE_RENAME_CONSTRAINT 				= new BasicName(Namespace.URI, "renameConstraint");
 
     // PROPERTY NAMES
-    public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType"); //$NON-NLS-1$
-    public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName"); //$NON-NLS-1$
-    public static final Name COMMENT = new BasicName(Namespace.URI, "comment"); //$NON-NLS-1$
-    public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique"); //$NON-NLS-1$
-    public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap"); //$NON-NLS-1$
-    public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName"); //$NON-NLS-1$
+    public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");
+    public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName");
+    public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
+    public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique");
+    public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap");
+    public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName");
 
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -138,7 +138,7 @@
     public static final Name SCHEMA_NAME 							= new BasicName(Namespace.URI, "schemaName");
     
     // PROPERTY NAMES
-    public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType"); //$NON-NLS-1$
-    public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName"); //$NON-NLS-1$
-    public static final Name COMMENT = new BasicName(Namespace.URI, "comment"); //$NON-NLS-1$
+    public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");
+    public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName");
+    public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
 }

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/IJcrConstants.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/IJcrConstants.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/IJcrConstants.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -31,41 +31,41 @@
     /**
      * The JCR content property name (<code>jcr:content</code>).
      */
-    String CONTENT_PROPERTY = "jcr:content"; //$NON-NLS-1$
+    String CONTENT_PROPERTY = "jcr:content";
 
     /**
      * The JCR data property name (<code>jcr:data</code>).
      */
-    String DATA_PROPERTY = "jcr:data/base64/"; //$NON-NLS-1$
+    String DATA_PROPERTY = "jcr:data/base64/";
 
     /**
      * The JCR file node type (<code>nt:file</code>).
      */
-    String FILE_NODE_TYPE = "nt:file"; //$NON-NLS-1$
+    String FILE_NODE_TYPE = "nt:file";
 
     /**
      * The JCR folder node type (<code>nt:folder</code>).
      */
-    String FOLDER_NODE_TYPE = "nt:folder"; //$NON-NLS-1$
+    String FOLDER_NODE_TYPE = "nt:folder";
 
     /**
      * The JCR data property name (<code>jcr:lastModified</code>).
      */
-    String LAST_MODIFIED = "jcr:lastModified"; //$NON-NLS-1$
+    String LAST_MODIFIED = "jcr:lastModified";
 
     /**
      * The JCR data property name (<code>jcr:lastModified</code>).
      */
-    String MIME_TYPE = "jcr:mimeType"; //$NON-NLS-1$
+    String MIME_TYPE = "jcr:mimeType";
 
     /**
      * The JCR primary type property name (<code>jcr:primaryType</code>).
      */
-    String PRIMARY_TYPE_PROPERTY = "jcr:primaryType"; //$NON-NLS-1$
+    String PRIMARY_TYPE_PROPERTY = "jcr:primaryType";
 
     /**
      * The JCR resource node type (<code>nt:resource</code>).
      */
-    String RESOURCE_NODE_TYPE = "nt:resource"; //$NON-NLS-1$
+    String RESOURCE_NODE_TYPE = "nt:resource";
 
 }

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Status.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Status.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Status.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -123,7 +123,7 @@
      * @return the status message (never <code>null</code> but can be empty)
      */
     public String getMessage() {
-        return ((this.message == null) ? "" : this.message); //$NON-NLS-1$
+        return ((this.message == null) ? "" : this.message);
     }
 
     /**
@@ -175,11 +175,11 @@
      */
     @Override
     public String toString() {
-        StringBuilder txt = new StringBuilder("Status "); //$NON-NLS-1$
-        txt.append(this.severity.toString()).append(": "); //$NON-NLS-1$
-        txt.append((getMessage().length() == 0) ? "<no message>" : getMessage()); //$NON-NLS-1$
-        txt.append(" : "); //$NON-NLS-1$
-        txt.append((getException() == null) ? "<no error>" : getException()); //$NON-NLS-1$
+        StringBuilder txt = new StringBuilder("Status ");
+        txt.append(this.severity.toString()).append(": ");
+        txt.append((getMessage().length() == 0) ? "<no message>" : getMessage());
+        txt.append(" : ");
+        txt.append((getException() == null) ? "<no error>" : getException());
         return txt.toString();
     }
 

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Utils.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Utils.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/Utils.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -68,7 +68,7 @@
     public static String getMimeType( File file ) {
         if (mimeTypeUtils == null) {
             // load custom extensions
-            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("org/jboss/dna/web/jcr/rest/client/mime.types"); //$NON-NLS-1$
+            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("org/jboss/dna/web/jcr/rest/client/mime.types");
             Map<String, String> customMap = MimeTypeUtil.load(stream, null);
 
             // construct
@@ -76,7 +76,7 @@
         }
 
         String mimeType = mimeTypeUtils.mimeTypeOf(file);
-        return ((mimeType == null) ? "application/octet-stream" : mimeType); //$NON-NLS-1$
+        return ((mimeType == null) ? "application/octet-stream" : mimeType);
     }
 
     // ===========================================================================================================================

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/http/HttpClientConnection.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/http/HttpClientConnection.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/http/HttpClientConnection.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -80,9 +80,9 @@
     public HttpClientConnection( Server server,
                                  URL url,
                                  RequestMethod method ) throws Exception {
-        CheckArg.isNotNull(server, "server"); //$NON-NLS-1$
-        CheckArg.isNotNull(url, "url"); //$NON-NLS-1$
-        CheckArg.isNotNull(method, "method"); //$NON-NLS-1$
+        CheckArg.isNotNull(server, "server");
+        CheckArg.isNotNull(url, "url");
+        CheckArg.isNotNull(method, "method");
 
         this.httpClient = new DefaultHttpClient();
         this.httpClient.getCredentialsProvider().setCredentials(new AuthScope(url.getHost(), url.getPort()),
@@ -149,7 +149,7 @@
      * @throws Exception if there is a problem writing to the connection
      */
     public void write( byte[] bytes ) throws Exception {
-        CheckArg.isNotNull(bytes, "bytes"); //$NON-NLS-1$
+        CheckArg.isNotNull(bytes, "bytes");
 
         ByteArrayEntity entity = new ByteArrayEntity(bytes);
         entity.setContentType(MediaType.APPLICATION_JSON);

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FileNode.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FileNode.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FileNode.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -78,8 +78,8 @@
                      File file ) throws Exception {
         super(file.getName());
 
-        CheckArg.isNotNull(workspace, "workspace"); //$NON-NLS-1$
-        CheckArg.isNotNull(path, "path"); //$NON-NLS-1$
+        CheckArg.isNotNull(workspace, "workspace");
+        CheckArg.isNotNull(path, "path");
 
         this.file = file;
         this.path = path;
@@ -106,8 +106,8 @@
         // add required jcr:lastModified property
         Calendar lastModified = Calendar.getInstance();
         lastModified.setTimeInMillis(file.lastModified());
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); //$NON-NLS-1$
-        formatter.setTimeZone(TimeZone.getTimeZone("GMT")); //$NON-NLS-1$
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
         properties.put(IJcrConstants.LAST_MODIFIED, formatter.format(lastModified.getTime()));
 
         // add required jcr:mimeType property (just use a default value)
@@ -143,7 +143,7 @@
      * @see #getFileContentsUrl()
      */
     String getFileContents( String jsonResponse ) throws Exception {
-        CheckArg.isNotNull(jsonResponse, "jsonResponse"); //$NON-NLS-1$
+        CheckArg.isNotNull(jsonResponse, "jsonResponse");
         JSONObject contentNode = new JSONObject(jsonResponse);
         JSONObject props = (JSONObject)contentNode.get(IJsonConstants.PROPERTIES_KEY);
         String encodedContents = props.getString(IJcrConstants.DATA_PROPERTY);

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FolderNode.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FolderNode.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/FolderNode.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -59,8 +59,8 @@
                        String fullPath ) throws Exception {
         super(fullPath);
 
-        CheckArg.isNotNull(workspace, "workspace"); //$NON-NLS-1$
-        CheckArg.isNotNull(fullPath, "fullPath"); //$NON-NLS-1$
+        CheckArg.isNotNull(workspace, "workspace");
+        CheckArg.isNotNull(fullPath, "fullPath");
 
         this.workspace = workspace;
 
@@ -96,12 +96,12 @@
         // make sure path starts with a '/'
         String path = getPath();
 
-        if (!path.startsWith("/")) { //$NON-NLS-1$
+        if (!path.startsWith("/")) {
             path = '/' + path;
         }
 
         // make sure path does NOT end with a '/'
-        if (path.endsWith("/")) { //$NON-NLS-1$
+        if (path.endsWith("/")) {
             path = path.substring(0, path.length() - 1);
         }
 

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/IJsonConstants.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/IJsonConstants.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/IJsonConstants.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -57,21 +57,21 @@
     /**
      * The key in the <code>JSONObject</code> whose value is the collection of node children.
      */
-    String CHILDREN_KEY = "children"; //$NON-NLS-1$
+    String CHILDREN_KEY = "children";
 
     /**
      * The key in the <code>JSONObject</code> whose value is the collection of node properties.
      */
-    String PROPERTIES_KEY = "properties"; //$NON-NLS-1$
+    String PROPERTIES_KEY = "properties";
 
     /**
      * The server context added to URLs.
      */
-    String SERVER_CONTEXT = "/resources"; //$NON-NLS-1$
+    String SERVER_CONTEXT = "/resources";
 
     /**
      * The workspace context added to the URLs.
      */
-    String WORKSPACE_CONTEXT = "/items"; //$NON-NLS-1$
+    String WORKSPACE_CONTEXT = "/items";
 
 }

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonNode.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonNode.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonNode.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -50,7 +50,7 @@
      * @param id the node identifier (never <code>null</code>)
      */
     protected JsonNode( String id ) {
-        CheckArg.isNotNull(id, "id"); //$NON-NLS-1$
+        CheckArg.isNotNull(id, "id");
         this.id = id;
     }
 
@@ -87,16 +87,16 @@
     @Override
     public String toString() {
         StringBuilder txt = new StringBuilder();
-        txt.append("ID: ").append(getId()); //$NON-NLS-1$
-        txt.append(", URL: "); //$NON-NLS-1$
+        txt.append("ID: ").append(getId());
+        txt.append(", URL: ");
 
         try {
             txt.append(getUrl());
         } catch (Exception e) {
-            txt.append("exception obtaining URL"); //$NON-NLS-1$
+            txt.append("exception obtaining URL");
         }
 
-        txt.append(", content: ").append(super.toString()); //$NON-NLS-1$
+        txt.append(", content: ").append(super.toString());
         return txt.toString();
     }
 

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClient.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClient.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClient.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -68,7 +68,7 @@
     private HttpClientConnection connect( Server server,
                                           URL url,
                                           RequestMethod method ) throws Exception {
-        this.logger.trace("connect: url={0}, method={1}", url, method); //$NON-NLS-1$
+        this.logger.trace("connect: url={0}, method={1}", url, method);
         return new HttpClientConnection(server, url, method);
     }
 
@@ -83,12 +83,12 @@
     private void createFileNode( Workspace workspace,
                                  String path,
                                  File file ) throws Exception {
-        this.logger.trace("createFileNode: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath()); //$NON-NLS-1$
+        this.logger.trace("createFileNode: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath());
         FileNode fileNode = new FileNode(workspace, path, file);
         HttpClientConnection connection = connect(workspace.getServer(), fileNode.getUrl(), RequestMethod.POST);
 
         try {
-            this.logger.trace("createFileNode: create node={0}", fileNode); //$NON-NLS-1$
+            this.logger.trace("createFileNode: create node={0}", fileNode);
             connection.write(fileNode.getContent());
 
             // make sure node was created
@@ -96,13 +96,13 @@
 
             if (responseCode != HttpURLConnection.HTTP_CREATED) {
                 // node was not created
-                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "createFileNode"); //$NON-NLS-1$
+                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "createFileNode");
                 String msg = RestClientI18n.createFileFailedMsg.text(file.getName(), path, workspace.getName(), responseCode);
                 throw new RuntimeException(msg);
             }
         } finally {
             if (connection != null) {
-                this.logger.trace("createFileNode: leaving"); //$NON-NLS-1$
+                this.logger.trace("createFileNode: leaving");
                 connection.disconnect();
             }
         }
@@ -117,12 +117,12 @@
      */
     private void createFolderNode( Workspace workspace,
                                    String path ) throws Exception {
-        this.logger.trace("createFolderNode: workspace={0}, path={1}", workspace.getName(), path); //$NON-NLS-1$
+        this.logger.trace("createFolderNode: workspace={0}, path={1}", workspace.getName(), path);
         FolderNode folderNode = new FolderNode(workspace, path);
         HttpClientConnection connection = connect(workspace.getServer(), folderNode.getUrl(), RequestMethod.POST);
 
         try {
-            this.logger.trace("createFolderNode: create node={0}", folderNode); //$NON-NLS-1$
+            this.logger.trace("createFolderNode: create node={0}", folderNode);
             connection.write(folderNode.getContent());
 
             // make sure node was created
@@ -130,13 +130,13 @@
 
             if (responseCode != HttpURLConnection.HTTP_CREATED) {
                 // node was not created
-                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "createFolderNode"); //$NON-NLS-1$
+                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "createFolderNode");
                 String msg = RestClientI18n.createFolderFailedMsg.text(path, workspace.getName(), responseCode);
                 throw new RuntimeException(msg);
             }
         } finally {
             if (connection != null) {
-                this.logger.trace("createFolderNode: leaving"); //$NON-NLS-1$
+                this.logger.trace("createFolderNode: leaving");
                 connection.disconnect();
             }
         }
@@ -151,7 +151,7 @@
      */
     private void ensureFolderExists( Workspace workspace,
                                      String folderPath ) throws Exception {
-        this.logger.trace("ensureFolderExists: workspace={0}, path={1}", workspace.getName(), folderPath); //$NON-NLS-1$
+        this.logger.trace("ensureFolderExists: workspace={0}, path={1}", workspace.getName(), folderPath);
         FolderNode folderNode = new FolderNode(workspace, folderPath);
 
         if (!pathExists(workspace.getServer(), folderNode.getUrl())) {
@@ -189,8 +189,8 @@
      * @see org.jboss.dna.web.jcr.rest.client.IRestClient#getRepositories(org.jboss.dna.web.jcr.rest.client.domain.Server)
      */
     public Collection<Repository> getRepositories( Server server ) throws Exception {
-        CheckArg.isNotNull(server, "server"); //$NON-NLS-1$
-        this.logger.trace("getRepositories: server={0}", server); //$NON-NLS-1$
+        CheckArg.isNotNull(server, "server");
+        this.logger.trace("getRepositories: server={0}", server);
 
         ServerNode serverNode = new ServerNode(server);
         HttpClientConnection connection = connect(server, serverNode.getFindRepositoriesUrl(), RequestMethod.GET);
@@ -203,12 +203,12 @@
             }
 
             // not a good response code
-            this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "getRepositories"); //$NON-NLS-1$
+            this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "getRepositories");
             String msg = RestClientI18n.getRepositoriesFailedMsg.text(server.getName(), responseCode);
             throw new RuntimeException(msg);
         } finally {
             if (connection != null) {
-                this.logger.trace("getRepositories: leaving"); //$NON-NLS-1$
+                this.logger.trace("getRepositories: leaving");
                 connection.disconnect();
             }
         }
@@ -223,9 +223,9 @@
     public URL getUrl( File file,
                        String path,
                        Workspace workspace ) throws Exception {
-        CheckArg.isNotNull(file, "file"); //$NON-NLS-1$
-        CheckArg.isNotNull(path, "path"); //$NON-NLS-1$
-        CheckArg.isNotNull(workspace, "workspace"); //$NON-NLS-1$
+        CheckArg.isNotNull(file, "file");
+        CheckArg.isNotNull(path, "path");
+        CheckArg.isNotNull(workspace, "workspace");
 
         // can't be a directory
         if (file.isDirectory()) {
@@ -241,8 +241,8 @@
      * @see org.jboss.dna.web.jcr.rest.client.IRestClient#getWorkspaces(org.jboss.dna.web.jcr.rest.client.domain.Repository)
      */
     public Collection<Workspace> getWorkspaces( Repository repository ) throws Exception {
-        CheckArg.isNotNull(repository, "repository"); //$NON-NLS-1$
-        this.logger.trace("getWorkspaces: repository={0}", repository); //$NON-NLS-1$
+        CheckArg.isNotNull(repository, "repository");
+        this.logger.trace("getWorkspaces: repository={0}", repository);
 
         RepositoryNode repositoryNode = new RepositoryNode(repository);
         HttpClientConnection connection = connect(repository.getServer(), repositoryNode.getUrl(), RequestMethod.GET);
@@ -255,14 +255,14 @@
             }
 
             // not a good response code
-            this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "getWorkspaces"); //$NON-NLS-1$
+            this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "getWorkspaces");
             String msg = RestClientI18n.getWorkspacesFailedMsg.text(repository.getName(),
                                                                     repository.getServer().getName(),
                                                                     responseCode);
             throw new RuntimeException(msg);
         } finally {
             if (connection != null) {
-                this.logger.trace("getWorkspaces: leaving"); //$NON-NLS-1$
+                this.logger.trace("getWorkspaces: leaving");
                 connection.disconnect();
             }
         }
@@ -300,16 +300,16 @@
      */
     private boolean pathExists( Server server,
                                 URL url ) throws Exception {
-        this.logger.trace("pathExists: url={0}", url); //$NON-NLS-1$
+        this.logger.trace("pathExists: url={0}", url);
         HttpClientConnection connection = connect(server, url, RequestMethod.GET);
 
         try {
             int responseCode = connection.getResponseCode();
-            this.logger.trace("pathExists: responseCode={0}", responseCode); //$NON-NLS-1$
+            this.logger.trace("pathExists: responseCode={0}", responseCode);
             return (responseCode == HttpURLConnection.HTTP_OK);
         } finally {
             if (connection != null) {
-                this.logger.trace("pathExists: leaving"); //$NON-NLS-1$
+                this.logger.trace("pathExists: leaving");
                 connection.disconnect();
             }
         }
@@ -338,10 +338,10 @@
     public Status publish( Workspace workspace,
                            String path,
                            File file ) {
-        CheckArg.isNotNull(workspace, "workspace"); //$NON-NLS-1$
-        CheckArg.isNotNull(path, "path"); //$NON-NLS-1$
-        CheckArg.isNotNull(file, "file"); //$NON-NLS-1$
-        this.logger.trace("publish: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath()); //$NON-NLS-1$
+        CheckArg.isNotNull(workspace, "workspace");
+        CheckArg.isNotNull(path, "path");
+        CheckArg.isNotNull(file, "file");
+        this.logger.trace("publish: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath());
 
         try {
             // first delete if file exists at that path
@@ -371,10 +371,10 @@
     public Status unpublish( Workspace workspace,
                              String path,
                              File file ) {
-        CheckArg.isNotNull(workspace, "workspace"); //$NON-NLS-1$
-        CheckArg.isNotNull(path, "path"); //$NON-NLS-1$
-        CheckArg.isNotNull(file, "file"); //$NON-NLS-1$
-        this.logger.trace("unpublish: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath()); //$NON-NLS-1$
+        CheckArg.isNotNull(workspace, "workspace");
+        CheckArg.isNotNull(path, "path");
+        CheckArg.isNotNull(file, "file");
+        this.logger.trace("unpublish: workspace={0}, path={1}, file={2}", workspace.getName(), path, file.getAbsolutePath());
 
         HttpClientConnection connection = null;
 
@@ -382,7 +382,7 @@
             FileNode fileNode = new FileNode(workspace, path, file);
             connection = connect(workspace.getServer(), fileNode.getUrl(), RequestMethod.DELETE);
             int responseCode = connection.getResponseCode();
-            this.logger.trace("responseCode={0}", responseCode); //$NON-NLS-1$
+            this.logger.trace("responseCode={0}", responseCode);
 
             if (responseCode != HttpURLConnection.HTTP_NO_CONTENT) {
                 // check to see if the file was never published
@@ -392,7 +392,7 @@
                 }
 
                 // unexpected result
-                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "unpublish"); //$NON-NLS-1$
+                this.logger.error(RestClientI18n.connectionErrorMsg, responseCode, "unpublish");
                 String msg = RestClientI18n.unpublishFailedMsg.text(file.getName(), workspace.getName(), path);
                 throw new RuntimeException(msg);
             }
@@ -403,7 +403,7 @@
             return new Status(Severity.ERROR, msg, e);
         } finally {
             if (connection != null) {
-                this.logger.trace("unpublish: leaving"); //$NON-NLS-1$
+                this.logger.trace("unpublish: leaving");
                 connection.disconnect();
             }
         }

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonUtils.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonUtils.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/JsonUtils.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -43,7 +43,7 @@
     /**
      * The default character set being used.
      */
-    private static final String DEFAULT_CHARSET = "UTF-8"; //$NON-NLS-1$ // TODO need to property drive charset
+    private static final String DEFAULT_CHARSET = "UTF-8"; // TODO need to property drive charset
 
     // ===========================================================================================================================
     // Class Methods
@@ -55,7 +55,7 @@
      * @throws UnsupportedEncodingException if the charset is not supported
      */
     public static String decode( String text ) throws UnsupportedEncodingException {
-        CheckArg.isNotNull(text, "text"); //$NON-NLS-1$
+        CheckArg.isNotNull(text, "text");
         return URLDecoder.decode(text, DEFAULT_CHARSET);
     }
 
@@ -67,7 +67,7 @@
      * @throws UnsupportedEncodingException if the charset is not supported
      */
     public static String encode( String text ) throws UnsupportedEncodingException {
-        CheckArg.isNotNull(text, "text"); //$NON-NLS-1$
+        CheckArg.isNotNull(text, "text");
 
         // don't encode '/' as it needs to stay that way in the URL
         StringBuilder encoded = new StringBuilder();
@@ -87,7 +87,7 @@
      * @throws IOException if there is a problem reading from the connection
      */
     public static String readInputStream( HttpURLConnection connection ) throws IOException {
-        CheckArg.isNotNull(connection, "connection"); //$NON-NLS-1$
+        CheckArg.isNotNull(connection, "connection");
 
         InputStream stream = connection.getInputStream();
         int bytesRead;

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/RepositoryNode.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/RepositoryNode.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/RepositoryNode.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -87,7 +87,7 @@
      */
     @SuppressWarnings( "unchecked" )
     public Collection<Workspace> getWorkspaces( String jsonResponse ) throws Exception {
-        CheckArg.isNotNull(jsonResponse, "jsonResponse"); //$NON-NLS-1$
+        CheckArg.isNotNull(jsonResponse, "jsonResponse");
         Collection<Workspace> workspaces = new ArrayList<Workspace>();
         JSONObject jsonObj = new JSONObject(jsonResponse);
 

Modified: trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/ServerNode.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/ServerNode.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/main/java/org/jboss/dna/web/jcr/rest/client/json/ServerNode.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -81,13 +81,12 @@
         StringBuilder url = new StringBuilder(this.server.getUrl());
 
         // strip off last '/' if necessary
-        if (url.lastIndexOf("/") == (url.length() - 1)) { //$NON-NLS-1$
+        if (url.lastIndexOf("/") == (url.length() - 1)) {
             url.delete((url.length() - 1), (url.length() - 1));
         }
 
-        // append server context and insert user
+        // append server context
         url.append(IJsonConstants.SERVER_CONTEXT);
-        //        url.insert(url.indexOf(":") + 1, this.server.getUser() + '@'); //$NON-NLS-1$
 
         return new URL(url.toString());
     }
@@ -107,9 +106,9 @@
      */
     @SuppressWarnings( "unchecked" )
     public Collection<Repository> getRepositories( String jsonResponse ) throws Exception {
-        CheckArg.isNotNull(jsonResponse, "jsonResponse"); //$NON-NLS-1$
+        CheckArg.isNotNull(jsonResponse, "jsonResponse");
         Collection<Repository> repositories = new ArrayList<Repository>();
-        this.logger.trace("getRepositories:jsonResponse={0}", jsonResponse); //$NON-NLS-1$
+        this.logger.trace("getRepositories:jsonResponse={0}", jsonResponse);
         JSONObject jsonObj = new JSONObject(jsonResponse);
 
         // keys are the repository names
@@ -117,7 +116,7 @@
             String name = JsonUtils.decode(itr.next());
             Repository repository = new Repository(name, this.server);
             repositories.add(repository);
-            this.logger.trace("getRepositories: adding repository={0}", repository); //$NON-NLS-1$
+            this.logger.trace("getRepositories: adding repository={0}", repository);
         }
 
         return repositories;

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/StatusTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/StatusTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/StatusTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -126,17 +126,17 @@
 
     @Test
     public void shouldBeAbleToPrintWithMessageAndNullException() {
-        new Status(Severity.WARNING, "the message goes here", null).toString(); //$NON-NLS-1$
+        new Status(Severity.WARNING, "the message goes here", null).toString();
     }
 
     @Test
     public void shouldBeAbleToPrintWithMessageAndException() {
-        new Status(Severity.WARNING, "the message goes here", new RuntimeException("exception message")).toString(); //$NON-NLS-1$ //$NON-NLS-2$
+        new Status(Severity.WARNING, "the message goes here", new RuntimeException("exception message")).toString();
     }
 
     @Test
     public void shouldBeAbleToPrintWithNullMessageAndException() {
-        new Status(Severity.WARNING, null, new RuntimeException("exception message")).toString(); //$NON-NLS-1$
+        new Status(Severity.WARNING, null, new RuntimeException("exception message")).toString();
     }
 
     @Test

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/UtilsTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/UtilsTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/UtilsTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -55,7 +55,7 @@
     @Test
     public void shouldHaveCorrectMimetypeForEclipseTextFiles() {
         for (String extension : TEXT_EXTENSIONS) {
-            String mimetype = Utils.getMimeType(new File('.' + extension)); //$NON-NLS-1$
+            String mimetype = Utils.getMimeType(new File('.' + extension));
             assertThat(mimetype, is(TEXT_MIMETYPE));
         }
     }

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/RepositoryTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/RepositoryTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/RepositoryTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -40,13 +40,13 @@
     // Constants
     // ===========================================================================================================================
 
-    private static final String NAME1 = "name1"; //$NON-NLS-1$
+    private static final String NAME1 = "name1";
 
-    private static final String NAME2 = "name2"; //$NON-NLS-1$
+    private static final String NAME2 = "name2";
 
-    private static final Server SERVER1 = new Server("file:/tmp/temp.txt", "user", "pswd"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    private static final Server SERVER1 = new Server("file:/tmp/temp.txt", "user", "pswd");
 
-    private static final Server SERVER2 = new Server("http:www.redhat.com", "user", "pswd"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    private static final Server SERVER2 = new Server("http:www.redhat.com", "user", "pswd");
 
     private static final Repository REPOSITORY1 = new Repository(NAME1, SERVER1);
 

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/ServerTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/ServerTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/ServerTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -40,14 +40,14 @@
     // Constants
     // ===========================================================================================================================
 
-    private static final String URL1 = "file:/tmp/temp.txt"; //$NON-NLS-1$
-    private static final String URL2 = "http:www.redhat.com"; //$NON-NLS-1$
+    private static final String URL1 = "file:/tmp/temp.txt";
+    private static final String URL2 = "http:www.redhat.com";
 
-    private static final String USER1 = "user1"; //$NON-NLS-1$
-    private static final String USER2 = "user2"; //$NON-NLS-1$
+    private static final String USER1 = "user1";
+    private static final String USER2 = "user2";
 
-    private static final String PSWD1 = "pwsd1"; //$NON-NLS-1$
-    private static final String PSWD2 = "pwsd2"; //$NON-NLS-1$
+    private static final String PSWD1 = "pwsd1";
+    private static final String PSWD2 = "pwsd2";
 
     private static Server SERVER1 = new Server(URL1, USER1, PSWD1);
 

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/WorkspaceTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/WorkspaceTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/domain/WorkspaceTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -40,13 +40,13 @@
     // Constants
     // ===========================================================================================================================
 
-    private static final String NAME1 = "name1"; //$NON-NLS-1$
+    private static final String NAME1 = "name1";
 
-    private static final String NAME2 = "name2"; //$NON-NLS-1$
+    private static final String NAME2 = "name2";
 
-    private static final Server SERVER1 = new Server("file:/tmp/temp.txt", "user", "pswd"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    private static final Server SERVER1 = new Server("file:/tmp/temp.txt", "user", "pswd");
 
-    private static final Server SERVER2 = new Server("http:www.redhat.com", "user", "pswd"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    private static final Server SERVER2 = new Server("http:www.redhat.com", "user", "pswd");
 
     private static final Repository REPOSITORY1 = new Repository(NAME1, SERVER1);
 

Modified: trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClientTest.java
===================================================================
--- trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClientTest.java	2010-01-04 20:11:45 UTC (rev 1522)
+++ trunk/web/dna-web-jcr-rest-client/src/test/java/org/jboss/dna/web/jcr/rest/client/json/JsonRestClientTest.java	2010-01-04 20:58:21 UTC (rev 1523)
@@ -52,21 +52,21 @@
     // ===========================================================================================================================
 
     // user and password configured in pom
-    private static final String PSWD = "password"; //$NON-NLS-1$
-    private static final String USER = "dnauser"; //$NON-NLS-1$
+    private static final String PSWD = "password";
+    private static final String USER = "dnauser";
 
-    private static final Server SERVER = new Server("http://localhost:8080", USER, PSWD); //$NON-NLS-1$
-    private static final String REPOSITORY_NAME = "dna:repository"; //$NON-NLS-1$
+    private static final Server SERVER = new Server("http://localhost:8080", USER, PSWD);
+    private static final String REPOSITORY_NAME = "dna:repository";
     private static final Repository REPOSITORY1 = new Repository(REPOSITORY_NAME, SERVER);
-    private static final String WORKSPACE_NAME = "default"; //$NON-NLS-1$
+    private static final String WORKSPACE_NAME = "default";
     private static final Workspace WORKSPACE1 = new Workspace(WORKSPACE_NAME, REPOSITORY1);
 
-    private static final String WORKSPACE_PATH = "/myproject/myfolder/"; //$NON-NLS-1$
-    private static final String FILE_PATH = WORKSPACE_PATH + "document.txt"; //$NON-NLS-1$
-    private static final String BINARY_FILE_PATH = WORKSPACE_PATH + "picture.jpg"; //$NON-NLS-1$
+    private static final String WORKSPACE_PATH = "/myproject/myfolder/";
+    private static final String FILE_PATH = WORKSPACE_PATH + "document.txt";
+    private static final String BINARY_FILE_PATH = WORKSPACE_PATH + "picture.jpg";
 
-    private static final String WORKSPACE_UNUSUALPATH = "/myproject/My.Test - Folder/"; //$NON-NLS-1$
-    private static final String FILE_UNUSUALPATH = WORKSPACE_UNUSUALPATH + "Test File_.a-().txt"; //$NON-NLS-1$
+    private static final String WORKSPACE_UNUSUALPATH = "/myproject/My.Test - Folder/";
+    private static final String FILE_UNUSUALPATH = WORKSPACE_UNUSUALPATH + "Test File_.a-().txt";
 
     // ===========================================================================================================================
     // Fields
@@ -103,7 +103,7 @@
 
     @Test
     public void shouldNotUnpublishNonexistentFile() throws Exception {
-        File file = new File("bogusfile"); //$NON-NLS-1$
+        File file = new File("bogusfile");
         Status status = this.restClient.unpublish(WORKSPACE1, WORKSPACE_PATH, file);
 
         if (status.isError()) {


From dna-commits at lists.jboss.org  Tue Jan  5 07:43:27 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 07:43:27 -0500
Subject: [dna-commits] DNA SVN: r1524 - in trunk:
	extensions/dna-connector-svn and 7 other directories.
Message-ID: <201001051243.o05ChRg2003389@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 07:43:25 -0500 (Tue, 05 Jan 2010)
New Revision: 1524

Added:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2/
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java
Removed:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/RepositoryAccessData.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNActionExecutor.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNProtocol.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnection.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryLexicon.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositorySource.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
   trunk/extensions/dna-connector-svn/pom.xml
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2/SVNRepositoryConnectorI18n.properties
Log:
DNA-519

Applied patch that has passed Serge's review.  This will be committed in two parts to work around case sensitivity issues on Windows.  In the first part, this patch will be applied and all files will move into an svn2 package with the class name case corrected from SVN* to Svn*.  A subsequent patch will move the classes back into the svn package.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -31,7 +31,7 @@
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.Session;
-import org.jboss.dna.connector.svn.SVNRepositorySource;
+import org.jboss.dna.connector.svn2.SvnRepositorySource;
 import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrEngine;
@@ -56,15 +56,16 @@
         final String repositoryName = "svnRepository";
         final JcrConfiguration configuration = new JcrConfiguration();
         configuration.repositorySource(svnRepositorySource)
-                     .usingClass(SVNRepositorySource.class)
+                     .usingClass(SvnRepositorySource.class)
                      .setProperty("password", "")
                      .setProperty("username", "anonymous")
-                     .setProperty("repositoryRootURL", repositoryUrl)
+                     .setProperty("repositoryRootUrl", repositoryUrl)
                      .setProperty("predefinedWorkspaceNames", predefinedWorkspaceNames)
                      .setProperty("directoryForDefaultWorkspace", predefinedWorkspaceNames[0])
                      .setProperty("creatingWorkspacesAllowed", false);
 
-        configuration.repository(repositoryName).setSource(svnRepositorySource).setOption(Option.READ_DEPTH, "1");
+        configuration.repository(repositoryName).setSource(svnRepositorySource).setOption(Option.QUERY_EXECUTION_ENABLED, "false");
+
         configuration.save();
         this.engine = configuration.build();
         this.engine.start();
@@ -107,6 +108,19 @@
         }
     }
 
+    @Test
+    public void shouldProvideAccessToJcrDataNodeUnderDeepFileNode() throws Exception {
+        String path = "extensions/dna-sequencer-text/src/test/resources/delimited/multiLineCommaDelimitedFile.csv/jcr:content";
+        System.out.println("Getting " + path + " and then walking its properties ...");
+        Node resourceNodeOfPomFile = this.session.getRootNode().getNode(path);
+        assertThat(resourceNodeOfPomFile, is(notNullValue()));
+
+        for (PropertyIterator iter = resourceNodeOfPomFile.getProperties(); iter.hasNext();) {
+            Property property = iter.nextProperty();
+            assertThat(property.getName(), is(notNullValue()));
+        }
+    }
+
     protected class MyCustomSecurityContext implements SecurityContext {
         /**
          * {@inheritDoc}

Modified: trunk/extensions/dna-connector-svn/pom.xml
===================================================================
--- trunk/extensions/dna-connector-svn/pom.xml	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/pom.xml	2010-01-05 12:43:25 UTC (rev 1524)
@@ -51,6 +51,11 @@
 			<artifactId>svnkit</artifactId>
 			<version>1.3.0.5847</version>
 		</dependency>
+		<dependency>
+			<groupId>com.sun.jna</groupId>
+			<artifactId>jna</artifactId>
+			<version>3.0.9</version>
+		</dependency>
 		<!-- 
 			Testing (note the scope)
 		-->

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/RepositoryAccessData.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/RepositoryAccessData.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/RepositoryAccessData.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,49 +0,0 @@
-/**
- * 
- */
-package org.jboss.dna.connector.svn;
-
-import net.jcip.annotations.ThreadSafe;
-
- at ThreadSafe
-public class RepositoryAccessData {
-
-    
-    private String repositoryRootUrl;
-    private String username;
-    private String password;
-
-    /**
-     * @param password
-     * @param username
-     * @param repositoryRootUrl
-     */
-    public RepositoryAccessData( String repositoryRootUrl,
-                           String username,
-                           String password ) {
-        this.repositoryRootUrl = repositoryRootUrl;
-        this.username = username;
-        this.password = password;
-    }
-
-    /**
-     * @return the repositoryRootUrl
-     */
-    public String getRepositoryRootUrl() {
-        return repositoryRootUrl;
-    }
-
-    /**
-     * @return the username
-     */
-    public String getUsername() {
-        return username;
-    }
-
-    /**
-     * @return the password
-     */
-    public String getPassword() {
-        return password;
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNActionExecutor.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNActionExecutor.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNActionExecutor.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,73 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import org.jboss.dna.connector.scm.ScmAction;
-import org.jboss.dna.connector.scm.ScmActionExecutor;
-import org.tmatesoft.svn.core.SVNErrorCode;
-import org.tmatesoft.svn.core.SVNErrorMessage;
-import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.io.ISVNEditor;
-import org.tmatesoft.svn.core.io.SVNRepository;
-
-/**
- */
-public class SVNActionExecutor implements ScmActionExecutor {
-
-    private SVNRepository repository;
-
-    /**
-     * @param repository
-     */
-    public SVNActionExecutor( SVNRepository repository ) {
-        this.repository = repository;
-    }
-
-    /**
-     * @return repository
-     */
-    public SVNRepository getRepository() {
-        return repository;
-    }
-
-    /**
-     * @param action
-     * @param message
-     * @throws SVNException
-     */
-    public void execute( ScmAction action,
-                         String message ) throws SVNException {
-        ISVNEditor editor = this.repository.getCommitEditor(message, null);
-        editor.openRoot(-1);
-        try {
-            action.applyAction(editor);
-        } catch (Exception e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: '{0}'", e.getMessage());
-            throw new SVNException(err);
-        }
-        editor.closeDir();
-        editor.closeEdit();
-
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNProtocol.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNProtocol.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNProtocol.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,44 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-/**
- */
-public enum SVNProtocol {
-    FILE("file"),
-    SVN("svn"),
-    SVN_SSH("svn+ssh"),
-    HTTP("http"),
-    HTTPS("https");
-
-    SVNProtocol( String value ) {
-        this.value = value;
-    }
-
-    private final String value;
-
-    public String value() {
-        return value;
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnection.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnection.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnection.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,186 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import javax.transaction.xa.XAResource;
-import org.jboss.dna.common.util.CheckArg;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.cache.CachePolicy;
-import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.request.Request;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-import org.tmatesoft.svn.core.SVNErrorCode;
-import org.tmatesoft.svn.core.SVNErrorMessage;
-import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.SVNNodeKind;
-import org.tmatesoft.svn.core.io.SVNRepository;
-
-/**
- * The defaultRepository connection to a SVN Repository instance.
- */
-public class SVNRepositoryConnection implements RepositoryConnection {
-
-    private final String sourceName;
-    private final CachePolicy cachePolicy;
-    private final SVNRepository defaultWorkspace;
-    private final boolean updatesAllowed;
-    private final Set<String> availableWorkspaceNames;
-    private final boolean creatingWorkspacesAllowed;
-    private final RepositoryAccessData accessData;
-
-    /**
-     * default workspace must can be a root repository or any folders from the root directory. available workspace names must
-     * consist of URLs from repository folders.
-     * 
-     * @param sourceName
-     * @param defaultWorkspace
-     * @param availableWorkspaceNames
-     * @param creatingWorkspacesAllowed
-     * @param cachePolicy
-     * @param updatesAllowed
-     * @param accessData
-     */
-    public SVNRepositoryConnection( String sourceName,
-                                    SVNRepository defaultWorkspace,
-                                    Set<String> availableWorkspaceNames,
-                                    boolean creatingWorkspacesAllowed,
-                                    CachePolicy cachePolicy,
-                                    boolean updatesAllowed,
-                                    RepositoryAccessData accessData ) {
-
-        CheckArg.isNotNull(defaultWorkspace, "defaultWorkspace");
-        CheckArg.isNotEmpty(sourceName, "sourceName");
-        assert availableWorkspaceNames != null;
-        assert accessData != null;
-
-        // Check if the default workspace is a folder.
-        SVNNodeKind nodeKind = null;
-        try {
-            nodeKind = defaultWorkspace.checkPath("", -1);
-            if (nodeKind == SVNNodeKind.NONE) {
-                SVNErrorMessage error = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                               "No entry at URL ''{0}''",
-                                                               defaultWorkspace.getLocation().getPath());
-                throw new SVNException(error);
-            } else if (nodeKind == SVNNodeKind.UNKNOWN) {
-                SVNErrorMessage error = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                               "Entry at URL ''{0}'' is a file while directory was expected",
-                                                               defaultWorkspace.getLocation().getPath());
-                throw new SVNException(error);
-            } else if (nodeKind == SVNNodeKind.FILE) {
-                SVNErrorMessage error = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                               "Entry at URL ''{0}'' is a file while directory was expected",
-                                                               defaultWorkspace.getLocation().getPath());
-                throw new SVNException(error);
-            }
-        } catch (SVNException e) {
-            // deal with the exception
-            throw new RuntimeException(e);
-        }
-
-        this.sourceName = sourceName;
-        this.cachePolicy = cachePolicy;
-        this.defaultWorkspace = defaultWorkspace;
-        this.updatesAllowed = updatesAllowed;
-        this.availableWorkspaceNames = availableWorkspaceNames;
-        this.creatingWorkspacesAllowed = creatingWorkspacesAllowed;
-        this.accessData = accessData;
-    }
-
-    SVNRepository getDefaultWorkspace() {
-        return defaultWorkspace;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getSourceName() {
-        return sourceName;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public CachePolicy getDefaultCachePolicy() {
-        return cachePolicy;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public XAResource getXAResource() {
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean ping( long time,
-                         TimeUnit unit ) {
-        try {
-            this.defaultWorkspace.getRepositoryRoot(true);
-        } catch (SVNException e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositoryConnection#close()
-     */
-    public void close() {
-        // do not care about.
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositoryConnection#execute(org.jboss.dna.graph.ExecutionContext,
-     *      org.jboss.dna.graph.request.Request)
-     */
-    public void execute( final ExecutionContext context,
-                         final Request request ) throws RepositorySourceException {
-
-        RequestProcessor processor = new SVNRepositoryRequestProcessor(sourceName, defaultWorkspace, availableWorkspaceNames,
-                                                                       creatingWorkspacesAllowed, context, updatesAllowed,
-                                                                       accessData);
-        try {
-            processor.process(request);
-        } finally {
-            processor.close();
-        }
-    }
-
-    /**
-     * @return the accessData
-     */
-    public RepositoryAccessData getAccessData() {
-        return accessData;
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,89 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
-* See the AUTHORS.txt file in the distribution for a full listing of 
-* individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import java.util.Locale;
-import java.util.Set;
-import org.jboss.dna.common.i18n.I18n;
-
-/**
- * The internationalized string constants for the <code>org.jboss.dna.connector.svn*</code> packages.
- */
-public final class SVNRepositoryConnectorI18n {
-
-    public static I18n connectorName;
-    public static I18n nodeDoesNotExist;
-    public static I18n nodeIsActuallyUnknow;
-    public static I18n propertyIsRequired;
-    public static I18n errorSerializingCachePolicyInSource;
-    public static I18n locationInRequestMustHavePath;
-    public static I18n sourceIsReadOnly;
-    public static I18n sourceDoesNotSupportCreatingWorkspaces;
-    public static I18n sourceDoesNotSupportCloningWorkspaces;
-    public static I18n sourceDoesNotSupportDeletingWorkspaces;
-    public static I18n connectingFailureOrUserAuthenticationProblem;
-    public static I18n pathForPredefinedWorkspaceDoesNotExist;
-    public static I18n pathForPredefinedWorkspaceIsNotDirectory;
-    public static I18n pathForPredefinedWorkspaceCannotBeRead;
-    public static I18n workspaceDoesNotExist;
-    public static I18n pathForDefaultWorkspaceDoesNotExist;
-    public static I18n pathForDefaultWorkspaceIsNotDirectory;
-    public static I18n pathForDefaultWorkspaceCannotBeRead;
-    public static I18n sameNameSiblingsAreNotAllowed;
-    public static I18n onlyTheDefaultNamespaceIsAllowed;
-    public static I18n unableToCreateWorkspaces;
-    public static I18n pathForRequestIsNotCorrect;
-    public static I18n pathForRequestMustStartWithAForwardSlash;
-    public static I18n nodeAlreadyExist;
-    public static I18n unsupportedPrimaryType;
-    public static I18n invalidPropertyNames;
-    public static I18n invalidNameForResource;
-    public static I18n invalidPathForResource;
-    public static I18n missingRequiredProperty;
-    public static I18n couldNotCreateFile;
-    public static I18n couldNotReadData;
-    public static I18n deleteFailed;
-
-    static {
-        try {
-            I18n.initialize(SVNRepositoryConnectorI18n.class);
-        } catch (final Exception err) {
-            System.err.println(err);
-        }
-    }
-
-    public static Set<Locale> getLocalizationProblemLocales() {
-        return I18n.getLocalizationProblemLocales(SVNRepositoryConnectorI18n.class);
-    }
-
-    public static Set<String> getLocalizationProblems() {
-        return I18n.getLocalizationProblems(SVNRepositoryConnectorI18n.class);
-    }
-
-    public static Set<String> getLocalizationProblems( Locale locale ) {
-        return I18n.getLocalizationProblems(SVNRepositoryConnectorI18n.class, locale);
-    }
-
-  
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryLexicon.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryLexicon.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryLexicon.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,42 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.basic.BasicName;
-
-/**
- * The namespace and property names used within a {@link SVNRepositorySource} to store internal information.
- */
-public class SVNRepositoryLexicon {
-
-    public static class Namespace {
-        public static final String URI = "http://www.jboss.org/dna/connector/svn";
-        public static final String PREFIX = "dnasvn";
-    }
-
-    public static final Name CHILD_PATH_SEGMENT_LIST = new BasicName(Namespace.URI, "orderedChildNames");
-    public static final Name UUID = new BasicName(Namespace.URI, "uuid");
-
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,1379 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.connector.scm.ScmAction;
-import org.jboss.dna.connector.scm.ScmActionFactory;
-import org.jboss.dna.connector.svn.mgnt.AddDirectory;
-import org.jboss.dna.connector.svn.mgnt.AddFile;
-import org.jboss.dna.connector.svn.mgnt.DeleteEntry;
-import org.jboss.dna.connector.svn.mgnt.UpdateFile;
-import org.jboss.dna.graph.DnaIntLexicon;
-import org.jboss.dna.graph.DnaLexicon;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.JcrLexicon;
-import org.jboss.dna.graph.JcrNtLexicon;
-import org.jboss.dna.graph.Location;
-import org.jboss.dna.graph.NodeConflictBehavior;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.property.Binary;
-import org.jboss.dna.graph.property.BinaryFactory;
-import org.jboss.dna.graph.property.DateTimeFactory;
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.NameFactory;
-import org.jboss.dna.graph.property.NamespaceRegistry;
-import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.property.PathFactory;
-import org.jboss.dna.graph.property.PathNotFoundException;
-import org.jboss.dna.graph.property.Property;
-import org.jboss.dna.graph.property.PropertyFactory;
-import org.jboss.dna.graph.property.ValueFactory;
-import org.jboss.dna.graph.request.CloneBranchRequest;
-import org.jboss.dna.graph.request.CloneWorkspaceRequest;
-import org.jboss.dna.graph.request.CopyBranchRequest;
-import org.jboss.dna.graph.request.CreateNodeRequest;
-import org.jboss.dna.graph.request.CreateWorkspaceRequest;
-import org.jboss.dna.graph.request.DeleteBranchRequest;
-import org.jboss.dna.graph.request.DestroyWorkspaceRequest;
-import org.jboss.dna.graph.request.GetWorkspacesRequest;
-import org.jboss.dna.graph.request.InvalidRequestException;
-import org.jboss.dna.graph.request.InvalidWorkspaceException;
-import org.jboss.dna.graph.request.MoveBranchRequest;
-import org.jboss.dna.graph.request.ReadAllChildrenRequest;
-import org.jboss.dna.graph.request.ReadAllPropertiesRequest;
-import org.jboss.dna.graph.request.ReadNodeRequest;
-import org.jboss.dna.graph.request.RenameNodeRequest;
-import org.jboss.dna.graph.request.Request;
-import org.jboss.dna.graph.request.UpdatePropertiesRequest;
-import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-import org.tmatesoft.svn.core.SVNDirEntry;
-import org.tmatesoft.svn.core.SVNErrorCode;
-import org.tmatesoft.svn.core.SVNErrorMessage;
-import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.SVNNodeKind;
-import org.tmatesoft.svn.core.SVNProperties;
-import org.tmatesoft.svn.core.SVNProperty;
-import org.tmatesoft.svn.core.io.SVNRepository;
-
-/**
- * The {@link RequestProcessor} implementation for the file subversion repository connector. This is the class that does the bulk
- * of the work in the subversion repository connector, since it processes all requests.
- */
-public class SVNRepositoryRequestProcessor extends RequestProcessor implements ScmActionFactory {
-
-    protected static final String BACK_SLASH = "/";
-
-    private static final String DEFAULT_MIME_TYPE = "application/octet-stream";
-
-    /**
-     * Only certain properties are tolerated when writing content (dna:resource or jcr:resource) nodes. These properties are
-     * implicitly stored (primary type, data) or silently ignored (encoded, mimetype, last modified). The silently ignored
-     * properties must be accepted to stay compatible with the JCR specification.
-     */
-    private final Set<Name> ALLOWABLE_PROPERTIES_FOR_CONTENT = Collections.unmodifiableSet(new HashSet<Name>(
-                                                                                                             Arrays.asList(new Name[] {
-                                                                                                                 JcrLexicon.PRIMARY_TYPE,
-                                                                                                                 JcrLexicon.DATA,
-                                                                                                                 JcrLexicon.ENCODED,
-                                                                                                                 JcrLexicon.MIMETYPE,
-                                                                                                                 JcrLexicon.LAST_MODIFIED,
-                                                                                                                 JcrLexicon.UUID,
-                                                                                                                 DnaIntLexicon.NODE_DEFINITON})));
-    /**
-     * Only certain properties are tolerated when writing files (nt:file) or folders (nt:folder) nodes. These properties are
-     * implicitly stored in the file or folder (primary type, created).
-     */
-    private final Set<Name> ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER = Collections.unmodifiableSet(new HashSet<Name>(
-                                                                                                                    Arrays.asList(new Name[] {
-                                                                                                                        JcrLexicon.PRIMARY_TYPE,
-                                                                                                                        JcrLexicon.CREATED,
-                                                                                                                        JcrLexicon.UUID,
-                                                                                                                        DnaIntLexicon.NODE_DEFINITON})));
-
-    private final String defaultNamespaceUri;
-    private final boolean updatesAllowed;
-    private SVNRepository defaultWorkspace;
-    protected final Logger logger;
-    private final Set<String> availableWorkspaceNames;
-    private final boolean creatingWorkspacesAllowed;
-    private final RepositoryAccessData accessData;
-
-    /**
-     * @param sourceName
-     * @param context
-     * @param defaultWorkspace
-     * @param availableWorkspaceNames
-     * @param creatingWorkspacesAllowed
-     * @param updatesAllowed true if this connector supports updating the subversion repository, or false if the connector is read
-     *        only
-     * @param accessData
-     */
-    protected SVNRepositoryRequestProcessor( String sourceName,
-                                             SVNRepository defaultWorkspace,
-                                             Set<String> availableWorkspaceNames,
-                                             boolean creatingWorkspacesAllowed,
-                                             ExecutionContext context,
-                                             boolean updatesAllowed,
-                                             RepositoryAccessData accessData ) {
-        super(sourceName, context, null);
-        assert defaultWorkspace != null;
-        assert availableWorkspaceNames != null;
-        this.defaultNamespaceUri = getExecutionContext().getNamespaceRegistry().getDefaultNamespaceUri();
-        this.updatesAllowed = updatesAllowed;
-        this.defaultWorkspace = defaultWorkspace;
-        this.logger = getExecutionContext().getLogger(getClass());
-        this.availableWorkspaceNames = availableWorkspaceNames;
-        this.creatingWorkspacesAllowed = creatingWorkspacesAllowed;
-        this.accessData = accessData;
-    }
-
-    protected void addProperty( List<Property> properties,
-                                PropertyFactory factory,
-                                Name propertyName,
-                                Object value ) {
-        if (value != null) {
-            properties.add(factory.create(propertyName, value));
-        }
-    }
-
-    protected boolean readNode( String workspaceName,
-                                Location myLocation,
-                                List<Property> properties,
-                                List<Location> children,
-                                Request request ) {
-
-        // Get the SVNRepository object that represents the workspace ...
-        SVNRepository workspaceRoot = getWorkspaceDirectory(workspaceName);
-        if (workspaceRoot == null) {
-            request.setError(new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
-            return false;
-        }
-        Path requestedPath = getPathFor(myLocation, request);
-        checkThePath(requestedPath, request); // same-name-sibling indexes are not supported
-
-        if (requestedPath.isRoot()) {
-            // workspace root must be a directory
-            if (children != null) {
-                final Collection<SVNDirEntry> entries = SVNRepositoryUtil.getDir(workspaceRoot, "");
-                for (SVNDirEntry entry : entries) {
-                    // All of the children of a directory will be another directory or a file, but never a "jcr:content" node ...
-                    String localName = entry.getName();
-                    Name childName = nameFactory().create(defaultNamespaceUri, localName);
-                    Path childPath = pathFactory().create(requestedPath, childName);
-                    children.add(Location.create(childPath));
-                }
-            }
-            // There are no properties on the root ...
-        } else {
-            try {
-                // Generate the properties for this File object ...
-                PropertyFactory factory = getExecutionContext().getPropertyFactory();
-                DateTimeFactory dateFactory = getExecutionContext().getValueFactories().getDateFactory();
-
-                // Figure out the kind of node this represents ...
-                SVNNodeKind kind = getNodeKind(workspaceRoot, requestedPath, accessData.getRepositoryRootUrl(), workspaceName);
-                if (kind == SVNNodeKind.DIR) {
-                    String directoryPath = getPathAsString(requestedPath);
-                    if (!accessData.getRepositoryRootUrl().equals(workspaceName)) {
-                        directoryPath = directoryPath.substring(1);
-                    }
-                    if (children != null) {
-                        // Decide how to represent the children ...
-                        Collection<SVNDirEntry> dirEntries = SVNRepositoryUtil.getDir(workspaceRoot, directoryPath);
-                        for (SVNDirEntry entry : dirEntries) {
-                            // All of the children of a directory will be another directory or a file,
-                            // but never a "jcr:content" node ...
-                            String localName = entry.getName();
-                            Name childName = nameFactory().create(defaultNamespaceUri, localName);
-                            Path childPath = pathFactory().create(requestedPath, childName);
-                            children.add(Location.create(childPath));
-                        }
-                    }
-                    if (properties != null) {
-                        // Load the properties for this directory ......
-                        addProperty(properties, factory, JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FOLDER);
-                        SVNDirEntry entry = getEntryInfo(workspaceRoot, directoryPath);
-                        if (entry != null) {
-                            addProperty(properties, factory, JcrLexicon.LAST_MODIFIED, dateFactory.create(entry.getDate()));
-                        }
-                    }
-                } else {
-                    // It's not a directory, so must be a file; the only child of an nt:file is the "jcr:content" node
-                    // ...
-                    if (requestedPath.endsWith(JcrLexicon.CONTENT)) {
-                        // There are never any children of these nodes, just properties ...
-                        if (properties != null) {
-                            String contentPath = getPathAsString(requestedPath.getParent());
-                            if (!accessData.getRepositoryRootUrl().equals(workspaceName)) {
-                                contentPath = contentPath.substring(1);
-                            }
-                            SVNDirEntry entry = getEntryInfo(workspaceRoot, contentPath);
-                            if (entry != null) {
-                                // The request is to get properties of the "jcr:content" child node ...
-                                // Do NOT use "nt:resource", since it extends "mix:referenceable". The JCR spec
-                                // does not require that "jcr:content" is of type "nt:resource", but rather just
-                                // suggests it. Therefore, we can use "dna:resource", which is identical to
-                                // "nt:resource" except it does not extend "mix:referenceable"
-                                addProperty(properties, factory, JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE);
-                                addProperty(properties, factory, JcrLexicon.LAST_MODIFIED, dateFactory.create(entry.getDate()));
-                            }
-
-                            ByteArrayOutputStream os = new ByteArrayOutputStream();
-                            SVNProperties fileProperties = new SVNProperties();
-                            getData(contentPath, fileProperties, os);
-                            String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);
-                            if (mimeType == null) mimeType = DEFAULT_MIME_TYPE;
-                            addProperty(properties, factory, JcrLexicon.MIMETYPE, mimeType);
-
-                            if (os.toByteArray().length > 0) {
-                                // Now put the file's content into the "jcr:data" property ...
-                                BinaryFactory binaryFactory = getExecutionContext().getValueFactories().getBinaryFactory();
-                                addProperty(properties, factory, JcrLexicon.DATA, binaryFactory.create(os.toByteArray()));
-                            }
-                        }
-                    } else {
-                        // Determine the corresponding file path for this object ...
-                        String filePath = getPathAsString(requestedPath);
-                        if (!accessData.getRepositoryRootUrl().equals(workspaceName)) {
-                            filePath = filePath.substring(1);
-                        }
-                        if (children != null) {
-                            // Not a "jcr:content" child node but rather an nt:file node, so add the child ...
-                            Path contentPath = pathFactory().create(requestedPath, JcrLexicon.CONTENT);
-                            children.add(Location.create(contentPath));
-                        }
-                        if (properties != null) {
-                            // Now add the properties to "nt:file" ...
-                            addProperty(properties, factory, JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE);
-                            ByteArrayOutputStream os = new ByteArrayOutputStream();
-                            SVNProperties fileProperties = new SVNProperties();
-                            getData(filePath, fileProperties, os);
-                            String created = fileProperties.getStringValue(SVNProperty.COMMITTED_DATE);
-                            addProperty(properties, factory, JcrLexicon.CREATED, dateFactory.create(created));
-                        }
-                    }
-                }
-            } catch (SVNException e) {
-                request.setError(e);
-            }
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.ReadNodeRequest)
-     */
-    @Override
-    public void process( ReadNodeRequest request ) {
-        logger.trace(request.toString());
-        List<Location> children = new LinkedList<Location>();
-        List<Property> properties = new LinkedList<Property>();
-        if (readNode(request.inWorkspace(), request.at(), properties, children, request)) {
-            request.addChildren(children);
-            request.addProperties(properties);
-            request.setActualLocationOfNode(request.at());
-            setCacheableInfo(request);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.ReadAllChildrenRequest)
-     */
-    @Override
-    public void process( ReadAllChildrenRequest request ) {
-        logger.trace(request.toString());
-        List<Location> children = new LinkedList<Location>();
-        if (readNode(request.inWorkspace(), request.of(), null, children, request)) {
-            request.addChildren(children);
-            request.setActualLocationOfNode(request.of());
-            setCacheableInfo(request);
-        }
-
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.ReadAllPropertiesRequest)
-     */
-    @Override
-    public void process( ReadAllPropertiesRequest request ) {
-        logger.trace(request.toString());
-        List<Property> properties = new LinkedList<Property>();
-        if (readNode(request.inWorkspace(), request.at(), properties, null, request)) {
-            request.addProperties(properties);
-            request.setActualLocationOfNode(request.at());
-            setCacheableInfo(request);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateNodeRequest)
-     */
-    @Override
-    public void process( CreateNodeRequest request ) {
-        logger.trace(request.toString());
-        if (!updatesAllowed(request)) return;
-
-        // continue
-        Path parentPath = getPathFor(request.under(), request);
-        if (parentPath == null) return;
-
-        // svn connector does not support same name sibling
-        sameNameSiblingIsNotSupported(parentPath);
-
-        SVNRepository workspaceRoot = getWorkspaceDirectory(request.inWorkspace());
-        assert workspaceRoot != null;
-
-        SVNNodeKind parent = getSVNNodeKindFor(workspaceRoot, parentPath, request.under(), request.inWorkspace(), request);
-        if (parent == null) {
-            return;
-        }
-
-        NamespaceRegistry registry = getExecutionContext().getNamespaceRegistry();
-        // New name to commit into the svn repos workspace
-        String newName = request.named().getString(registry);
-
-        // Collect all the properties of the node in a hash map
-        Map<Name, Property> properties = new HashMap<Name, Property>(request.properties().size());
-        for (Property property : request.properties()) {
-            properties.put(property.getName(), property);
-        }
-
-        Property primaryTypeProp = properties.get(JcrLexicon.PRIMARY_TYPE);
-        Name primaryType = primaryTypeProp == null ? null : nameFactory().create(primaryTypeProp.getFirstValue());
-
-        Path newPath = pathFactory().create(parentPath, request.named());
-        Location actualLocation = Location.create(newPath);
-
-        String newChildPath = null;
-
-        // File
-        if (JcrNtLexicon.FILE.equals(primaryType)) {
-            ensureValidProperties(request.properties(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
-            // Parent node already exist
-            boolean skipWrite = false;
-
-            if (request.under().getPath().isRoot()) {
-                if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                    newChildPath = newName;
-                } else {
-                    newChildPath = "/" + newName;
-                }
-            } else {
-                newChildPath = getPathAsString(request.under().getPath()) + "/" + newName;
-                if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                    newChildPath = newChildPath.substring(1);
-                }
-            }
-
-            // check if the new name already exist
-            try {
-                if (SVNRepositoryUtil.exists(workspaceRoot, newChildPath)) {
-                    if (request.conflictBehavior().equals(NodeConflictBehavior.APPEND)) {
-                        I18n msg = SVNRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
-                        throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
-                    } else if (request.conflictBehavior().equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
-                        skipWrite = true;
-                    }
-                }
-            } catch (SVNException e1) {
-                throw new RepositorySourceException(getSourceName(), e1.getMessage());
-            }
-
-            // Don't try to write if the node conflict behavior is DO_NOT_REPLACE
-            if (!skipWrite) {
-                // create a new, empty file
-                if (newChildPath != null) {
-                    try {
-                        String rootPath = null;
-                        if (request.under().getPath().isRoot()) {
-                            rootPath = "";
-                        } else {
-                            rootPath = getPathAsString(request.under().getPath());
-                        }
-                        newFile(rootPath, newName, "".getBytes(), null, request.inWorkspace(), workspaceRoot);
-                    } catch (SVNException e) {
-                        I18n msg = SVNRepositoryConnectorI18n.couldNotCreateFile;
-                        request.setError(new RepositorySourceException(getSourceName(),
-                                                                       msg.text(getPathAsString(request.under().getPath()),
-                                                                                request.inWorkspace(),
-                                                                                getSourceName(),
-                                                                                e.getMessage()), e));
-                        return;
-                    }
-                }
-            }
-        } else if (JcrNtLexicon.RESOURCE.equals(primaryType) || DnaLexicon.RESOURCE.equals(primaryType)) { // Resource
-            ensureValidProperties(request.properties(), ALLOWABLE_PROPERTIES_FOR_CONTENT);
-            if (request.under().getPath().isRoot()) {
-                newChildPath = getPathAsString(parentPath);
-                if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                    newChildPath = getPathAsString(parentPath).substring(1);
-                }
-            } else {
-                newChildPath = getPathAsString(parentPath);
-                if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                    newChildPath = newChildPath.substring(1);
-                }
-            }
-
-            if (!JcrLexicon.CONTENT.equals(request.named())) {
-                I18n msg = SVNRepositoryConnectorI18n.invalidNameForResource;
-                String nodeName = request.named().getString(registry);
-                request.setError(new RepositorySourceException(getSourceName(),
-                                                               msg.text(getPathAsString(request.under().getPath()),
-                                                                        request.inWorkspace(),
-                                                                        getSourceName(),
-                                                                        nodeName)));
-                return;
-            }
-
-            if (parent != SVNNodeKind.FILE) {
-                I18n msg = SVNRepositoryConnectorI18n.invalidPathForResource;
-                request.setError(new RepositorySourceException(getSourceName(),
-                                                               msg.text(getPathAsString(request.under().getPath()),
-                                                                        request.inWorkspace(),
-                                                                        getSourceName())));
-                return;
-            }
-
-            boolean skipWrite = false;
-            if (parent != SVNNodeKind.NONE || parent != SVNNodeKind.UNKNOWN) {
-                if (request.conflictBehavior().equals(NodeConflictBehavior.APPEND)) {
-                    I18n msg = SVNRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
-                    throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
-                } else if (request.conflictBehavior().equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
-                    // TODO check if the file already has content
-                    skipWrite = true;
-                }
-            }
-
-            if (!skipWrite) {
-                Property dataProperty = properties.get(JcrLexicon.DATA);
-                if (dataProperty == null) {
-                    I18n msg = SVNRepositoryConnectorI18n.missingRequiredProperty;
-                    String dataPropName = JcrLexicon.DATA.getString(registry);
-                    request.setError(new RepositorySourceException(getSourceName(),
-                                                                   msg.text(getPathAsString(request.under().getPath()),
-                                                                            request.inWorkspace(),
-                                                                            getSourceName(),
-                                                                            dataPropName)));
-                    return;
-                }
-
-                BinaryFactory binaryFactory = getExecutionContext().getValueFactories().getBinaryFactory();
-                Binary binary = binaryFactory.create(properties.get(JcrLexicon.DATA).getFirstValue());
-                // get old data
-                ByteArrayOutputStream contents = new ByteArrayOutputStream();
-                SVNProperties svnProperties = new SVNProperties();
-                try {
-                    workspaceRoot.getFile(newChildPath, -1, svnProperties, contents);
-                    byte[] oldData = contents.toByteArray();
-                    // modify the empty old data with the new resource
-                    if (oldData != null) {
-                        String rootPath = null;
-                        String fileName = null;
-
-                        Path p = request.under().getPath();
-                        rootPath = getPathAsString(p.getAncestor(1));
-                        fileName = p.getLastSegment().getString(registry);
-
-                        if (request.under().getPath().isRoot()) {
-                            rootPath = "";
-                        }
-
-                        modifyFile(rootPath, fileName, oldData, binary.getBytes(), null, request.inWorkspace(), workspaceRoot);
-                    }
-                } catch (SVNException e) {
-                    I18n msg = SVNRepositoryConnectorI18n.couldNotReadData;
-                    request.setError(new RepositorySourceException(getSourceName(),
-                                                                   msg.text(getPathAsString(request.under().getPath()),
-                                                                            request.inWorkspace(),
-                                                                            getSourceName(),
-                                                                            e.getMessage()), e));
-                    return;
-                }
-            }
-
-        } else if (JcrNtLexicon.FOLDER.equals(primaryType) || primaryType == null) { // Folder
-            ensureValidProperties(request.properties(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
-            try {
-                String rootDirPath = getPathAsString(request.under().getPath());
-                mkdir(rootDirPath, newName, null, request.inWorkspace(), workspaceRoot);
-            } catch (SVNException e) {
-                I18n msg = SVNRepositoryConnectorI18n.couldNotCreateFile;
-                request.setError(new RepositorySourceException(getSourceName(),
-                                                               msg.text(getPathAsString(request.under().getPath()),
-                                                                        request.inWorkspace(),
-                                                                        getSourceName(),
-                                                                        e.getMessage()), e));
-                return;
-            }
-        } else {
-            I18n msg = SVNRepositoryConnectorI18n.unsupportedPrimaryType;
-            request.setError(new RepositorySourceException(getSourceName(), msg.text(primaryType.getString(registry),
-                                                                                     getPathAsString(request.under().getPath()),
-                                                                                     request.inWorkspace(),
-                                                                                     getSourceName())));
-            return;
-        }
-
-        request.setActualLocationOfNode(actualLocation);
-    }
-
-    /**
-     * @param workspaceRoot
-     * @param path
-     * @param location
-     * @param inWorkspace
-     * @param request
-     * @return a svn node kind
-     */
-    protected SVNNodeKind getSVNNodeKindFor( SVNRepository workspaceRoot,
-                                             Path path,
-                                             Location location,
-                                             String inWorkspace,
-                                             Request request ) {
-        assert path != null;
-        assert location != null;
-        assert request != null;
-
-        SVNNodeKind rootNode = SVNRepositoryUtil.checkThePath(workspaceRoot, "", -1, getSourceName());
-
-        if (rootNode != SVNNodeKind.DIR) return null;
-
-        if (path.isRoot()) {
-            return rootNode;
-        }
-
-        // See if the path is a "jcr:content" node ...
-        if (path.getLastSegment().getName().equals(JcrLexicon.CONTENT)) {
-            // We only want to use the parent path to find the actual file ...
-            path = path.getParent();
-        }
-        SVNNodeKind kind = rootNode;
-        for (Path.Segment segment : path) {
-            if (segment.getIndex() > 1) {
-                I18n msg = SVNRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
-                throw new RepositorySourceException(getSourceName(), msg.text("SVN Connector does not support Same Name Sibling"));
-            }
-        }
-
-        String currentPath = getPathAsString(path);
-        if (!this.accessData.getRepositoryRootUrl().equals(inWorkspace)) {
-            if (currentPath.startsWith("/")) {
-                currentPath = currentPath.substring(1);
-            }
-        }
-        kind = SVNRepositoryUtil.checkThePath(workspaceRoot, currentPath, -1, getSourceName());
-
-        if (kind != null) {
-            if (kind == SVNNodeKind.NONE || kind == SVNNodeKind.UNKNOWN) {
-                // Unable to complete the path, so prepare the exception by determining the lowest path that exists ...
-                request.setError(new RepositorySourceException(getSourceName(), " Node kind with path " + currentPath
-                                                                                + " is missing or actually unknown"));
-                return null;
-            }
-        }
-
-        assert kind != null;
-        return kind;
-    }
-
-    protected void sameNameSiblingIsNotSupported( Path path ) {
-        for (Path.Segment segment : path) {
-            // Verify the segment is valid ...
-            if (segment.getIndex() > 1) {
-                I18n msg = SVNRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
-                throw new RepositorySourceException(getSourceName(), msg.text("SVN Connector does not support Same Name Sibling"));
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.UpdatePropertiesRequest)
-     */
-    @Override
-    public void process( UpdatePropertiesRequest request ) {
-        logger.trace(request.toString());
-        verifyUpdatesAllowed();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CopyBranchRequest)
-     */
-    @Override
-    public void process( CopyBranchRequest request ) {
-        updatesAllowed(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
-     */
-    @Override
-    public void process( CloneBranchRequest request ) {
-        updatesAllowed(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DeleteBranchRequest)
-     */
-    @Override
-    public void process( DeleteBranchRequest request ) {
-        logger.trace(request.toString());
-        if (!updatesAllowed(request)) return;
-
-        SVNRepository workspaceRoot = getWorkspaceDirectory(request.inWorkspace());
-        assert workspaceRoot != null;
-        
-        NamespaceRegistry registry = getExecutionContext().getNamespaceRegistry();
-
-        Path requestedPath = request.at().getPath();
-        // svn connector does not support same name sibling
-        sameNameSiblingIsNotSupported(requestedPath);
-
-        if (!requestedPath.isRoot() && JcrLexicon.CONTENT.equals(requestedPath.getLastSegment().getName())) {
-            Path p = requestedPath.getAncestor(1);
-            if(p != null) {
-                String itemPath = getPathAsString(p);
-                if (itemPath.equals("") || itemPath.equals("/")) {
-                    return;
-                }
-                String filePath = null;
-                if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                    filePath = itemPath.substring(1);
-                }
-                try {
-                    //check if the file exist
-                    if (!SVNRepositoryUtil.exists(workspaceRoot, filePath)) return;
-                    
-                    //update the file
-                    SVNProperties fileProperties = new SVNProperties();
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    workspaceRoot.getFile(filePath, -1, fileProperties, baos);
-                    
-                    String rootPath = getPathAsString(p.getAncestor(1));
-                    String fileName = p.getLastSegment().getString(registry);
-                    modifyFile(rootPath, fileName, baos.toByteArray(), "".getBytes(), null, request.inWorkspace(), workspaceRoot);
-
-                } catch (SVNException e) {
-                    throw new RepositorySourceException(getSourceName(),
-                                                        SVNRepositoryConnectorI18n.deleteFailed.text(itemPath, getSourceName()));
-
-                }
-            }
-
-
-        } else {
-
-            String nodePath = getPathAsString(requestedPath);
-
-            if (!accessData.getRepositoryRootUrl().equals(request.inWorkspace())) {
-                nodePath = nodePath.substring(1);
-            }
-
-            try {
-                if (!SVNRepositoryUtil.exists(workspaceRoot, nodePath)) return;
-                eraseEntry(nodePath, null, request.inWorkspace(), workspaceRoot);
-            } catch (SVNException e) {
-                throw new RepositorySourceException(getSourceName(),
-                                                    SVNRepositoryConnectorI18n.deleteFailed.text(nodePath, getSourceName()));
-
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
-     */
-    @Override
-    public void process( MoveBranchRequest request ) {
-        updatesAllowed(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.RenameNodeRequest)
-     */
-    @Override
-    public void process( RenameNodeRequest request ) {
-        if (updatesAllowed(request)) super.process(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.VerifyWorkspaceRequest)
-     */
-    @Override
-    public void process( VerifyWorkspaceRequest request ) {
-        // If the request contains a null name, then we use the default ...
-        String workspaceName = request.workspaceName();
-        if (workspaceName == null) workspaceName = defaultWorkspace.getLocation().toDecodedString();
-
-        SVNRepository repository = null;
-        if (!this.creatingWorkspacesAllowed) {
-            // Then the workspace name must be one of the available names ...
-            boolean found = false;
-            for (String available : this.availableWorkspaceNames) {
-                if (workspaceName.equals(available)) {
-                    found = true;
-                    break;
-                }
-                repository = SVNRepositoryUtil.createRepository(available, accessData.getUsername(), accessData.getPassword());
-                // check if the workspace is conform
-                if (SVNRepositoryUtil.isDirectory(repository, "")
-                    && repository.getLocation().toDecodedString().equals(workspaceName)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                request.setError(new InvalidWorkspaceException(
-                                                               SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
-                return;
-            }
-        }
-
-        // Verify that there is a repos at the path given by the workspace name ...
-        repository = SVNRepositoryUtil.createRepository(workspaceName, accessData.getUsername(), accessData.getPassword());
-        if (SVNRepositoryUtil.isDirectory(repository, "")) {
-            request.setActualWorkspaceName(repository.getLocation().toDecodedString());
-            request.setActualRootLocation(Location.create(pathFactory().createRootPath()));
-        } else {
-            request.setError(new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.GetWorkspacesRequest)
-     */
-    @Override
-    public void process( GetWorkspacesRequest request ) {
-        // Return the set of available workspace names, even if new workspaces can be created ...
-        Set<String> names = new HashSet<String>();
-        for (String name : this.availableWorkspaceNames) {
-            SVNRepository repos = SVNRepositoryUtil.createRepository(name, accessData.getUsername(), accessData.getPassword());
-            if (repos != null && SVNRepositoryUtil.isDirectory(repos, "")) {
-                names.add(repos.getLocation().toDecodedString());
-            } else {
-                request.setError(new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(name)));
-            }
-        }
-        request.setAvailableWorkspaceNames(Collections.unmodifiableSet(names));
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
-     */
-    @Override
-    public void process( CloneWorkspaceRequest request ) {
-        if (!updatesAllowed) {
-            request.setError(new InvalidRequestException(
-                                                         SVNRepositoryConnectorI18n.sourceDoesNotSupportCloningWorkspaces.text(getSourceName())));
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateWorkspaceRequest)
-     */
-    @Override
-    public void process( CreateWorkspaceRequest request ) {
-        final String workspaceName = request.desiredNameOfNewWorkspace();
-        if (!creatingWorkspacesAllowed) {
-            String msg = SVNRepositoryConnectorI18n.unableToCreateWorkspaces.text(getSourceName(), workspaceName);
-            request.setError(new InvalidRequestException(msg));
-            return;
-        }
-        // This doesn't create the directory representing the workspace (it must already exist), but it will add
-        // the workspace name to the available names ...
-        SVNRepository repository = SVNRepositoryUtil.createRepository(workspaceName,
-                                                                      accessData.getUsername(),
-                                                                      accessData.getPassword());
-        if (SVNRepositoryUtil.isDirectory(repository, "")) {
-            request.setActualWorkspaceName(repository.getLocation().toDecodedString());
-            request.setActualRootLocation(Location.create(pathFactory().createRootPath()));
-            availableWorkspaceNames.add(repository.getLocation().toDecodedString());
-        } else {
-            request.setError(new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
-        }
-
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DestroyWorkspaceRequest)
-     */
-    @Override
-    public void process( DestroyWorkspaceRequest request ) {
-        final String workspaceName = request.workspaceName();
-        if (!creatingWorkspacesAllowed) {
-            String msg = SVNRepositoryConnectorI18n.unableToCreateWorkspaces.text(getSourceName(), workspaceName);
-            request.setError(new InvalidRequestException(msg));
-        }
-        // This doesn't delete the file/directory; rather, it just remove the workspace from the available set ...
-        if (!this.availableWorkspaceNames.remove(workspaceName)) {
-            request.setError(new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
-        }
-    }
-
-    /**
-     * Get the repository driver.
-     * 
-     * @return repository
-     */
-    public SVNRepository getDefaultWorkspace() {
-        return defaultWorkspace;
-    }
-
-    /**
-     * Get the last revision.
-     * 
-     * @param repos
-     * @return the last revision number.
-     * @throws Exception
-     */
-    public long getLatestRevision( SVNRepository repos ) throws Exception {
-        try {
-            return repos.getLatestRevision();
-        } catch (SVNException e) {
-            e.printStackTrace();
-            // logger.error( "svn error: " );
-            throw e;
-        }
-    }
-
-    /**
-     * Create a directory .
-     * 
-     * @param rootDirPath - the root directory where the created directory will reside
-     * @param childDirPath - the name of the created directory.
-     * @param comment - comment for the creation.
-     * @param inWorkspace
-     * @param currentRepository
-     * @throws SVNException - if during the creation, there is an error.
-     */
-    private void mkdir( String rootDirPath,
-                        String childDirPath,
-                        String comment,
-                        String inWorkspace,
-                        SVNRepository currentRepository ) throws SVNException {
-
-        String tempParentPath = rootDirPath;
-        if (!this.accessData.getRepositoryRootUrl().equals(inWorkspace)) {
-            if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
-                tempParentPath = tempParentPath.substring(1);
-            } else if (tempParentPath.equals("/")) {
-                tempParentPath = "";
-            }
-        }
-        String checkPath = tempParentPath.length() == 0 ? childDirPath : tempParentPath + "/" + childDirPath;
-        SVNNodeKind nodeKind = null;
-        try {
-            nodeKind = currentRepository.checkPath(checkPath, -1);
-        } catch (SVNException e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "May be a Connecting problem to the repository or a user's authentication failure: {0}",
-                                                         e.getMessage());
-            throw new SVNException(err);
-        }
-
-        if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
-            ScmAction addNodeAction = addDirectory(rootDirPath, childDirPath);
-            SVNActionExecutor executor = new SVNActionExecutor(currentRepository);
-            comment = comment == null ? "Create a new file " + childDirPath : comment;
-            executor.execute(addNodeAction, comment);
-        } else {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "Node with name '{0}' can't be created",
-                                                         childDirPath);
-            throw new SVNException(err);
-        }
-    }
-
-    /**
-     * Create a file.
-     * 
-     * @param rootDirPath
-     * @param childFilePath
-     * @param content
-     * @param comment
-     * @param inWorkspace
-     * @param currentRepository
-     * @throws SVNException
-     */
-    private void newFile( String rootDirPath,
-                         String childFilePath,
-                         byte[] content,
-                         String comment,
-                         String inWorkspace,
-                         SVNRepository currentRepository ) throws SVNException {
-
-        String tempParentPath = rootDirPath;
-        if (!this.accessData.getRepositoryRootUrl().equals(inWorkspace)) {
-            if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
-                tempParentPath = tempParentPath.substring(1);
-            }
-        }
-        String checkPath = tempParentPath + "/" + childFilePath;
-        SVNNodeKind nodeKind = null;
-        try {
-            nodeKind = currentRepository.checkPath(checkPath, -1);
-        } catch (SVNException e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "May be a Connecting problem to the repository or a user's authentication failure: {0}",
-                                                         e.getMessage());
-            throw new SVNException(err);
-        }
-
-        if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
-            ScmAction addFileNodeAction = addFile(rootDirPath, childFilePath, content);
-            SVNActionExecutor executor = new SVNActionExecutor(currentRepository);
-            comment = comment == null ? "Create a new file " + childFilePath : comment;
-            executor.execute(addFileNodeAction, comment);
-        } else {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "Item with name '{0}' can't be created (already exist)",
-                                                         childFilePath);
-            throw new SVNException(err);
-        }
-    }
-
-    /**
-     * Modify a file
-     * 
-     * @param rootPath
-     * @param fileName
-     * @param oldData
-     * @param newData
-     * @param comment
-     * @param inWorkspace
-     * @param currentRepository
-     * @throws SVNException
-     */
-    private void modifyFile( String rootPath,
-                             String fileName,
-                             byte[] oldData,
-                             byte[] newData,
-                             String comment,
-                             String inWorkspace,
-                             SVNRepository currentRepository ) throws SVNException {
-        assert rootPath != null;
-        assert fileName != null;
-        assert oldData != null;
-        assert inWorkspace != null;
-        assert currentRepository != null;
-
-        try {
-
-            if (!this.accessData.getRepositoryRootUrl().equals(inWorkspace)) {
-                if (rootPath.equals("/")) {
-                    rootPath = "";
-                } else {
-                    rootPath = rootPath.substring(1) + "/";
-                }
-            } else {
-                if (!rootPath.equals("/")) {
-                    rootPath = rootPath + "/";
-                }
-            }
-            String path = rootPath + fileName;
-
-            SVNNodeKind nodeKind = currentRepository.checkPath(path, -1);
-            if (nodeKind == SVNNodeKind.NONE || nodeKind == SVNNodeKind.UNKNOWN) {
-                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ENTRY_NOT_FOUND,
-                                                             "Item with name '{0}' can't be found",
-                                                             path);
-                throw new SVNException(err);
-            }
-
-            ScmAction modifyFileAction = updateFile(rootPath, fileName, oldData, newData);
-            SVNActionExecutor executor = new SVNActionExecutor(currentRepository);
-            comment = comment == null ? "modify the " + fileName : comment;
-            executor.execute(modifyFileAction, comment);
-
-        } catch (SVNException e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: '{0}'", e.getMessage());
-            throw new SVNException(err);
-        }
-
-    }
-
-    /**
-     * Delete entry from the repository
-     * 
-     * @param path
-     * @param comment
-     * @param inWorkspace
-     * @param currentRepository
-     * @throws SVNException
-     */
-    private void eraseEntry( String path,
-                             String comment,
-                             String inWorkspace,
-                             SVNRepository currentRepository ) throws SVNException {
-        assert path != null;
-        assert inWorkspace != null;
-        if (path.equals("/") || path.equals("")) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.BAD_URL, "The root directory cannot be deleted");
-            throw new SVNException(err);
-        }
-
-        try {
-            ScmAction deleteEntryAction = deleteEntry(path);
-            SVNActionExecutor executor = new SVNActionExecutor(currentRepository);
-            comment = comment == null ? "Delete the " + path : comment;
-            executor.execute(deleteEntryAction, comment);
-        } catch (SVNException e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "unknow error during delete action: {0)",
-                                                         e.getMessage());
-            throw new SVNException(err);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.connector.scm.ScmActionFactory#addDirectory(java.lang.String, java.lang.String)
-     */
-    public ScmAction addDirectory( String root,
-                                   String path ) {
-        return new AddDirectory(root, path);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.connector.scm.ScmActionFactory#addFile(java.lang.String, java.lang.String, byte[])
-     */
-    public ScmAction addFile( String path,
-                              String file,
-                              byte[] content ) {
-        return new AddFile(path, file, content);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.connector.scm.ScmActionFactory#updateFile(java.lang.String, java.lang.String, byte[], byte[])
-     */
-    public ScmAction updateFile( String rootPath,
-                                 String fileName,
-                                 byte[] oldData,
-                                 byte[] newData ) {
-        return new UpdateFile(rootPath, fileName, oldData, newData);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.connector.scm.ScmActionFactory#deleteEntry(java.lang.String)
-     */
-    public ScmAction deleteEntry( String path ) {
-        return new DeleteEntry(path);
-    }
-
-    protected void checkThePath( Path path,
-                                 Request request ) {
-        for (Path.Segment segment : path) {
-            // Verify the segment is valid ...
-            if (segment.getIndex() > 1) {
-                I18n msg = SVNRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
-                throw new RepositorySourceException(getSourceName(), msg.text("SVN Connector does not support Same Name Sibling"));
-            }
-        }
-    }
-
-    protected SVNRepository getWorkspaceDirectory( String workspaceName ) {
-        SVNRepository repository = defaultWorkspace;
-        if (workspaceName != null) {
-            SVNRepository repos = SVNRepositoryUtil.createRepository(workspaceName,
-                                                                     accessData.getUsername(),
-                                                                     accessData.getPassword());
-            if (SVNRepositoryUtil.isDirectory(repos, "")) {
-                repository = repos;
-            } else {
-                return null;
-            }
-        }
-        return repository;
-    }
-
-    protected SVNNodeKind getNodeKind( SVNRepository repository,
-                                       Path path,
-                                       String repositoryRootUrl,
-                                       String inWorkspace ) throws SVNException {
-        assert path != null;
-        assert repositoryRootUrl != null;
-        assert inWorkspace != null;
-        // See if the path is a "jcr:content" node ...
-        if (path.endsWith(JcrLexicon.CONTENT)) {
-            // We only want to use the parent path to find the actual file ...
-            path = path.getParent();
-        }
-        String pathAsString = getPathAsString(path);
-        if (!repositoryRootUrl.equals(inWorkspace)) {
-            pathAsString = pathAsString.substring(1);
-        }
-        SVNNodeKind kind = repository.checkPath(pathAsString, -1);
-        if (kind == SVNNodeKind.NONE) {
-            // node does not exist or requested node is not correct.
-            throw new PathNotFoundException(Location.create(path), null,
-                                            SVNRepositoryConnectorI18n.nodeDoesNotExist.text(pathAsString));
-        } else if (kind == SVNNodeKind.UNKNOWN) {
-            // node is unknown
-            throw new PathNotFoundException(Location.create(path), null,
-                                            SVNRepositoryConnectorI18n.nodeIsActuallyUnknow.text(pathAsString));
-        }
-        return kind;
-    }
-
-    /**
-     * Checks that the collection of {@code properties} only contains properties with allowable names.
-     * 
-     * @param properties
-     * @param validPropertyNames
-     * @throws RepositorySourceException if {@code properties} contains a
-     * @see #ALLOWABLE_PROPERTIES_FOR_CONTENT
-     * @see #ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER
-     */
-    protected void ensureValidProperties( Collection<Property> properties,
-                                          Set<Name> validPropertyNames ) {
-        List<String> invalidNames = new LinkedList<String>();
-        NamespaceRegistry registry = getExecutionContext().getNamespaceRegistry();
-
-        for (Property property : properties) {
-            if (!validPropertyNames.contains(property.getName())) {
-                invalidNames.add(property.getName().getString(registry));
-            }
-        }
-
-        if (!invalidNames.isEmpty()) {
-            throw new RepositorySourceException(this.getSourceName(),
-                                                SVNRepositoryConnectorI18n.invalidPropertyNames.text(invalidNames.toString()));
-        }
-    }
-    
-    /**
-     * Validate the kind of node and throws an exception if necessary.
-     * 
-     * @param repos
-     * @param requestedPath
-     * @return the kind.
-     */
-    protected SVNNodeKind validateNodeKind( SVNRepository repos,
-                                            Path requestedPath ) {
-        SVNNodeKind kind;
-        String myPath;
-        if (getPathAsString(requestedPath).trim().equals("/")) {
-            myPath = getPathAsString(requestedPath);
-        } else if (requestedPath.endsWith(JcrLexicon.CONTENT)) {
-            myPath = getPathAsString(requestedPath.getParent());
-        } else {
-            // directory and file
-            myPath = getPathAsString(requestedPath);
-        }
-
-        try {
-
-            kind = repos.checkPath(myPath, -1);
-            if (kind == SVNNodeKind.NONE) {
-                // node does not exist or requested node is not correct.
-                throw new PathNotFoundException(Location.create(requestedPath), null,
-                                                SVNRepositoryConnectorI18n.nodeDoesNotExist.text(myPath));
-            } else if (kind == SVNNodeKind.UNKNOWN) {
-                // node is unknown
-                throw new PathNotFoundException(Location.create(requestedPath), null,
-                                                SVNRepositoryConnectorI18n.nodeIsActuallyUnknow.text(myPath));
-            }
-        } catch (SVNException e) {
-            throw new RepositorySourceException(
-                                                getSourceName(),
-                                                SVNRepositoryConnectorI18n.connectingFailureOrUserAuthenticationProblem.text(getSourceName()));
-        }
-
-        return kind;
-    }
-    
-    /**
-     * Verify if change is allowed on a specific source.
-     * 
-     * @throws RepositorySourceException if change on that repository source is not allowed.
-     */
-    protected void verifyUpdatesAllowed() {
-        if (!updatesAllowed) {
-            throw new InvalidRequestException(SVNRepositoryConnectorI18n.sourceIsReadOnly.text(getSourceName()));
-        }
-    }
-
-    protected boolean updatesAllowed( Request request ) {
-        if (!updatesAllowed) {
-            request.setError(new InvalidRequestException(SVNRepositoryConnectorI18n.sourceIsReadOnly.text(getSourceName())));
-        }
-        return !request.hasError();
-    }
-
-    /**
-     * Factory for sample name.
-     * 
-     * @return the name factory
-     */
-    protected NameFactory nameFactory() {
-        return getExecutionContext().getValueFactories().getNameFactory();
-    }
-
-    /**
-     * Factory for path creation.
-     * 
-     * @return a path factory.
-     */
-    protected PathFactory pathFactory() {
-        return getExecutionContext().getValueFactories().getPathFactory();
-    }
-
-    /**
-     * Factory for property creation.
-     * 
-     * @return the property factory.
-     */
-    protected PropertyFactory propertyFactory() {
-        return getExecutionContext().getPropertyFactory();
-    }
-
-    /**
-     * Factory for date creation.
-     * 
-     * @return the date factory.
-     */
-    protected DateTimeFactory dateFactory() {
-        return getExecutionContext().getValueFactories().getDateFactory();
-    }
-
-    /**
-     * Factory for binary creation.
-     * 
-     * @return the binary factory..
-     */
-    protected ValueFactory<Binary> binaryFactory() {
-        return getExecutionContext().getValueFactories().getBinaryFactory();
-    }
-
-    /**
-     * Get the path for a locarion and check if the path is null or not.
-     * 
-     * @param location - the location.
-     * @param request - the requested path.
-     * @return the path.
-     * @throws RepositorySourceException if the path of a location is null.
-     */
-    protected Path getPathFor( Location location,
-                               Request request ) {
-        Path path = location.getPath();
-        if (path == null) {
-            I18n msg = SVNRepositoryConnectorI18n.locationInRequestMustHavePath;
-            throw new RepositorySourceException(getSourceName(), msg.text(getSourceName(), request));
-        }
-        return path;
-    }
-
-    /**
-     * Get the content of a file.
-     * 
-     * @param path - the path to that file.
-     * @param properties - the properties of the file.
-     * @param os - the output stream where to store the content.
-     * @throws SVNException - throws if such path is not at that revision or in case of a connection problem.
-     */
-    protected void getData( String path,
-                            SVNProperties properties,
-                            OutputStream os ) throws SVNException {
-        getDefaultWorkspace().getFile(path, -1, properties, os);
-
-    }
-    
-    protected String getPathAsString( Path path ) {
-        return path.getString(getExecutionContext().getNamespaceRegistry());
-    }
-
-    /**
-     * Get some important informations of a path
-     * 
-     * @param repos
-     * @param path - the path
-     * @return - the {@link SVNDirEntry}, or null if there is no such entry
-     */
-    protected SVNDirEntry getEntryInfo( SVNRepository repos,
-                                        String path ) {
-        assert path != null;
-        SVNDirEntry entry = null;
-        try {
-            entry = repos.info(path, -1);
-        } catch (SVNException e) {
-            throw new RepositorySourceException(
-                                                getSourceName(),
-                                                SVNRepositoryConnectorI18n.connectingFailureOrUserAuthenticationProblem.text(getSourceName()));
-        }
-        return entry;
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositorySource.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositorySource.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,581 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArraySet;
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.RefAddr;
-import javax.naming.Reference;
-import javax.naming.StringRefAddr;
-import javax.naming.spi.ObjectFactory;
-import net.jcip.annotations.Immutable;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.CheckArg;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.common.util.StringUtil;
-import org.jboss.dna.graph.cache.CachePolicy;
-import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositoryContext;
-import org.jboss.dna.graph.connector.RepositorySource;
-import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.tmatesoft.svn.core.io.SVNRepository;
-
-/**
- * The {@link RepositorySource} for the connector that exposes an area of the local/remote svn repository as content in a
- * repository. This source considers a workspace name to be the path to the directory on the repository's root directory location
- * that represents the root of that workspace. New workspaces can be created, as long as the names represent valid paths to
- * existing directories.
- */
- at ThreadSafe
-public class SVNRepositorySource implements RepositorySource, ObjectFactory {
-
-    /**
-     * The first serialized version of this source. Version {@value} .
-     */
-    private static final long serialVersionUID = 1L;
-    
-    protected static final String SOURCE_NAME = "sourceName";
-    protected static final String SVN_REPOSITORY_ROOT_URL = "repositoryRootURL";
-    protected static final String SVN_USERNAME = "username";
-    protected static final String SVN_PASSWORD = "password";
-    protected static final String CACHE_TIME_TO_LIVE_IN_MILLISECONDS = "cacheTimeToLiveInMilliseconds";
-    protected static final String RETRY_LIMIT = "retryLimit";
-    protected static final String DEFAULT_WORKSPACE = "defaultWorkspace";
-    protected static final String PREDEFINED_WORKSPACE_NAMES = "predefinedWorkspaceNames";
-    protected static final String ALLOW_CREATING_WORKSPACES = "allowCreatingWorkspaces";
-
-    /**
-     * This source supports events.
-     */
-    protected static final boolean SUPPORTS_EVENTS = true;
-    /**
-     * This source supports same-name-siblings.
-     */
-    protected static final boolean SUPPORTS_SAME_NAME_SIBLINGS = false;
-    /**
-     * This source does support creating workspaces.
-     */
-    protected static final boolean DEFAULT_SUPPORTS_CREATING_WORKSPACES = true;
-    /**
-     * This source supports udpates by default, but each instance may be configured to be read-only or updateable}.
-     */
-    public static final boolean DEFAULT_SUPPORTS_UPDATES = false;
-
-    /**
-     * This source supports creating references.
-     */
-    protected static final boolean SUPPORTS_REFERENCES = false;
-
-    public static final int DEFAULT_RETRY_LIMIT = 0;
-    public static final int DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS = 60 * 5; // 5
-    // minutes
-
-    private volatile String name;
-    private volatile String repositoryRootURL;
-    private volatile String username;
-    private volatile String password;
-    private volatile int retryLimit = DEFAULT_RETRY_LIMIT;
-    private volatile int cacheTimeToLiveInMilliseconds = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS * 1000;
-    private volatile String defaultWorkspace;
-    private volatile String[] predefinedWorkspaces = new String[] {};
-    private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(
-                                                                                                  SUPPORTS_SAME_NAME_SIBLINGS,
-                                                                                                  DEFAULT_SUPPORTS_UPDATES,
-                                                                                                  SUPPORTS_EVENTS,
-                                                                                                  DEFAULT_SUPPORTS_CREATING_WORKSPACES,
-                                                                                                  SUPPORTS_REFERENCES);
-
-    private transient CachePolicy cachePolicy;
-    private transient CopyOnWriteArraySet<String> availableWorspaceNames;
-
-    /**
-     * Create a repository source instance.
-     */
-    public SVNRepositorySource() {
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#getCapabilities()
-     */
-    public RepositorySourceCapabilities getCapabilities() {
-        return capabilities;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getName() {
-        return this.name;
-    }
-
-    /**
-     * Set the name for the source
-     * 
-     * @param name the new name for the source
-     */
-    public synchronized void setName( String name ) {
-        if (name != null) {
-            name = name.trim();
-            if (name.length() == 0) name = null;
-        }
-        this.name = name;
-    }
-
-    /**
-     * @return the url
-     */
-    public String getRepositoryRootURL() {
-        return this.repositoryRootURL;
-    }
-
-    /**
-     * Set the url for the subversion repository.
-     * 
-     * @param url - the url location.
-     * @throws IllegalArgumentException If svn url is null or empty
-     */
-    public synchronized void setRepositoryRootURL( String url ) {
-        CheckArg.isNotEmpty(url, "RepositoryRootURL");
-        this.repositoryRootURL = url;
-    }
-
-    public String getUsername() {
-        return this.username;
-    }
-
-    /**
-     * @param username
-     */
-    public synchronized void setUsername( String username ) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return this.password;
-    }
-
-    /**
-     * @param password
-     */
-    public synchronized void setPassword( String password ) {
-        this.password = password;
-    }
-
-    /**
-     * Get whether this source supports updates.
-     * 
-     * @return true if this source supports updates, or false if this source only supports reading content.
-     */
-    public boolean getSupportsUpdates() {
-        return capabilities.supportsUpdates();
-    }
-
-    /**
-     * Get the file system path to the existing directory that should be used for the default workspace. If the default is
-     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
-     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
-     * 
-     * @return the file system path to the directory representing the default workspace, or null if the default should be the
-     *         current working directory
-     */
-    public String getDirectoryForDefaultWorkspace() {
-        return defaultWorkspace;
-    }
-
-    /**
-     * Set the file system path to the existing directory that should be used for the default workspace. If the default is
-     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
-     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
-     * 
-     * @param pathToDirectoryForDefaultWorkspace the valid and resolvable file system path to the directory representing the
-     *        default workspace, or null if the current working directory should be used as the default workspace
-     */
-    public synchronized void setDirectoryForDefaultWorkspace( String pathToDirectoryForDefaultWorkspace ) {
-        this.defaultWorkspace = pathToDirectoryForDefaultWorkspace;
-    }
-
-    /**
-     * Gets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
-     * to a directory on the file system.
-     * 
-     * @return the names of the workspaces that this source starts with, or null if there are no such workspaces
-     * @see #setPredefinedWorkspaceNames(String[])
-     * @see #setCreatingWorkspacesAllowed(boolean)
-     */
-    public synchronized String[] getPredefinedWorkspaceNames() {
-        String[] copy = new String[predefinedWorkspaces.length];
-        System.arraycopy(predefinedWorkspaces, 0, copy, 0, predefinedWorkspaces.length);
-        return copy;
-    }
-
-    /**
-     * Sets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
-     * to a directory on the file system.
-     * 
-     * @param predefinedWorkspaceNames the names of the workspaces that this source should start with, or null if there are no
-     *        such workspaces
-     * @see #setCreatingWorkspacesAllowed(boolean)
-     * @see #getPredefinedWorkspaceNames()
-     */
-    public synchronized void setPredefinedWorkspaceNames( String[] predefinedWorkspaceNames ) {
-        this.predefinedWorkspaces = predefinedWorkspaceNames;
-    }
-
-    /**
-     * Get whether this source allows workspaces to be created dynamically.
-     * 
-     * @return true if this source allows workspaces to be created by clients, or false if the set of workspaces is fixed
-     * @see #setPredefinedWorkspaceNames(String[])
-     * @see #getPredefinedWorkspaceNames()
-     * @see #setCreatingWorkspacesAllowed(boolean)
-     */
-    public boolean isCreatingWorkspacesAllowed() {
-        return capabilities.supportsCreatingWorkspaces();
-    }
-
-    /**
-     * Set whether this source allows workspaces to be created dynamically.
-     * 
-     * @param allowWorkspaceCreation true if this source allows workspaces to be created by clients, or false if the set of
-     *        workspaces is fixed
-     * @see #setPredefinedWorkspaceNames(String[])
-     * @see #getPredefinedWorkspaceNames()
-     * @see #isCreatingWorkspacesAllowed()
-     */
-    public synchronized void setCreatingWorkspacesAllowed( boolean allowWorkspaceCreation ) {
-        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), capabilities.supportsUpdates(),
-                                                        capabilities.supportsEvents(), allowWorkspaceCreation,
-                                                        capabilities.supportsReferences());
-    }
-    
-    /**
-     * Get whether this source allows updates.
-     * 
-     * @return true if this source allows updates by clients, or false if no updates are allowed
-     * @see #setUpdatesAllowed(boolean)
-     */
-    public boolean areUpdatesAllowed() {
-        return capabilities.supportsUpdates();
-    }
-    
-    /**
-     * Set whether this source allows updates to data within workspaces
-     * 
-     * @param allowUpdates true if this source allows updates to data within workspaces clients, or false if updates are not
-     *        allowed.
-     * @see #areUpdatesAllowed()
-     */
-    public synchronized void setUpdatesAllowed( boolean allowUpdates ) {
-        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), allowUpdates,
-                                                        capabilities.supportsEvents(), capabilities.supportsCreatingWorkspaces(),
-                                                        capabilities.supportsReferences());
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#getRetryLimit()
-     */
-    public int getRetryLimit() {
-        return retryLimit;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#setRetryLimit(int)
-     */
-    public void setRetryLimit( int limit ) {
-        retryLimit = limit < 0 ? 0 : limit;
-    }
-
-    /**
-     * Get the time in milliseconds that content returned from this source may used while in the cache.
-     * 
-     * @return the time to live, in milliseconds, or 0 if the time to live is not specified by this source
-     */
-    public int getCacheTimeToLiveInMilliseconds() {
-        return cacheTimeToLiveInMilliseconds;
-    }
-
-    /**
-     * Set the time in milliseconds that content returned from this source may used while in the cache.
-     * 
-     * @param cacheTimeToLive the time to live, in milliseconds; 0 if the time to live is not specified by this source; or a
-     *        negative number for the default value
-     */
-    public synchronized void setCacheTimeToLiveInMilliseconds( int cacheTimeToLive ) {
-        if (cacheTimeToLive < 0) cacheTimeToLive = DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS;
-        this.cacheTimeToLiveInMilliseconds = cacheTimeToLive;
-        this.cachePolicy = cacheTimeToLiveInMilliseconds > 0 ? new SVNRepositoryCachePolicy(cacheTimeToLiveInMilliseconds) : null;
-
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#initialize(org.jboss.dna.graph.connector.RepositoryContext)
-     */
-    public synchronized void initialize( RepositoryContext context ) throws RepositorySourceException {
-        // No need to do anything
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals( Object obj ) {
-        if (obj == this) return true;
-        if (obj instanceof SVNRepositorySource) {
-            SVNRepositorySource that = (SVNRepositorySource)obj;
-            if (this.getName() == null) {
-                if (that.getName() != null) return false;
-            } else {
-                if (!this.getName().equals(that.getName())) return false;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see javax.naming.Referenceable#getReference()
-     */
-    public synchronized Reference getReference() {
-        String className = getClass().getName();
-        String factoryClassName = this.getClass().getName();
-        Reference ref = new Reference(className, factoryClassName, null);
-
-        if (getName() != null) {
-            ref.add(new StringRefAddr(SOURCE_NAME, getName()));
-        }
-        if (getRepositoryRootURL() != null) {
-            ref.add(new StringRefAddr(SVN_REPOSITORY_ROOT_URL, getRepositoryRootURL()));
-        }
-        if (getUsername() != null) {
-            ref.add(new StringRefAddr(SVN_USERNAME, getUsername()));
-        }
-        if (getPassword() != null) {
-            ref.add(new StringRefAddr(SVN_PASSWORD, getPassword()));
-        }
-        ref.add(new StringRefAddr(CACHE_TIME_TO_LIVE_IN_MILLISECONDS, Integer.toString(getCacheTimeToLiveInMilliseconds())));
-        ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
-        ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDirectoryForDefaultWorkspace()));
-        ref.add(new StringRefAddr(ALLOW_CREATING_WORKSPACES, Boolean.toString(isCreatingWorkspacesAllowed())));
-        String[] workspaceNames = getPredefinedWorkspaceNames();
-        if (workspaceNames != null && workspaceNames.length != 0) {
-            ref.add(new StringRefAddr(PREDEFINED_WORKSPACE_NAMES, StringUtil.combineLines(workspaceNames)));
-        }
-        return ref;
-
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context,
-     *      java.util.Hashtable)
-     */
-    public Object getObjectInstance( Object obj,
-                                     Name name,
-                                     Context nameCtx,
-                                     Hashtable<?, ?> environment ) throws Exception {
-        if (obj instanceof Reference) {
-            Map<String, String> values = new HashMap<String, String>();
-            Reference ref = (Reference)obj;
-            Enumeration<?> en = ref.getAll();
-            while (en.hasMoreElements()) {
-                RefAddr subref = (RefAddr)en.nextElement();
-                if (subref instanceof StringRefAddr) {
-                    String key = subref.getType();
-                    Object value = subref.getContent();
-                    if (value != null) values.put(key, value.toString());
-                }
-            }
-            String sourceName = values.get(SOURCE_NAME);
-            String repositoryRootURL = values.get(SVN_REPOSITORY_ROOT_URL);
-            String username = values.get(SVN_USERNAME);
-            String password = values.get(SVN_PASSWORD);
-            String cacheTtlInMillis = values.get(CACHE_TIME_TO_LIVE_IN_MILLISECONDS);
-            String retryLimit = values.get(RETRY_LIMIT);
-            String defaultWorkspace = values.get(DEFAULT_WORKSPACE);
-            String createWorkspaces = values.get(ALLOW_CREATING_WORKSPACES);
-
-            String combinedWorkspaceNames = values.get(PREDEFINED_WORKSPACE_NAMES);
-            String[] workspaceNames = null;
-            if (combinedWorkspaceNames != null) {
-                List<String> paths = StringUtil.splitLines(combinedWorkspaceNames);
-                workspaceNames = paths.toArray(new String[paths.size()]);
-            }
-            // Create the source instance ...
-            SVNRepositorySource source = new SVNRepositorySource();
-            if (sourceName != null) source.setName(sourceName);
-            if (cacheTtlInMillis != null) source.setCacheTimeToLiveInMilliseconds(Integer.parseInt(cacheTtlInMillis));
-            if (repositoryRootURL != null) source.setRepositoryRootURL(repositoryRootURL);
-            if (username != null) source.setUsername(username);
-            if (password != null) source.setPassword(password);
-            if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
-            if (defaultWorkspace != null) source.setDirectoryForDefaultWorkspace(defaultWorkspace);
-            if (createWorkspaces != null) source.setCreatingWorkspacesAllowed(Boolean.parseBoolean(createWorkspaces));
-            if (workspaceNames != null && workspaceNames.length != 0) source.setPredefinedWorkspaceNames(workspaceNames);
-            return source;
-        }
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#getConnection()
-     */
-    public synchronized RepositoryConnection getConnection() throws RepositorySourceException {
-
-        String sourceName = getName();
-        if (sourceName == null || sourceName.trim().length() == 0) {
-            I18n msg = SVNRepositoryConnectorI18n.propertyIsRequired;
-            throw new RepositorySourceException(getName(), msg.text("name"));
-        }
-
-        String sourceUsername = getUsername();
-        if (sourceUsername == null || sourceUsername.trim().length() == 0) {
-            I18n msg = SVNRepositoryConnectorI18n.propertyIsRequired;
-            throw new RepositorySourceException(getUsername(), msg.text("username"));
-        }
-
-        String sourcePassword = getPassword();
-        if (sourcePassword == null) {
-            I18n msg = SVNRepositoryConnectorI18n.propertyIsRequired;
-            throw new RepositorySourceException(getPassword(), msg.text("password"));
-        }
-
-        String repositoryRootURL = getRepositoryRootURL();
-        if (repositoryRootURL == null || repositoryRootURL.trim().length() == 0) {
-            I18n msg = SVNRepositoryConnectorI18n.propertyIsRequired;
-            throw new RepositorySourceException(getRepositoryRootURL(), msg.text("repositoryRootURL"));
-        }
-
-        SVNRepository repos = null;
-        // Report the warnings for non-existant predefined workspaces
-        boolean reportWarnings = false;
-        if (this.availableWorspaceNames == null) {
-            // Set up the predefined workspace names ...
-            this.availableWorspaceNames = new CopyOnWriteArraySet<String>();
-            for (String predefined : this.predefinedWorkspaces) {
-                // if exist e.i trunk/ /branches /tags
-                this.availableWorspaceNames.add(predefined);
-            }
-            // Report the warnings for non-existant predefined workspaces and we
-            // take it that if no predefined workspace exist
-            // we will take the repository root url as a pseudo workspace
-            reportWarnings = true;
-            for (String url : this.availableWorspaceNames) {
-                // check if the predefined workspaces exist.
-                if (repos != null) {
-                    SVNRepositoryUtil.setNewSVNRepositoryLocation(repos, url, true, sourceName);
-                } else {
-                    repos = SVNRepositoryUtil.createRepository(url, sourceUsername, sourcePassword);
-                }
-                if (!SVNRepositoryUtil.exist(repos)) {
-
-                    Logger.getLogger(getClass()).warn(SVNRepositoryConnectorI18n.pathForPredefinedWorkspaceDoesNotExist,
-                                                      url,
-                                                      name);
-                }
-                if (!SVNRepositoryUtil.isDirectory(repos, "")) {
-                    Logger.getLogger(getClass()).warn(SVNRepositoryConnectorI18n.pathForPredefinedWorkspaceIsNotDirectory,
-                                                      url,
-                                                      name);
-                }
-            }
-        }
-
-        boolean supportsUpdates = getSupportsUpdates();
-
-        SVNRepository defaultWorkspace = null;
-        if (repos != null) {
-            SVNRepositoryUtil.setNewSVNRepositoryLocation(repos, getRepositoryRootURL(), true, sourceName);
-            defaultWorkspace = repos;
-        } else {
-            defaultWorkspace = SVNRepositoryUtil.createRepository(getRepositoryRootURL(), sourceUsername, sourcePassword);
-        }
-
-        String defaultURL = getDirectoryForDefaultWorkspace();
-        if (defaultURL != null) {
-            // Look for the entry at this path .....
-            SVNRepository repository = SVNRepositoryUtil.createRepository(defaultURL, sourceUsername, sourcePassword);
-            I18n warning = null;
-            if (!SVNRepositoryUtil.exist(repository)) {
-                warning = SVNRepositoryConnectorI18n.pathForPredefinedWorkspaceDoesNotExist;
-            } else if (!SVNRepositoryUtil.isDirectory(repository, "")) {
-                warning = SVNRepositoryConnectorI18n.pathForPredefinedWorkspaceIsNotDirectory;
-            } else {
-                // is a directory and is good to use!
-                defaultWorkspace = repository;
-            }
-            if (reportWarnings && warning != null) {
-                Logger.getLogger(getClass()).warn(warning, defaultURL, name);
-            }
-        }
-        this.availableWorspaceNames.add(defaultWorkspace.getLocation().toDecodedString());
-        return new SVNRepositoryConnection(name, defaultWorkspace, availableWorspaceNames, isCreatingWorkspacesAllowed(),
-                                           cachePolicy, supportsUpdates, new RepositoryAccessData(getRepositoryRootURL(),
-                                                                                                  sourceUsername, sourcePassword));
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositorySource#close()
-     */
-    public synchronized void close() {
-        this.availableWorspaceNames = null;
-    }
-
-    @Immutable
-    /* package */class SVNRepositoryCachePolicy implements CachePolicy {
-        private static final long serialVersionUID = 1L;
-        private final int ttl;
-
-        /* package */SVNRepositoryCachePolicy( int ttl ) {
-            this.ttl = ttl;
-        }
-
-        public long getTimeToLive() {
-            return ttl;
-        }
-
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,235 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.connector.svn;
-
-import java.util.Collection;
-import java.util.Collections;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.request.InvalidWorkspaceException;
-import org.tmatesoft.svn.core.SVNDirEntry;
-import org.tmatesoft.svn.core.SVNErrorCode;
-import org.tmatesoft.svn.core.SVNErrorMessage;
-import org.tmatesoft.svn.core.SVNException;
-import org.tmatesoft.svn.core.SVNNodeKind;
-import org.tmatesoft.svn.core.SVNURL;
-import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
-import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
-import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
-import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
-import org.tmatesoft.svn.core.io.SVNRepository;
-import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
-import org.tmatesoft.svn.core.wc.SVNWCUtil;
-
-/**
- */
-public class SVNRepositoryUtil {
-
-    /**
-     * @param url
-     * @param sourceName
-     * @return SVNURL
-     */
-    public static SVNURL createSVNURL( String url,
-                                       String sourceName ) {
-
-        SVNURL theUrl;
-        try {
-            theUrl = SVNURL.parseURIDecoded(url);
-        } catch (SVNException e) {
-            // protocol not supported by this connector
-            throw new RepositorySourceException(sourceName,
-                                                "Protocol is not supported by this connector or there is problem in the svn url");
-        }
-        return theUrl;
-    }
-
-    public static void setNewSVNRepositoryLocation( SVNRepository oldRespository,
-                                                    String url,
-                                                    boolean forceReconnect,
-                                                    String sourceName ) {
-        try {
-            oldRespository.setLocation(createSVNURL(url, sourceName), forceReconnect);
-        } catch (SVNException e) {
-            throw new RepositorySourceException(sourceName, "the old url and a new one has got different protocols");
-        }
-    }
-
-    /**
-     * @param repository
-     * @param path
-     * @param revisionNumber
-     * @param sourceName
-     * @return SVNNodeKind
-     */
-    public static SVNNodeKind checkThePath( SVNRepository repository,
-                                            String path,
-                                            long revisionNumber,
-                                            String sourceName ) {
-        SVNNodeKind kind;
-        try {
-            kind = repository.checkPath(path, revisionNumber);
-
-        } catch (SVNException e) {
-            return null;
-        }
-        return kind;
-    }
-
-    /**
-     * Create a {@link SVNRepository} from a http protocol.
-     * 
-     * @param url - the url of the repository.
-     * @param username - username credential.
-     * @param password - password credential
-     * @return {@link SVNRepository}.
-     */
-    public static SVNRepository createRepository( String url,
-                                                  String username,
-                                                  String password ) {
-        // for DAV (over http and https)
-        DAVRepositoryFactory.setup();
-        // For File
-        FSRepositoryFactory.setup();
-        // for SVN (over svn and svn+ssh)
-        SVNRepositoryFactoryImpl.setup();
-
-        // The factory knows how to create a DAVRepository
-        SVNRepository repository;
-        try {
-            repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
-
-            ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
-            repository.setAuthenticationManager(authManager);
-        } catch (SVNException e) {
-            throw new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(e.getMessage()));
-        }
-        return repository;
-    }
-
-    /**
-     * Util to get the last segment from a path.
-     * 
-     * @param repository
-     * @return last segment.
-     */
-    public static String getRepositoryWorspaceName( SVNRepository repository ) {
-        String[] segments = repository.getLocation().getPath().split("/");
-        return segments[segments.length - 1];
-    }
-
-    private SVNRepositoryUtil() {
-        // prvent construction
-    }
-
-    /**
-     * Check if the repository path exist.
-     * 
-     * @param repos
-     * @return true if repository exist and false otherwise.
-     */
-    public static boolean exist( SVNRepository repos ) {
-        try {
-            SVNNodeKind kind = repos.checkPath("", -1);
-            if (kind == SVNNodeKind.NONE) {
-                return false;
-            }
-            return true;
-
-        } catch (SVNException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Check if repository path is a directory.
-     * 
-     * @param repos
-     * @param path
-     * @return true if repository path is a directory and false otherwise.
-     */
-    public static boolean isDirectory( SVNRepository repos,
-                                       String path ) {
-        try {
-            SVNNodeKind kind = repos.checkPath(path, -1);
-            if (kind == SVNNodeKind.DIR) {
-                return true;
-            }
-        } catch (SVNException e) {
-            return false;
-        }
-        return false;
-    }
-
-    /**
-     * @param repos
-     * @param path
-     * @return a collect of entry from directory path; never null
-     */
-    @SuppressWarnings( "unchecked" )
-    public static Collection<SVNDirEntry> getDir( SVNRepository repos,
-                                                  String path ) {
-        try {
-            return repos.getDir(path, -1, null, (Collection<SVNDirEntry>)null);
-        } catch (SVNException e) {
-            return Collections.emptyList();
-        }
-    }
-
-    /**
-     * Check if the path is a file.
-     * 
-     * @param repos
-     * @param path
-     * @return true if the path is a file and false otherwise.
-     */
-    public static boolean isFile( SVNRepository repos,
-                                  String path ) {
-        try {
-            SVNNodeKind kind = repos.checkPath(path, -1);
-            if (kind == SVNNodeKind.FILE) {
-                return true;
-            }
-        } catch (SVNException e) {
-            return false;
-        }
-        return false;
-    }
-
-    public static boolean exists( SVNRepository repository,
-                                  String path ) throws SVNException{
-        try {
-            if (repository.checkPath(path, -1) == SVNNodeKind.NONE) {
-                return false;
-            } else if (repository.checkPath(path, -1) == SVNNodeKind.UNKNOWN) {
-                return false;
-            }
-        } catch (SVNException e) {
-            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
-                                                         "unknow error during delete action: {0)",
-                                                         e.getMessage());
-            throw new SVNException(err);
-        }
-        return true;
-    }
-}

Deleted: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java	2010-01-04 20:58:21 UTC (rev 1523)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -1,29 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-/**
- * The classes that make up the connector that accesses content from an SVN repository.
- */
-
-package org.jboss.dna.connector.svn;
-

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,73 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import org.jboss.dna.connector.scm.ScmAction;
+import org.jboss.dna.connector.scm.ScmActionExecutor;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.io.ISVNEditor;
+import org.tmatesoft.svn.core.io.SVNRepository;
+
+/**
+ */
+public class SvnActionExecutor implements ScmActionExecutor {
+
+    private final SVNRepository repository;
+
+    /**
+     * @param repository
+     */
+    public SvnActionExecutor( SVNRepository repository ) {
+        this.repository = repository;
+    }
+
+    /**
+     * @return repository
+     */
+    public SVNRepository getRepository() {
+        return repository;
+    }
+
+    /**
+     * @param action
+     * @param message
+     * @throws SVNException
+     */
+    public void execute( ScmAction action,
+                         String message ) throws SVNException {
+        ISVNEditor editor = this.repository.getCommitEditor(message, null);
+        editor.openRoot(-1);
+        try {
+            action.applyAction(editor);
+        } catch (Exception e) {
+            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: '{0}'", e.getMessage());
+            throw new SVNException(err, e);
+        }
+        editor.closeDir();
+        editor.closeEdit();
+
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,889 @@
+package org.jboss.dna.connector.svn2;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.connector.scm.ScmAction;
+import org.jboss.dna.connector.svn.mgnt.AddDirectory;
+import org.jboss.dna.connector.svn.mgnt.AddFile;
+import org.jboss.dna.connector.svn.mgnt.DeleteEntry;
+import org.jboss.dna.connector.svn.mgnt.UpdateFile;
+import org.jboss.dna.graph.DnaIntLexicon;
+import org.jboss.dna.graph.DnaLexicon;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.JcrNtLexicon;
+import org.jboss.dna.graph.NodeConflictBehavior;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractWritablePathWorkspace;
+import org.jboss.dna.graph.connector.path.DefaultPathNode;
+import org.jboss.dna.graph.connector.path.PathNode;
+import org.jboss.dna.graph.connector.path.WritablePathRepository;
+import org.jboss.dna.graph.connector.path.WritablePathWorkspace;
+import org.jboss.dna.graph.connector.path.cache.WorkspaceCache;
+import org.jboss.dna.graph.property.Binary;
+import org.jboss.dna.graph.property.BinaryFactory;
+import org.jboss.dna.graph.property.DateTimeFactory;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.NameFactory;
+import org.jboss.dna.graph.property.NamespaceRegistry;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.PathFactory;
+import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.property.PropertyFactory;
+import org.jboss.dna.graph.property.Path.Segment;
+import org.jboss.dna.graph.request.InvalidRequestException;
+import org.tmatesoft.svn.core.SVNDirEntry;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNProperties;
+import org.tmatesoft.svn.core.SVNProperty;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+public class SvnRepository extends WritablePathRepository {
+
+    private static final String DEFAULT_MIME_TYPE = "application/octet-stream";
+    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+
+    private final SvnRepositorySource source;
+
+    static {
+        // for DAV (over http and https)
+        DAVRepositoryFactory.setup();
+        // For File
+        FSRepositoryFactory.setup();
+        // for SVN (over svn and svn+ssh)
+        SVNRepositoryFactoryImpl.setup();
+    }
+
+    public SvnRepository( SvnRepositorySource source ) {
+        super(source);
+
+        this.source = source;
+        initialize();
+    }
+
+    @Override
+    protected void initialize() {
+        ExecutionContext context = source.getRepositoryContext().getExecutionContext();
+        for (String workspaceName : source.getPredefinedWorkspaceNames()) {
+            doCreateWorkspace(context, workspaceName);
+        }
+
+        String defaultWorkspaceName = source.getDirectoryForDefaultWorkspace();
+        if (defaultWorkspaceName != null && !workspaces.containsKey(defaultWorkspaceName)) {
+            doCreateWorkspace(context, defaultWorkspaceName);
+        }
+
+    }
+
+    public WorkspaceCache getCache( String workspaceName ) {
+        return source.getPathRepositoryCache().getCache(workspaceName);
+    }
+
+    /**
+     * Internal method that creates a workspace and adds it to the map of active workspaces without checking to see if the source
+     * allows creating workspaces. This is useful when setting up predefined workspaces.
+     * 
+     * @param context the current execution context; may not be null
+     * @param name the name of the workspace to create; may not be null
+     * @return the newly created workspace; never null
+     */
+    private WritablePathWorkspace doCreateWorkspace( ExecutionContext context,
+                                                     String name ) {
+        SvnWorkspace workspace = new SvnWorkspace(name, source.getRootNodeUuid());
+
+        workspaces.putIfAbsent(name, workspace);
+        return (WritablePathWorkspace)workspaces.get(name);
+
+    }
+
+    @Override
+    protected WritablePathWorkspace createWorkspace( ExecutionContext context,
+                                                     String name ) {
+        if (!source.isCreatingWorkspacesAllowed()) {
+            String msg = SvnRepositoryConnectorI18n.unableToCreateWorkspaces.text(getSourceName(), name);
+            throw new InvalidRequestException(msg);
+        }
+
+        return doCreateWorkspace(context, name);
+    }
+
+    class SvnWorkspace extends AbstractWritablePathWorkspace {
+
+        /**
+         * Only certain properties are tolerated when writing content (dna:resource or jcr:resource) nodes. These properties are
+         * implicitly stored (primary type, data) or silently ignored (encoded, mimetype, last modified). The silently ignored
+         * properties must be accepted to stay compatible with the JCR specification.
+         */
+        private final Set<Name> ALLOWABLE_PROPERTIES_FOR_CONTENT = Collections.unmodifiableSet(new HashSet<Name>(
+                                                                                                                 Arrays.asList(new Name[] {
+                                                                                                                     JcrLexicon.PRIMARY_TYPE,
+                                                                                                                     JcrLexicon.DATA,
+                                                                                                                     JcrLexicon.ENCODED,
+                                                                                                                     JcrLexicon.MIMETYPE,
+                                                                                                                     JcrLexicon.LAST_MODIFIED,
+                                                                                                                     JcrLexicon.UUID,
+                                                                                                                     DnaIntLexicon.NODE_DEFINITON})));
+        /**
+         * Only certain properties are tolerated when writing files (nt:file) or folders (nt:folder) nodes. These properties are
+         * implicitly stored in the file or folder (primary type, created).
+         */
+        private final Set<Name> ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER = Collections.unmodifiableSet(new HashSet<Name>(
+                                                                                                                        Arrays.asList(new Name[] {
+                                                                                                                            JcrLexicon.PRIMARY_TYPE,
+                                                                                                                            JcrLexicon.CREATED,
+                                                                                                                            JcrLexicon.UUID,
+                                                                                                                            DnaIntLexicon.NODE_DEFINITON})));
+
+        private final SVNRepository workspaceRoot;
+
+        public SvnWorkspace( String name,
+                             UUID rootNodeUuid ) {
+            super(name, rootNodeUuid);
+
+            try {
+                workspaceRoot = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(name));
+
+                ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(source.getUsername(),
+                                                                                                     source.getPassword());
+                workspaceRoot.setAuthenticationManager(authManager);
+            } catch (SVNException ex) {
+                throw new IllegalStateException(ex);
+            }
+        }
+
+        public Path getLowestExistingPath( Path path ) {
+            do {
+                path = path.getParent();
+
+                if (getNode(path) != null) {
+                    return path;
+                }
+            } while (path != null);
+
+            assert false : "workspace root path was not a valid path";
+            return null;
+        }
+
+        public PathNode getNode( Path path ) {
+            WorkspaceCache cache = getCache(getName());
+
+            PathNode node = cache.get(path);
+            if (node != null) return node;
+
+            ExecutionContext context = source.getRepositoryContext().getExecutionContext();
+            List<Property> properties = new LinkedList<Property>();
+            List<Segment> children = new LinkedList<Segment>();
+
+            try {
+                boolean result = readNode(context, this.getName(), path, properties, children);
+                if (!result) return null;
+            } catch (SVNException ex) {
+                return null;
+            }
+
+            UUID uuid = path.isRoot() ? source.getRootNodeUuid() : null;
+            node = new DefaultPathNode(path, uuid, properties, children);
+
+            cache.set(node);
+            return node;
+        }
+
+        public PathNode createNode( ExecutionContext context,
+                                    PathNode parentNode,
+                                    Name name,
+                                    Map<Name, Property> properties,
+                                    NodeConflictBehavior conflictBehavior ) {
+
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+            NameFactory nameFactory = context.getValueFactories().getNameFactory();
+            PathFactory pathFactory = context.getValueFactories().getPathFactory();
+
+            // New name to commit into the svn repos workspace
+            String newName = name.getString(registry);
+
+            Property primaryTypeProp = properties.get(JcrLexicon.PRIMARY_TYPE);
+            Name primaryType = primaryTypeProp == null ? null : nameFactory.create(primaryTypeProp.getFirstValue());
+
+            Path parentPath = parentNode.getPath();
+            String parentPathAsString = parentPath.getString(registry);
+            Path newPath = pathFactory.create(parentPath, name);
+
+            String newChildPath = null;
+
+            // File
+            if (JcrNtLexicon.FILE.equals(primaryType)) {
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
+                // Parent node already exist
+                boolean skipWrite = false;
+
+                if (parentPath.isRoot()) {
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newName;
+                    } else {
+                        newChildPath = "/" + newName;
+                    }
+                } else {
+                    newChildPath = newPath.getString(registry);
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newChildPath.substring(1);
+                    }
+                }
+
+                // check if the new name already exist
+                try {
+                    if (SvnRepositoryUtil.exists(workspaceRoot, newChildPath)) {
+                        if (conflictBehavior.equals(NodeConflictBehavior.APPEND)) {
+                            I18n msg = SvnRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
+                            throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
+                        } else if (conflictBehavior.equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
+                            skipWrite = true;
+                        }
+                    }
+                } catch (SVNException e1) {
+                    throw new RepositorySourceException(getSourceName(), e1.getMessage());
+                }
+
+                // Don't try to write if the node conflict behavior is DO_NOT_REPLACE
+                if (!skipWrite) {
+                    // create a new, empty file
+                    if (newChildPath != null) {
+                        try {
+                            String rootPath = null;
+                            if (parentPath.isRoot()) {
+                                rootPath = "";
+                            } else {
+                                rootPath = parentPathAsString;
+                            }
+                            newFile(rootPath, newName, EMPTY_BYTE_ARRAY, null, getName(), workspaceRoot);
+                        } catch (SVNException e) {
+                            I18n msg = SvnRepositoryConnectorI18n.couldNotCreateFile;
+                            throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                          getName(),
+                                                                                          getSourceName(),
+                                                                                          e.getMessage()), e);
+                        }
+                    }
+                }
+            } else if (JcrNtLexicon.RESOURCE.equals(primaryType) || DnaLexicon.RESOURCE.equals(primaryType)) { // Resource
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_CONTENT);
+                if (parentPath.isRoot()) {
+                    newChildPath = parentPathAsString;
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = parentPathAsString.substring(1);
+                    }
+                } else {
+                    newChildPath = parentPathAsString;
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newChildPath.substring(1);
+                    }
+                }
+
+                if (!JcrLexicon.CONTENT.equals(name)) {
+                    I18n msg = SvnRepositoryConnectorI18n.invalidNameForResource;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                  getName(),
+                                                                                  getSourceName(),
+                                                                                  newName));
+                }
+
+                Property parentPrimaryType = parentNode.getProperty(JcrLexicon.PRIMARY_TYPE);
+                Name parentPrimaryTypeName = parentPrimaryType == null ? null : nameFactory.create(parentPrimaryType.getFirstValue());
+                if (!JcrNtLexicon.FILE.equals(parentPrimaryTypeName)) {
+                    I18n msg = SvnRepositoryConnectorI18n.invalidPathForResource;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString, getName(), getSourceName()));
+                }
+
+                boolean skipWrite = false;
+                if (conflictBehavior.equals(NodeConflictBehavior.APPEND)) {
+                    I18n msg = SvnRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
+                    throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
+                } else if (conflictBehavior.equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
+                    // TODO check if the file already has content
+                    skipWrite = true;
+                }
+
+                if (!skipWrite) {
+                    Property dataProperty = properties.get(JcrLexicon.DATA);
+                    if (dataProperty == null) {
+                        I18n msg = SvnRepositoryConnectorI18n.missingRequiredProperty;
+                        String dataPropName = JcrLexicon.DATA.getString(registry);
+                        throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                      getName(),
+                                                                                      getSourceName(),
+                                                                                      dataPropName));
+                    }
+
+                    BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                    Binary binary = binaryFactory.create(properties.get(JcrLexicon.DATA).getFirstValue());
+                    // get old data
+                    ByteArrayOutputStream contents = new ByteArrayOutputStream();
+                    SVNProperties svnProperties = new SVNProperties();
+                    try {
+                        workspaceRoot.getFile(newChildPath, -1, svnProperties, contents);
+                        byte[] oldData = contents.toByteArray();
+
+                        // modify the empty old data with the new resource
+                        if (oldData != null) {
+                            String pathToFile;
+                            if (parentPath.isRoot()) {
+                                pathToFile = "";
+                            } else {
+                                pathToFile = parentPath.getParent().getString(registry);
+                            }
+                            String fileName = parentPath.getLastSegment().getString(registry);
+
+                            modifyFile(pathToFile, fileName, oldData, binary.getBytes(), null, getName(), workspaceRoot);
+                        }
+                    } catch (SVNException e) {
+                        I18n msg = SvnRepositoryConnectorI18n.couldNotReadData;
+                        throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                      getName(),
+                                                                                      getSourceName(),
+                                                                                      e.getMessage()), e);
+                    }
+                }
+
+            } else if (JcrNtLexicon.FOLDER.equals(primaryType) || primaryType == null) { // Folder
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
+                try {
+                    mkdir(parentPathAsString, newName, null, getName(), workspaceRoot);
+                } catch (SVNException e) {
+                    I18n msg = SvnRepositoryConnectorI18n.couldNotCreateFile;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                  getName(),
+                                                                                  getSourceName(),
+                                                                                  e.getMessage()), e);
+                }
+            } else {
+                I18n msg = SvnRepositoryConnectorI18n.unsupportedPrimaryType;
+                throw new RepositorySourceException(getSourceName(), msg.text(primaryType.getString(registry),
+                                                                              parentPathAsString,
+                                                                              getName(),
+                                                                              getSourceName()));
+            }
+
+            PathNode node = getNode(newPath);
+
+            List<Segment> newChildren = new ArrayList<Segment>(parentNode.getChildSegments().size() + 1);
+            newChildren.addAll(parentNode.getChildSegments());
+            newChildren.add(node.getPath().getLastSegment());
+
+            WorkspaceCache cache = getCache(getName());
+            cache.set(new DefaultPathNode(parentNode.getPath(), parentNode.getUuid(), parentNode.getProperties(), newChildren));
+            cache.set(node);
+
+            return node;
+        }
+
+        /**
+         * Create a directory .
+         * 
+         * @param rootDirPath - the root directory where the created directory will reside
+         * @param childDirPath - the name of the created directory.
+         * @param comment - comment for the creation.
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException - if during the creation, there is an error.
+         */
+        private void mkdir( String rootDirPath,
+                            String childDirPath,
+                            String comment,
+                            String inWorkspace,
+                            SVNRepository currentRepository ) throws SVNException {
+
+            String tempParentPath = rootDirPath;
+            if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
+                    tempParentPath = tempParentPath.substring(1);
+                } else if (tempParentPath.equals("/")) {
+                    tempParentPath = "";
+                }
+            }
+            String checkPath = tempParentPath.length() == 0 ? childDirPath : tempParentPath + "/" + childDirPath;
+            SVNNodeKind nodeKind = null;
+            try {
+                nodeKind = currentRepository.checkPath(checkPath, -1);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "May be a Connecting problem to the repository or a user's authentication failure: {0}",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+
+            if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
+                ScmAction addNodeAction = new AddDirectory(rootDirPath, childDirPath);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Create a new file " + childDirPath : comment;
+                executor.execute(addNodeAction, comment);
+            } else {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "Node with name '{0}' can't be created",
+                                                             childDirPath);
+                throw new SVNException(err);
+            }
+        }
+
+        /**
+         * Create a file.
+         * 
+         * @param rootDirPath
+         * @param childFilePath
+         * @param content
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void newFile( String rootDirPath,
+                              String childFilePath,
+                              byte[] content,
+                              String comment,
+                              String inWorkspace,
+                              SVNRepository currentRepository ) throws SVNException {
+
+            String tempParentPath = rootDirPath;
+            if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
+                    tempParentPath = tempParentPath.substring(1);
+                }
+            }
+            String checkPath = tempParentPath + "/" + childFilePath;
+            SVNNodeKind nodeKind = null;
+            try {
+                nodeKind = currentRepository.checkPath(checkPath, -1);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "May be a Connecting problem to the repository or a user's authentication failure: {0}",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+
+            if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
+                ScmAction addFileNodeAction = new AddFile(rootDirPath, childFilePath, content);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Create a new file " + childFilePath : comment;
+                executor.execute(addFileNodeAction, comment);
+            } else {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "Item with name '{0}' can't be created (already exist)",
+                                                             childFilePath);
+                throw new SVNException(err);
+            }
+        }
+
+        /**
+         * Modify a file
+         * 
+         * @param rootPath
+         * @param fileName
+         * @param oldData
+         * @param newData
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void modifyFile( String rootPath,
+                                 String fileName,
+                                 byte[] oldData,
+                                 byte[] newData,
+                                 String comment,
+                                 String inWorkspace,
+                                 SVNRepository currentRepository ) throws SVNException {
+            assert rootPath != null;
+            assert fileName != null;
+            assert oldData != null;
+            assert inWorkspace != null;
+            assert currentRepository != null;
+
+            try {
+
+                if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                    if (rootPath.equals("/")) {
+                        rootPath = "";
+                    } else {
+                        rootPath = rootPath.substring(1) + "/";
+                    }
+                } else {
+                    if (!rootPath.equals("/")) {
+                        rootPath = rootPath + "/";
+                    }
+                }
+                String path = rootPath + fileName;
+
+                SVNNodeKind nodeKind = currentRepository.checkPath(path, -1);
+                if (nodeKind == SVNNodeKind.NONE || nodeKind == SVNNodeKind.UNKNOWN) {
+                    SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ENTRY_NOT_FOUND,
+                                                                 "Item with name '{0}' can't be found",
+                                                                 path);
+                    throw new SVNException(err);
+                }
+
+                ScmAction modifyFileAction = new UpdateFile(rootPath, fileName, oldData, newData);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "modify the " + fileName : comment;
+                executor.execute(modifyFileAction, comment);
+
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: " + e.getMessage());
+                throw new SVNException(err, e);
+            }
+
+        }
+
+        /**
+         * Delete entry from the repository
+         * 
+         * @param path
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void eraseEntry( String path,
+                                 String comment,
+                                 String inWorkspace,
+                                 SVNRepository currentRepository ) throws SVNException {
+            assert path != null;
+            assert inWorkspace != null;
+            if (path.equals("/") || path.equals("")) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.BAD_URL, "The root directory cannot be deleted");
+                throw new SVNException(err);
+            }
+
+            try {
+                ScmAction deleteEntryAction = new DeleteEntry(path);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Delete the " + path : comment;
+                executor.execute(deleteEntryAction, comment);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "unknow error during delete action: {0)",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+        }
+
+        public boolean removeNode( ExecutionContext context,
+                                   Path nodePath ) {
+
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            boolean isContentNode = !nodePath.isRoot() && JcrLexicon.CONTENT.equals(nodePath.getLastSegment().getName());
+            Path actualPath = isContentNode ? nodePath.getParent() : nodePath;
+
+            try {
+                SVNNodeKind kind = getNodeKind(context, actualPath, source.getRepositoryRootUrl());
+
+                if (kind == SVNNodeKind.NONE) {
+                    return false;
+                }
+
+                if (isContentNode) {
+                    String rootPath = actualPath.getParent().getString(registry);
+                    String fileName = actualPath.getLastSegment().getString(registry);
+                    modifyFile(rootPath, fileName, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, null, getName(), workspaceRoot);
+                } else {
+                    eraseEntry(actualPath.getString(registry), null, getName(), workspaceRoot);
+                }
+            } catch (SVNException e) {
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.deleteFailed.text(nodePath, getSourceName()));
+            }
+
+            getCache(getName()).invalidate(nodePath);
+
+            return true;
+        }
+
+        public PathNode setProperties( ExecutionContext context,
+                                       Path nodePath,
+                                       Map<Name, Property> properties ) {
+            PathNode targetNode = getNode(nodePath);
+            if (targetNode == null) return null;
+
+            /*
+             * You can't really remove any properties from SVN nodes.
+             * You can clear the data of a dna:resource though
+             */
+
+            NameFactory nameFactory = context.getValueFactories().getNameFactory();
+            Property primaryTypeProperty = targetNode.getProperty(JcrLexicon.PRIMARY_TYPE);
+            Name primaryTypeName = primaryTypeProperty == null ? null : nameFactory.create(primaryTypeProperty.getFirstValue());
+            if (DnaLexicon.RESOURCE.equals(primaryTypeName)) {
+
+                for (Map.Entry<Name, Property> entry : properties.entrySet()) {
+                    if (JcrLexicon.DATA.equals(entry.getKey())) {
+                        NamespaceRegistry registry = context.getNamespaceRegistry();
+                        byte[] data;
+                        if (entry.getValue() == null) {
+                            data = EMPTY_BYTE_ARRAY;
+                        } else {
+                            BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                            data = binaryFactory.create(entry.getValue().getFirstValue()).getBytes();
+
+                        }
+
+                        try {
+                            Path actualPath = nodePath.getParent();
+                            modifyFile(actualPath.getParent().getString(registry),
+                                       actualPath.getLastSegment().getString(registry),
+                                       EMPTY_BYTE_ARRAY,
+                                       data,
+                                       "",
+                                       getName(),
+                                       workspaceRoot);
+
+                            PathNode node = getNode(nodePath);
+                            getCache(getName()).set(node);
+
+                            return node;
+                        } catch (SVNException ex) {
+                            throw new RepositorySourceException(getSourceName(),
+                                                                SvnRepositoryConnectorI18n.deleteFailed.text(nodePath,
+                                                                                                             getSourceName()), ex);
+                        }
+                    }
+                }
+            }
+
+            return targetNode;
+        }
+
+        protected boolean readNode( ExecutionContext context,
+                                    String workspaceName,
+                                    Path requestedPath,
+                                    List<Property> properties,
+                                    List<Segment> children ) throws SVNException {
+            PathFactory pathFactory = context.getValueFactories().getPathFactory();
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            if (requestedPath.isRoot()) {
+                // workspace root must be a directory
+                if (children != null) {
+                    final Collection<SVNDirEntry> entries = SvnRepositoryUtil.getDir(workspaceRoot, "");
+                    for (SVNDirEntry entry : entries) {
+                        // All of the children of a directory will be another directory or a file, but never a "jcr:content" node
+                        // ...
+                        children.add(pathFactory.createSegment(entry.getName()));
+                    }
+                }
+                // There are no properties on the root ...
+            } else {
+                // Generate the properties for this File object ...
+                PropertyFactory factory = context.getPropertyFactory();
+                DateTimeFactory dateFactory = context.getValueFactories().getDateFactory();
+
+                // Figure out the kind of node this represents ...
+                SVNNodeKind kind = getNodeKind(context, requestedPath, source.getRepositoryRootUrl());
+                if (kind == SVNNodeKind.NONE) {
+                    // The node doesn't exist
+                    return false;
+                }
+                if (kind == SVNNodeKind.DIR) {
+                    String directoryPath = requestedPath.getString(registry);
+                    if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                        directoryPath = directoryPath.substring(1);
+                    }
+                    if (children != null) {
+                        // Decide how to represent the children ...
+                        Collection<SVNDirEntry> dirEntries = SvnRepositoryUtil.getDir(workspaceRoot, directoryPath);
+                        for (SVNDirEntry entry : dirEntries) {
+                            // All of the children of a directory will be another directory or a file,
+                            // but never a "jcr:content" node ...
+                            children.add(pathFactory.createSegment(entry.getName()));
+                        }
+                    }
+                    if (properties != null) {
+                        // Load the properties for this directory ......
+                        properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FOLDER));
+                        SVNDirEntry entry = getEntryInfo(workspaceRoot, directoryPath);
+                        if (entry != null) {
+                            properties.add(factory.create(JcrLexicon.CREATED, dateFactory.create(entry.getDate())));
+                        }
+                    }
+                } else {
+                    // It's not a directory, so must be a file; the only child of an nt:file is the "jcr:content" node
+                    // ...
+                    if (requestedPath.endsWith(JcrLexicon.CONTENT)) {
+                        // There are never any children of these nodes, just properties ...
+                        if (properties != null) {
+                            String contentPath = requestedPath.getParent().getString(registry);
+                            if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                                contentPath = contentPath.substring(1);
+                            }
+                            SVNDirEntry entry = getEntryInfo(workspaceRoot, contentPath);
+                            if (entry != null) {
+                                // The request is to get properties of the "jcr:content" child node ...
+                                // Do NOT use "nt:resource", since it extends "mix:referenceable". The JCR spec
+                                // does not require that "jcr:content" is of type "nt:resource", but rather just
+                                // suggests it. Therefore, we can use "dna:resource", which is identical to
+                                // "nt:resource" except it does not extend "mix:referenceable"
+                                properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE));
+                                properties.add(factory.create(JcrLexicon.LAST_MODIFIED, dateFactory.create(entry.getDate())));
+                            }
+
+                            ByteArrayOutputStream os = new ByteArrayOutputStream();
+                            SVNProperties fileProperties = new SVNProperties();
+                            getData(contentPath, fileProperties, os);
+                            String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);
+                            if (mimeType == null) mimeType = DEFAULT_MIME_TYPE;
+                            properties.add(factory.create(JcrLexicon.MIMETYPE, mimeType));
+
+                            if (os.toByteArray().length > 0) {
+                                // Now put the file's content into the "jcr:data" property ...
+                                BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                                properties.add(factory.create(JcrLexicon.DATA, binaryFactory.create(os.toByteArray())));
+                            }
+                        }
+                    } else {
+                        // Determine the corresponding file path for this object ...
+                        String filePath = requestedPath.getString(registry);
+                        if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                            filePath = filePath.substring(1);
+                        }
+                        if (children != null) {
+                            // Not a "jcr:content" child node but rather an nt:file node, so add the child ...
+                            children.add(pathFactory.createSegment(JcrLexicon.CONTENT));
+                        }
+                        if (properties != null) {
+                            // Now add the properties to "nt:file" ...
+                            properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE));
+                            ByteArrayOutputStream os = new ByteArrayOutputStream();
+                            SVNProperties fileProperties = new SVNProperties();
+                            getData(filePath, fileProperties, os);
+                            String created = fileProperties.getStringValue(SVNProperty.COMMITTED_DATE);
+                            properties.add(factory.create(JcrLexicon.CREATED, dateFactory.create(created)));
+                        }
+                    }
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Get some important informations of a path
+         * 
+         * @param repos
+         * @param path - the path
+         * @return - the {@link SVNDirEntry}, or null if there is no such entry
+         */
+        protected SVNDirEntry getEntryInfo( SVNRepository repos,
+                                            String path ) {
+            assert path != null;
+            SVNDirEntry entry = null;
+            try {
+                entry = repos.info(path, -1);
+            } catch (SVNException e) {
+                throw new RepositorySourceException(
+                                                    getSourceName(),
+                                                    SvnRepositoryConnectorI18n.connectingFailureOrUserAuthenticationProblem.text(getSourceName()));
+            }
+            return entry;
+        }
+
+        /**
+         * Get the content of a file.
+         * 
+         * @param path - the path to that file.
+         * @param properties - the properties of the file.
+         * @param os - the output stream where to store the content.
+         * @throws SVNException - throws if such path is not at that revision or in case of a connection problem.
+         */
+        protected void getData( String path,
+                                SVNProperties properties,
+                                OutputStream os ) throws SVNException {
+            workspaceRoot.getFile(path, -1, properties, os);
+
+        }
+
+        protected SVNNodeKind getNodeKind( ExecutionContext context,
+                                           Path path,
+                                           String repositoryRootUrl ) throws SVNException {
+            assert path != null;
+            assert repositoryRootUrl != null;
+
+            // See if the path is a "jcr:content" node ...
+            if (path.endsWith(JcrLexicon.CONTENT)) {
+                // We only want to use the parent path to find the actual file ...
+                path = path.getParent();
+            }
+            String pathAsString = path.getString(context.getNamespaceRegistry());
+            if (!repositoryRootUrl.equals(getName())) {
+                pathAsString = pathAsString.substring(1);
+            }
+
+            String absolutePath = pathAsString;
+            SVNNodeKind kind = workspaceRoot.checkPath(absolutePath, -1);
+            if (kind == SVNNodeKind.UNKNOWN) {
+                // node is unknown
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.nodeIsActuallyUnknow.text(pathAsString));
+            }
+            return kind;
+        }
+
+        protected SVNRepository getWorkspaceDirectory( String workspaceName ) {
+            if (workspaceName == null) workspaceName = source.getDirectoryForDefaultWorkspace();
+            SVNRepository repository = null;
+            SVNRepository repos = SvnRepositoryUtil.createRepository(workspaceName, source.getUsername(), source.getPassword());
+            if (SvnRepositoryUtil.isDirectory(repos, "")) {
+                repository = repos;
+            } else {
+                return null;
+            }
+            return repository;
+        }
+
+        /**
+         * Checks that the collection of {@code properties} only contains properties with allowable names.
+         * 
+         * @param context
+         * @param properties
+         * @param validPropertyNames
+         * @throws RepositorySourceException if {@code properties} contains a
+         * @see #ALLOWABLE_PROPERTIES_FOR_CONTENT
+         * @see #ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER
+         */
+        protected void ensureValidProperties( ExecutionContext context,
+                                              Collection<Property> properties,
+                                              Set<Name> validPropertyNames ) {
+            List<String> invalidNames = new LinkedList<String>();
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            for (Property property : properties) {
+                if (!validPropertyNames.contains(property.getName())) {
+                    invalidNames.add(property.getName().getString(registry));
+                }
+            }
+
+            if (!invalidNames.isEmpty()) {
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.invalidPropertyNames.text(invalidNames.toString()));
+            }
+        }
+
+    }
+
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,89 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+* See the AUTHORS.txt file in the distribution for a full listing of 
+* individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import java.util.Locale;
+import java.util.Set;
+import org.jboss.dna.common.i18n.I18n;
+
+/**
+ * The internationalized string constants for the <code>org.jboss.dna.connector.svn*</code> packages.
+ */
+public final class SvnRepositoryConnectorI18n {
+
+    public static I18n connectorName;
+    public static I18n nodeDoesNotExist;
+    public static I18n nodeIsActuallyUnknow;
+    public static I18n propertyIsRequired;
+    public static I18n errorSerializingCachePolicyInSource;
+    public static I18n locationInRequestMustHavePath;
+    public static I18n sourceIsReadOnly;
+    public static I18n sourceDoesNotSupportCreatingWorkspaces;
+    public static I18n sourceDoesNotSupportCloningWorkspaces;
+    public static I18n sourceDoesNotSupportDeletingWorkspaces;
+    public static I18n connectingFailureOrUserAuthenticationProblem;
+    public static I18n pathForPredefinedWorkspaceDoesNotExist;
+    public static I18n pathForPredefinedWorkspaceIsNotDirectory;
+    public static I18n pathForPredefinedWorkspaceCannotBeRead;
+    public static I18n workspaceDoesNotExist;
+    public static I18n pathForDefaultWorkspaceDoesNotExist;
+    public static I18n pathForDefaultWorkspaceIsNotDirectory;
+    public static I18n pathForDefaultWorkspaceCannotBeRead;
+    public static I18n sameNameSiblingsAreNotAllowed;
+    public static I18n onlyTheDefaultNamespaceIsAllowed;
+    public static I18n unableToCreateWorkspaces;
+    public static I18n pathForRequestIsNotCorrect;
+    public static I18n pathForRequestMustStartWithAForwardSlash;
+    public static I18n nodeAlreadyExist;
+    public static I18n unsupportedPrimaryType;
+    public static I18n invalidPropertyNames;
+    public static I18n invalidNameForResource;
+    public static I18n invalidPathForResource;
+    public static I18n missingRequiredProperty;
+    public static I18n couldNotCreateFile;
+    public static I18n couldNotReadData;
+    public static I18n deleteFailed;
+
+    static {
+        try {
+            I18n.initialize(SvnRepositoryConnectorI18n.class);
+        } catch (final Exception err) {
+            System.err.println(err);
+        }
+    }
+
+    public static Set<Locale> getLocalizationProblemLocales() {
+        return I18n.getLocalizationProblemLocales(SvnRepositoryConnectorI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems() {
+        return I18n.getLocalizationProblems(SvnRepositoryConnectorI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems( Locale locale ) {
+        return I18n.getLocalizationProblems(SvnRepositoryConnectorI18n.class, locale);
+    }
+
+  
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,43 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import org.jboss.dna.connector.svn2.SvnRepositorySource;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.basic.BasicName;
+
+/**
+ * The namespace and property names used within a {@link SvnRepositorySource} to store internal information.
+ */
+public class SvnRepositoryLexicon {
+
+    public static class Namespace {
+        public static final String URI = "http://www.jboss.org/dna/connector/svn";
+        public static final String PREFIX = "dnasvn";
+    }
+
+    public static final Name CHILD_PATH_SEGMENT_LIST = new BasicName(Namespace.URI, "orderedChildNames");
+    public static final Name UUID = new BasicName(Namespace.URI, "uuid");
+
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,408 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.Reference;
+import javax.naming.StringRefAddr;
+import javax.naming.spi.ObjectFactory;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.StringUtil;
+import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractPathRepositorySource;
+import org.jboss.dna.graph.connector.path.PathRepositoryConnection;
+
+/**
+ * The {@link RepositorySource} for the connector that exposes an area of the local/remote svn repository as content in a
+ * repository. This source considers a workspace name to be the path to the directory on the repository's root directory location
+ * that represents the root of that workspace. New workspaces can be created, as long as the names represent valid paths to
+ * existing directories.
+ */
+ at ThreadSafe
+public class SvnRepositorySource extends AbstractPathRepositorySource implements ObjectFactory {
+
+    /**
+     * The first serialized version of this source. Version {@value} .
+     */
+    private static final long serialVersionUID = 1L;
+
+    protected static final String SOURCE_NAME = "sourceName";
+    protected static final String SVN_REPOSITORY_ROOT_URL = "repositoryRootURL";
+    protected static final String SVN_USERNAME = "username";
+    protected static final String SVN_PASSWORD = "password";
+    protected static final String CACHE_TIME_TO_LIVE_IN_MILLISECONDS = "cacheTimeToLiveInMilliseconds";
+    protected static final String RETRY_LIMIT = "retryLimit";
+    protected static final String ROOT_NODE_UUID = "rootNodeUuid";
+    protected static final String DEFAULT_WORKSPACE = "defaultWorkspace";
+    protected static final String PREDEFINED_WORKSPACE_NAMES = "predefinedWorkspaceNames";
+    protected static final String ALLOW_CREATING_WORKSPACES = "allowCreatingWorkspaces";
+
+    /**
+     * This source supports events.
+     */
+    protected static final boolean SUPPORTS_EVENTS = true;
+    /**
+     * This source supports same-name-siblings.
+     */
+    protected static final boolean SUPPORTS_SAME_NAME_SIBLINGS = false;
+    /**
+     * This source does support creating workspaces.
+     */
+    protected static final boolean DEFAULT_SUPPORTS_CREATING_WORKSPACES = true;
+    /**
+     * This source supports udpates by default, but each instance may be configured to be read-only or updateable}.
+     */
+    public static final boolean DEFAULT_SUPPORTS_UPDATES = false;
+
+    /**
+     * This source supports creating references.
+     */
+    protected static final boolean SUPPORTS_REFERENCES = false;
+
+    private volatile String repositoryRootUrl;
+    private volatile String username;
+    private volatile String password;
+    private volatile String defaultWorkspace;
+    private volatile String[] predefinedWorkspaces = new String[] {};
+    private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(
+                                                                                                  SUPPORTS_SAME_NAME_SIBLINGS,
+                                                                                                  DEFAULT_SUPPORTS_UPDATES,
+                                                                                                  SUPPORTS_EVENTS,
+                                                                                                  DEFAULT_SUPPORTS_CREATING_WORKSPACES,
+                                                                                                  SUPPORTS_REFERENCES);
+
+    private transient SvnRepository repository;
+
+    /**
+     * Create a repository source instance.
+     */
+    public SvnRepositorySource() {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getCapabilities()
+     */
+    public RepositorySourceCapabilities getCapabilities() {
+        return capabilities;
+    }
+
+    /**
+     * @return the url
+     */
+    public String getRepositoryRootUrl() {
+        return this.repositoryRootUrl;
+    }
+
+    /**
+     * Set the url for the subversion repository.
+     * 
+     * @param url - the url location.
+     * @throws IllegalArgumentException If svn url is null or empty
+     */
+    public synchronized void setRepositoryRootUrl( String url ) {
+        CheckArg.isNotEmpty(url, "RepositoryRootUrl");
+        this.repositoryRootUrl = url;
+    }
+
+    public String getUsername() {
+        return this.username;
+    }
+
+    /**
+     * @param username
+     */
+    public synchronized void setUsername( String username ) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return this.password;
+    }
+
+    /**
+     * @param password
+     */
+    public synchronized void setPassword( String password ) {
+        this.password = password;
+    }
+
+    /**
+     * Get whether this source supports updates.
+     * 
+     * @return true if this source supports updates, or false if this source only supports reading content.
+     */
+    public boolean getSupportsUpdates() {
+        return capabilities.supportsUpdates();
+    }
+
+    /**
+     * Get the file system path to the existing directory that should be used for the default workspace. If the default is
+     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
+     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * 
+     * @return the file system path to the directory representing the default workspace, or null if the default should be the
+     *         current working directory
+     */
+    public String getDirectoryForDefaultWorkspace() {
+        return defaultWorkspace;
+    }
+
+    public String getDefaultWorkspaceName() {
+        return defaultWorkspace;
+    }
+
+    /**
+     * Set the file system path to the existing directory that should be used for the default workspace. If the default is
+     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
+     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * 
+     * @param pathToDirectoryForDefaultWorkspace the valid and resolvable file system path to the directory representing the
+     *        default workspace, or null if the current working directory should be used as the default workspace
+     */
+    public synchronized void setDirectoryForDefaultWorkspace( String pathToDirectoryForDefaultWorkspace ) {
+        this.defaultWorkspace = pathToDirectoryForDefaultWorkspace;
+    }
+
+    /**
+     * Gets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
+     * to a directory on the file system.
+     * 
+     * @return the names of the workspaces that this source starts with, or null if there are no such workspaces
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     */
+    public synchronized String[] getPredefinedWorkspaceNames() {
+        String[] copy = new String[predefinedWorkspaces.length];
+        System.arraycopy(predefinedWorkspaces, 0, copy, 0, predefinedWorkspaces.length);
+        return copy;
+    }
+
+    /**
+     * Sets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
+     * to a directory on the file system.
+     * 
+     * @param predefinedWorkspaceNames the names of the workspaces that this source should start with, or null if there are no
+     *        such workspaces
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     * @see #getPredefinedWorkspaceNames()
+     */
+    public synchronized void setPredefinedWorkspaceNames( String[] predefinedWorkspaceNames ) {
+        this.predefinedWorkspaces = predefinedWorkspaceNames;
+    }
+
+    /**
+     * Get whether this source allows workspaces to be created dynamically.
+     * 
+     * @return true if this source allows workspaces to be created by clients, or false if the set of workspaces is fixed
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #getPredefinedWorkspaceNames()
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     */
+    public boolean isCreatingWorkspacesAllowed() {
+        return capabilities.supportsCreatingWorkspaces();
+    }
+
+    /**
+     * Set whether this source allows workspaces to be created dynamically.
+     * 
+     * @param allowWorkspaceCreation true if this source allows workspaces to be created by clients, or false if the set of
+     *        workspaces is fixed
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #getPredefinedWorkspaceNames()
+     * @see #isCreatingWorkspacesAllowed()
+     */
+    public synchronized void setCreatingWorkspacesAllowed( boolean allowWorkspaceCreation ) {
+        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), capabilities.supportsUpdates(),
+                                                        capabilities.supportsEvents(), allowWorkspaceCreation,
+                                                        capabilities.supportsReferences());
+    }
+
+    /**
+     * Get whether this source allows updates.
+     * 
+     * @return true if this source allows updates by clients, or false if no updates are allowed
+     * @see #setUpdatesAllowed(boolean)
+     */
+    @Override
+    public boolean areUpdatesAllowed() {
+        return capabilities.supportsUpdates();
+    }
+
+    /**
+     * Set whether this source allows updates to data within workspaces
+     * 
+     * @param allowUpdates true if this source allows updates to data within workspaces clients, or false if updates are not
+     *        allowed.
+     * @see #areUpdatesAllowed()
+     */
+    public synchronized void setUpdatesAllowed( boolean allowUpdates ) {
+        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), allowUpdates,
+                                                        capabilities.supportsEvents(), capabilities.supportsCreatingWorkspaces(),
+                                                        capabilities.supportsReferences());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (obj instanceof SvnRepositorySource) {
+            SvnRepositorySource that = (SvnRepositorySource)obj;
+            if (this.getName() == null) {
+                if (that.getName() != null) return false;
+            } else {
+                if (!this.getName().equals(that.getName())) return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.naming.Referenceable#getReference()
+     */
+    public synchronized Reference getReference() {
+        String className = getClass().getName();
+        String factoryClassName = this.getClass().getName();
+        Reference ref = new Reference(className, factoryClassName, null);
+
+        if (getName() != null) {
+            ref.add(new StringRefAddr(SOURCE_NAME, getName()));
+        }
+        if (getRepositoryRootUrl() != null) {
+            ref.add(new StringRefAddr(SVN_REPOSITORY_ROOT_URL, getRepositoryRootUrl()));
+        }
+        if (getUsername() != null) {
+            ref.add(new StringRefAddr(SVN_USERNAME, getUsername()));
+        }
+        if (getPassword() != null) {
+            ref.add(new StringRefAddr(SVN_PASSWORD, getPassword()));
+        }
+        ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
+        ref.add(new StringRefAddr(ROOT_NODE_UUID, rootNodeUuid.toString()));
+        ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDirectoryForDefaultWorkspace()));
+        ref.add(new StringRefAddr(ALLOW_CREATING_WORKSPACES, Boolean.toString(isCreatingWorkspacesAllowed())));
+        String[] workspaceNames = getPredefinedWorkspaceNames();
+        if (workspaceNames != null && workspaceNames.length != 0) {
+            ref.add(new StringRefAddr(PREDEFINED_WORKSPACE_NAMES, StringUtil.combineLines(workspaceNames)));
+        }
+        return ref;
+
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context,
+     *      java.util.Hashtable)
+     */
+    public Object getObjectInstance( Object obj,
+                                     Name name,
+                                     Context nameCtx,
+                                     Hashtable<?, ?> environment ) throws Exception {
+        if (!(obj instanceof Reference)) return null;
+
+        Map<String, Object> values = valuesFrom((Reference)obj);
+
+        String sourceName = (String)values.get(SOURCE_NAME);
+        String repositoryRootUrl = (String)values.get(SVN_REPOSITORY_ROOT_URL);
+        String username = (String)values.get(SVN_USERNAME);
+        String password = (String)values.get(SVN_PASSWORD);
+        String retryLimit = (String)values.get(RETRY_LIMIT);
+        String rootNodeUuid = (String)values.get(ROOT_NODE_UUID);
+        String defaultWorkspace = (String)values.get(DEFAULT_WORKSPACE);
+        String createWorkspaces = (String)values.get(ALLOW_CREATING_WORKSPACES);
+
+        String combinedWorkspaceNames = (String)values.get(PREDEFINED_WORKSPACE_NAMES);
+        String[] workspaceNames = null;
+        if (combinedWorkspaceNames != null) {
+            List<String> paths = StringUtil.splitLines(combinedWorkspaceNames);
+            workspaceNames = paths.toArray(new String[paths.size()]);
+        }
+        // Create the source instance ...
+        SvnRepositorySource source = new SvnRepositorySource();
+        if (sourceName != null) source.setName(sourceName);
+        if (repositoryRootUrl != null && repositoryRootUrl.length() > 0) source.setRepositoryRootUrl(repositoryRootUrl);
+        if (username != null) source.setUsername(username);
+        if (password != null) source.setPassword(password);
+        if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
+        if (rootNodeUuid != null) source.setRootNodeUuid(rootNodeUuid);
+        if (defaultWorkspace != null) source.setDirectoryForDefaultWorkspace(defaultWorkspace);
+        if (createWorkspaces != null) source.setCreatingWorkspacesAllowed(Boolean.parseBoolean(createWorkspaces));
+        if (workspaceNames != null && workspaceNames.length != 0) source.setPredefinedWorkspaceNames(workspaceNames);
+        return source;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getConnection()
+     */
+    public synchronized RepositoryConnection getConnection() throws RepositorySourceException {
+
+        String sourceName = getName();
+        if (sourceName == null || sourceName.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getName(), msg.text("name"));
+        }
+
+        String sourceUsername = getUsername();
+        if (sourceUsername == null || sourceUsername.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getUsername(), msg.text("username"));
+        }
+
+        String sourcePassword = getPassword();
+        if (sourcePassword == null) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getPassword(), msg.text("password"));
+        }
+
+        String repositoryRootURL = getRepositoryRootUrl();
+        if (repositoryRootURL == null || repositoryRootURL.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getRepositoryRootUrl(), msg.text("repositoryRootURL"));
+        }
+
+        if (this.repository == null) {
+            this.repository = new SvnRepository(this);
+        }
+
+        return new PathRepositoryConnection(this, this.repository);
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,235 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.request.InvalidWorkspaceException;
+import org.tmatesoft.svn.core.SVNDirEntry;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+/**
+ */
+public class SvnRepositoryUtil {
+
+    /**
+     * @param url
+     * @param sourceName
+     * @return SVNURL
+     */
+    public static SVNURL createSVNURL( String url,
+                                       String sourceName ) {
+
+        SVNURL theUrl;
+        try {
+            theUrl = SVNURL.parseURIDecoded(url);
+        } catch (SVNException e) {
+            // protocol not supported by this connector
+            throw new RepositorySourceException(sourceName,
+                                                "Protocol is not supported by this connector or there is problem in the svn url");
+        }
+        return theUrl;
+    }
+
+    public static void setNewSVNRepositoryLocation( SVNRepository oldRespository,
+                                                    String url,
+                                                    boolean forceReconnect,
+                                                    String sourceName ) {
+        try {
+            oldRespository.setLocation(createSVNURL(url, sourceName), forceReconnect);
+        } catch (SVNException e) {
+            throw new RepositorySourceException(sourceName, "the old url and a new one has got different protocols");
+        }
+    }
+
+    /**
+     * @param repository
+     * @param path
+     * @param revisionNumber
+     * @param sourceName
+     * @return SVNNodeKind
+     */
+    public static SVNNodeKind checkThePath( SVNRepository repository,
+                                            String path,
+                                            long revisionNumber,
+                                            String sourceName ) {
+        SVNNodeKind kind;
+        try {
+            kind = repository.checkPath(path, revisionNumber);
+
+        } catch (SVNException e) {
+            return null;
+        }
+        return kind;
+    }
+
+    /**
+     * Create a {@link SVNRepository} from a http protocol.
+     * 
+     * @param url - the url of the repository.
+     * @param username - username credential.
+     * @param password - password credential
+     * @return {@link SVNRepository}.
+     */
+    public static SVNRepository createRepository( String url,
+                                                  String username,
+                                                  String password ) {
+        // for DAV (over http and https)
+        DAVRepositoryFactory.setup();
+        // For File
+        FSRepositoryFactory.setup();
+        // for SVN (over svn and svn+ssh)
+        SVNRepositoryFactoryImpl.setup();
+
+        // The factory knows how to create a DAVRepository
+        SVNRepository repository;
+        try {
+            repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
+
+            ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
+            repository.setAuthenticationManager(authManager);
+        } catch (SVNException e) {
+            throw new InvalidWorkspaceException(SvnRepositoryConnectorI18n.workspaceDoesNotExist.text(e.getMessage()));
+        }
+        return repository;
+    }
+
+    /**
+     * Util to get the last segment from a path.
+     * 
+     * @param repository
+     * @return last segment.
+     */
+    public static String getRepositoryWorspaceName( SVNRepository repository ) {
+        String[] segments = repository.getLocation().getPath().split("/");
+        return segments[segments.length - 1];
+    }
+
+    private SvnRepositoryUtil() {
+        // prvent construction
+    }
+
+    /**
+     * Check if the repository path exist.
+     * 
+     * @param repos
+     * @return true if repository exist and false otherwise.
+     */
+    public static boolean exist( SVNRepository repos ) {
+        try {
+            SVNNodeKind kind = repos.checkPath("", -1);
+            if (kind == SVNNodeKind.NONE) {
+                return false;
+            }
+            return true;
+
+        } catch (SVNException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Check if repository path is a directory.
+     * 
+     * @param repos
+     * @param path
+     * @return true if repository path is a directory and false otherwise.
+     */
+    public static boolean isDirectory( SVNRepository repos,
+                                       String path ) {
+        try {
+            SVNNodeKind kind = repos.checkPath(path, -1);
+            if (kind == SVNNodeKind.DIR) {
+                return true;
+            }
+        } catch (SVNException e) {
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * @param repos
+     * @param path
+     * @return a collect of entry from directory path; never null
+     */
+    @SuppressWarnings( "unchecked" )
+    public static Collection<SVNDirEntry> getDir( SVNRepository repos,
+                                                  String path ) {
+        try {
+            return repos.getDir(path, -1, null, (Collection<SVNDirEntry>)null);
+        } catch (SVNException e) {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * Check if the path is a file.
+     * 
+     * @param repos
+     * @param path
+     * @return true if the path is a file and false otherwise.
+     */
+    public static boolean isFile( SVNRepository repos,
+                                  String path ) {
+        try {
+            SVNNodeKind kind = repos.checkPath(path, -1);
+            if (kind == SVNNodeKind.FILE) {
+                return true;
+            }
+        } catch (SVNException e) {
+            return false;
+        }
+        return false;
+    }
+
+    public static boolean exists( SVNRepository repository,
+                                  String path ) throws SVNException{
+        try {
+            if (repository.checkPath(path, -1) == SVNNodeKind.NONE) {
+                return false;
+            } else if (repository.checkPath(path, -1) == SVNNodeKind.UNKNOWN) {
+                return false;
+            }
+        } catch (SVNException e) {
+            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                         "unknow error during delete action: {0)",
+                                                         e.getMessage());
+            throw new SVNException(err);
+        }
+        return true;
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,29 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ * The classes that make up the connector that accesses content from an SVN repository.
+ */
+
+package org.jboss.dna.connector.svn2;
+


Property changes on: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2 (from rev 1520, trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn)

Modified: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2/SVNRepositoryConnectorI18n.properties
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties	2010-01-04 15:33:19 UTC (rev 1520)
+++ trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2/SVNRepositoryConnectorI18n.properties	2010-01-05 12:43:25 UTC (rev 1524)
@@ -54,6 +54,6 @@
 
 
 # Writable tests
-couldNotCreateFile =Error reading data in workspace "{1}" "{0}" "{2}" "{3}"
+couldNotCreateFile =Error reading data at path "{0}" in workspace "{1}" in source "{2}": "{3}"
 couldNotReadData= Error reading data in workspace "{1}" "{0}" "{2}" "{3}"
 deleteFailed=Error deleting path {0} in workspace with source name {1}
\ No newline at end of file

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,177 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import org.jboss.dna.common.util.FileUtil;
+import org.tmatesoft.svn.core.SVNDirEntry;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+/**
+ * @author Serge Pagop
+ */
+public class SvnConnectorTestUtil {
+
+    @SuppressWarnings( "unchecked" )
+    public static void main( String[] args ) throws Exception {
+        try {
+            System.out.println("My repos. ......");
+            String svnUrl = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+            String username = "sp";
+            String password = "";
+            System.out.println(svnUrl);
+            SVNRepository trunkWorkspace = createRepository(svnUrl + "/trunk", username, password);
+            System.out.println("Repository location: " + trunkWorkspace.getLocation().toString());
+            System.out.println("Repository Root: " + trunkWorkspace.getRepositoryRoot(true));
+            System.out.println("Repository UUID: " + trunkWorkspace.getRepositoryUUID(true));
+            /**
+             * Returns the repository location to which this object is set. It may be the location that was used to create this
+             * object (see {@link SVNRepositoryFactory#create(SVNURL)}), or the recent one the object was set to.
+             */
+            System.out.println("location: " + trunkWorkspace.getLocation().getPath());
+            System.out.println("decoded location: " + trunkWorkspace.getLocation().toDecodedString());
+            System.out.println("last seg: " + getRepositoryWorspaceName(trunkWorkspace));
+
+            final Collection<SVNDirEntry> dirEntries = trunkWorkspace.getDir("", -1, null, (Collection<SVNDirEntry>)null);
+            for (SVNDirEntry dirEntry : dirEntries) {
+                System.out.println("name: " + dirEntry.getName());
+            }
+
+            // //
+            // SVNNodeKind nodeKind = trunkWorkspace.checkPath( "/" , -1 );
+            // if ( nodeKind == SVNNodeKind.NONE ) {
+            // System.err.println( "There is no entry in the workspace "+ trunkWorkspace );
+            // System.exit( 1 );
+            // } else if ( nodeKind == SVNNodeKind.FILE ) {
+            // System.err.println( "The entry at '" + trunkWorkspace + "' is a file while a directory was expected." );
+            // System.exit( 1 );
+            // } else {
+            // listEntries(trunkWorkspace, "/root");
+            // // long latestRevision = trunkWorkspace.getLatestRevision( );
+            // // System.out.println( "workspace latest revision: " + latestRevision );
+            //            
+            // //// SVNNodeKind kind = trunkWorkspace.checkPath("/", -1);
+            // // if(kind == SVNNodeKind.NONE) {
+            // // System.out.println("none");
+            // // } else if(kind == SVNNodeKind.UNKNOWN) {
+            // // System.out.println("unknown");
+            // // } else if(kind == SVNNodeKind.FILE) {
+            // // System.out.println("file");
+            // // } else if(kind == SVNNodeKind.DIR) {
+            // System.out.println("dir");
+            // // listEntries(trunkWorkspace,"root");
+            // }
+
+        } catch (SVNException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Create a {@link SVNRepository} from a http protocol.
+     * 
+     * @param url - the url of the repository.
+     * @param username - username credential.
+     * @param password - password credential
+     * @return {@link SVNRepository}.
+     * @throws SVNException - when error situation.
+     */
+    public static SVNRepository createRepository( String url,
+                                                  String username,
+                                                  String password ) throws SVNException {
+        // for DAV (over http and https)
+        DAVRepositoryFactory.setup();
+        // For File
+        FSRepositoryFactory.setup();
+        // for SVN (over svn and svn+ssh)
+        SVNRepositoryFactoryImpl.setup();
+
+        // The factory knows how to create a DAVRepository
+        SVNRepository repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
+        ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
+        repository.setAuthenticationManager(authManager);
+        return repository;
+    }
+
+    public static String createURL( String src,
+                                    String dst ) throws IOException, SVNException {
+        // First we need to find the absolute path. Note that Maven always runs the tests from the project's directory,
+        // so use new File to create an instance at the current location ...
+        File mySrc = new File(src);
+        File myDst = new File(dst);
+
+        // make sure the destination is empty before we copy
+        FileUtil.delete(myDst);
+        FileUtil.copy(mySrc, myDst);
+
+        // Now set the two path roots
+        String url = myDst.getCanonicalFile().toURI().toURL().toExternalForm();
+
+        url = url.replaceFirst("file:/", "file://localhost/");
+
+        // Have to decode the URL ...
+        SVNURL encodedUrl = SVNURL.parseURIEncoded(url);
+        url = encodedUrl.toDecodedString();
+
+        if (!url.endsWith("/")) url = url + "/";
+        return url;
+    }
+
+    @SuppressWarnings( "unchecked" )
+    public static void listEntries( SVNRepository workspace,
+                                    String path ) throws SVNException {
+        Collection<SVNDirEntry> entries = workspace.getDir(path, -1, null, (Collection)null);
+        Iterator<SVNDirEntry> iterator = entries.iterator();
+        while (iterator.hasNext()) {
+            SVNDirEntry entry = iterator.next();
+            System.out.println("/" + (path.equals("") ? "" : path + "/") + entry.getName() + " ( author: '" + entry.getAuthor()
+                               + "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")");
+            if (entry.getKind() == SVNNodeKind.DIR) {
+                listEntries(workspace, (path.equals("")) ? entry.getName() : path + "/" + entry.getName());
+            }
+        }
+    }
+
+    public static String getRepositoryWorspaceName( SVNRepository repository ) {
+        String[] segments = repository.getLocation().getPath().split("/");
+        return segments[segments.length - 1];
+    }
+
+    private SvnConnectorTestUtil() {
+        // prevent constructor
+    }
+
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,110 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import java.util.Map;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.Node;
+import org.jboss.dna.graph.Subgraph;
+import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.observe.Observer;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.Property;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SvnIntegrationTest {
+
+    private ExecutionContext context;
+    private SvnRepositorySource source;
+    private String repositoryUrl;
+    private String[] predefinedWorkspaceNames;
+
+    @Before
+    public void beforeEach() {
+        repositoryUrl = "http://anonsvn.jboss.org/repos/dna/";
+        predefinedWorkspaceNames = new String[] {repositoryUrl + "trunk", repositoryUrl + "tags", repositoryUrl + "branches"};
+        context = new ExecutionContext();
+        source = new SvnRepositorySource();
+        source.setName("svn repository source");
+        source.setRepositoryRootUrl(repositoryUrl);
+        source.setUsername("anonymous");
+        source.setPassword("");
+        source.setCreatingWorkspacesAllowed(true);
+        source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
+        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setCreatingWorkspacesAllowed(false);
+        source.initialize(new RepositoryContext() {
+
+            public Subgraph getConfiguration( int depth ) {
+                return null;
+            }
+
+            public ExecutionContext getExecutionContext() {
+                return context;
+            }
+
+            public Observer getObserver() {
+                return null;
+            }
+
+            public RepositoryConnectionFactory getRepositoryConnectionFactory() {
+                return new RepositoryConnectionFactory() {
+
+                    public RepositoryConnection createConnection( String sourceName ) throws RepositorySourceException {
+                        return null;
+                    }
+
+                };
+            }
+
+        });
+    }
+
+    @Test
+    public void shouldConnectAndReadRootNode() {
+        Graph graph = Graph.create(source, context);
+        Map<Name, Property> properties = graph.getPropertiesByName().on("/");
+        assertThat(properties, is(notNullValue()));
+
+        Node root = graph.getNodeAt("/");
+        assertThat(root, is(notNullValue()));
+        assertThat(root.getLocation(), is(notNullValue()));
+        assertThat(root.getChildren().isEmpty(), is(false));
+        for (Location childLocation : root.getChildren()) {
+            assertThat(childLocation.getPath().getParent().isRoot(), is(true));
+            // Node child = graph.getNodeAt(childLocation);
+            // assertThat(child.getLocation(), is(childLocation));
+            // assertThat(child.getLocation().getPath().getParent().isRoot(), is(true));
+        }
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,35 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import org.jboss.dna.common.AbstractI18nTest;
+
+/**
+ */
+public class SvnRepositoryConnectorI18nTest extends AbstractI18nTest {
+
+    public SvnRepositoryConnectorI18nTest() {
+        super(SvnRepositoryConnectorI18n.class);
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,68 @@
+package org.jboss.dna.connector.svn2;
+
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.test.WorkspaceConnectorTest;
+import org.junit.BeforeClass;
+
+public class SvnRepositoryConnectorNoCreateWorkspaceTest extends WorkspaceConnectorTest {
+
+    private static String url;
+
+    @BeforeClass
+    public static void beforeAny() throws Exception {
+        url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#setUpSource()
+     */
+    @Override
+    protected RepositorySource setUpSource() throws Exception {
+        String[] predefinedWorkspaceNames = new String[] {url + "trunk", url + "tags"};
+        SvnRepositorySource source = new SvnRepositorySource();
+        source.setName("Test Repository");
+        source.setUsername("sp");
+        source.setPassword("");
+        source.setRepositoryRootUrl(url);
+        source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
+        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setCreatingWorkspacesAllowed(false);
+
+        return source;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#initializeContent(org.jboss.dna.graph.Graph)
+     */
+    @Override
+    protected void initializeContent( Graph graph ) throws Exception {
+        // No need to initialize any content ...
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.WorkspaceConnectorTest#generateInvalidNamesForNewWorkspaces()
+     */
+    @Override
+    protected String[] generateInvalidNamesForNewWorkspaces() {
+        return null; // nothing is considered invalid
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.WorkspaceConnectorTest#generateValidNamesForNewWorkspaces()
+     */
+    @Override
+    protected String[] generateValidNamesForNewWorkspaces() {
+        return new String[] {url + "branches"};
+    }
+
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,48 @@
+package org.jboss.dna.connector.svn2;
+
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.test.NotWritableConnectorTest;
+import org.junit.BeforeClass;
+
+public class SvnRepositoryConnectorNotWritableTest extends NotWritableConnectorTest {
+
+    private static String url;
+
+    @BeforeClass
+    public static void beforeAny() throws Exception {
+        url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#setUpSource()
+     */
+    @Override
+    protected RepositorySource setUpSource() throws Exception {
+        String[] predefinedWorkspaceNames = new String[]{url+"trunk", url+"tags"};
+        SvnRepositorySource source = new SvnRepositorySource();
+        source.setName("Test Repository");
+        source.setUsername("sp");
+        source.setPassword("");
+        source.setRepositoryRootUrl(url);
+        source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
+        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setCreatingWorkspacesAllowed(false);
+        
+        return source;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#initializeContent(org.jboss.dna.graph.Graph)
+     */
+    @Override
+    protected void initializeContent( Graph graph ) {
+        // No need to initialize any content ...
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,360 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import java.io.ByteArrayOutputStream;
+import org.jboss.dna.graph.DnaLexicon;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.JcrMixLexicon;
+import org.jboss.dna.graph.JcrNtLexicon;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.test.AbstractConnectorTest;
+import org.jboss.dna.graph.property.PathNotFoundException;
+import org.junit.Test;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNProperties;
+import org.tmatesoft.svn.core.io.SVNRepository;
+
+/**
+ * @author Serge Pagop
+ */
+public class SvnRepositoryConnectorWritableTest extends AbstractConnectorTest {
+
+    protected static final String EMPTY_CONTENT = "";
+    protected static final String TEST_CONTENT = "Test content";
+    protected SVNRepository remoteRepos = null;
+    protected String url;
+    protected SVNNodeKind kind = null;
+    protected SVNProperties fileProperties = null;
+    protected ByteArrayOutputStream baos = null;
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#setUpSource()
+     */
+    @Override
+    protected RepositorySource setUpSource() throws Exception {
+        url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+        String[] predefinedWorkspaceNames = new String[] {url + "trunk", url + "tags"};
+        SvnRepositorySource source = new SvnRepositorySource();
+        source.setName("Test Repository");
+        source.setUsername("sp");
+        source.setPassword("");
+        source.setRepositoryRootUrl(url);
+        source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
+        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setCreatingWorkspacesAllowed(Boolean.TRUE);
+        source.setUpdatesAllowed(true);
+
+        remoteRepos = SvnConnectorTestUtil.createRepository(url + "trunk", "sp", "");
+
+        return source;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#initializeContent(org.jboss.dna.graph.Graph)
+     */
+    @Override
+    protected void initializeContent( Graph graph ) throws Exception {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#afterEach()
+     */
+    @Override
+    public void afterEach() throws Exception {
+        remoteRepos = null;
+        super.afterEach();
+    }
+
+    @Test( expected = RepositorySourceException.class )
+    public void shouldNotBeAbleToCreateInvalidTypeForRepository() {
+        graph.create("/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.UNSTRUCTURED).orReplace().and();
+    }
+
+    @Test( expected = RepositorySourceException.class )
+    public void shouldNotBeAbleToSetArbitraryProperties() {
+        graph.create("/testFile").with(JcrLexicon.MIXIN_TYPES, JcrMixLexicon.LOCKABLE).orReplace().and();
+    }
+
+    @Test
+    public void shouldBeAbleToCreateNodeFileWithContentLevel1() throws Exception {
+
+        // LEVEL 0
+        graph.create("/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                     TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.create("/testFile1").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFile1/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                      TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("testFile1", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile1", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        // LEVEL 1
+        graph.create("/root/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/root/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                          TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("root/testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("root/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        // LEVEL 2
+        graph.create("/root/a/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/root/a/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                            TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("root/a/testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("root/a/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+    }
+
+    @Test
+    public void shouldRespectConflictBehaviorOnCreate() throws Exception {
+        graph.create("/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                     TEST_CONTENT.getBytes()).orReplace().and();
+
+        graph.create("/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                     "Should not overwrite".getBytes()).ifAbsent().and();
+
+        kind = remoteRepos.checkPath("testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+    }
+
+    @Test
+    public void shouldBeAbleToCreateFileWithNoContent() throws Exception {
+        graph.create("/testEmptyFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+
+        kind = remoteRepos.checkPath("testEmptyFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testEmptyFile", -1, fileProperties, baos);
+        assertContents(baos, EMPTY_CONTENT);
+    }
+
+    @Test
+    public void shouldBeAbleToCreateFolder() throws Exception {
+        graph.create("/testFolder").orReplace().and();
+
+        kind = remoteRepos.checkPath("testFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+
+        graph.create("/root/testFolder").orReplace().and();
+
+        kind = remoteRepos.checkPath("root/testFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+
+        graph.create("/root/a/testFolder").orReplace().and();
+
+        kind = remoteRepos.checkPath("root/a/testFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+    }
+
+    @Test
+    public void shouldBeAbleToAddChildrenToFolder() throws Exception {
+        graph.create("/testFolder").orReplace().and();
+
+        kind = remoteRepos.checkPath("testFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+
+        graph.create("/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFolder/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                                TEST_CONTENT.getBytes()).orReplace().and();
+
+        kind = remoteRepos.checkPath("testFolder/testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.create("/root/testFolder").orReplace().and();
+
+        kind = remoteRepos.checkPath("root/testFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+
+        graph.create("/root/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/root/testFolder/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                                     TEST_CONTENT.getBytes()).orReplace().and();
+
+        kind = remoteRepos.checkPath("root/testFolder/testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("root/testFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+    }
+
+    @Test
+    public void shouldBeAbleToCopyFile() throws Exception {
+        graph.create("/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                     TEST_CONTENT.getBytes()).orReplace().and();
+
+        kind = remoteRepos.checkPath("testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.copy("/testFile").to("/copiedFile");
+        kind = remoteRepos.checkPath("copiedFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("copiedFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+    }
+
+    @Test
+    public void shouldBeAbleToCopyFolder() throws Exception {
+        graph.create("/testFolder").orReplace().and();
+        graph.create("/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFolder/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                                TEST_CONTENT.getBytes()).orReplace().and();
+
+        kind = remoteRepos.checkPath("testFolder/testFile", -1);
+        assertThat(kind == SVNNodeKind.FILE, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.copy("/testFolder").to("/copiedFolder");
+        kind = remoteRepos.checkPath("copiedFolder", -1);
+        assertThat(kind == SVNNodeKind.DIR, is(Boolean.TRUE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("copiedFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+    }
+
+    @Test
+    public void shouldBeAbleToDeleteFolder() throws Exception {
+        graph.create("/testFolder").orReplace().and();
+        graph.create("/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFolder/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                                TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("testFolder/testFile", -1);
+        assertThat(kind, is(SVNNodeKind.FILE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.getNodeAt("/testFolder");
+
+        graph.delete("/testFolder").and();
+
+        try {
+            graph.getNodeAt("/testFolder");
+        } catch (PathNotFoundException expected) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void shouldBeAbleToDeleteFile() throws Exception {
+        graph.create("/testFolder").orReplace().and();
+        graph.create("/testFolder/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFolder/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                                TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("testFolder/testFile", -1);
+        assertThat(kind, is(SVNNodeKind.FILE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFolder/testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.getNodeAt("/testFolder/testFile");
+
+        graph.delete("/testFolder/testFile").and();
+
+        try {
+            graph.getNodeAt("/testFolder/testFile");
+        } catch (PathNotFoundException expected) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void shouldBeAbleToClearFileByRemovingDataProperty() throws Exception {
+        graph.create("/testFile").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE).orReplace().and();
+        graph.create("/testFile/jcr:content").with(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE).and(JcrLexicon.DATA,
+                                                                                                     TEST_CONTENT.getBytes()).orReplace().and();
+        kind = remoteRepos.checkPath("testFile", -1);
+        assertThat(kind, is(SVNNodeKind.FILE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile", -1, fileProperties, baos);
+        assertContents(baos, TEST_CONTENT);
+
+        graph.remove("jcr:data").on("/testFile/jcr:content").and();
+
+        kind = remoteRepos.checkPath("testFile", -1);
+        assertThat(kind, is(SVNNodeKind.FILE));
+        fileProperties = new SVNProperties();
+        baos = new ByteArrayOutputStream();
+        remoteRepos.getFile("testFile", -1, fileProperties, baos);
+        assertContents(baos, "");
+    }
+
+    protected void assertContents( ByteArrayOutputStream baos,
+                                   String contents ) {
+        assertThat(baos, notNullValue());
+        assertThat(baos.toString(), is(contents));
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,310 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.mock;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Subgraph;
+import org.jboss.dna.graph.cache.BasicCachePolicy;
+import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.observe.Observer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * @author Serge Pagop
+ */
+public class SvnRepositorySourceTest {
+
+    private SvnRepositorySource source;
+    private RepositoryConnection connection;
+    private String validName;
+    private String validUuidPropertyName;
+    private static String url;
+    private String username;
+    private String password;
+    private UUID validRootNodeUuid;
+    private final ExecutionContext context = new ExecutionContext();
+
+    @BeforeClass
+    public static void beforeAny() throws Exception {
+        url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+
+    }
+
+    @Before
+    public void beforeEach() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        this.source = new SvnRepositorySource();
+        // Set the mandatory properties ...
+        this.source.setName("Test Repository");
+        this.source.setUsername("sp");
+        this.source.setPassword("");
+        this.source.setRepositoryRootUrl(url);
+        this.source.initialize(new RepositoryContext() {
+
+            public Subgraph getConfiguration( int depth ) {
+                return null;
+            }
+
+            public ExecutionContext getExecutionContext() {
+                return context;
+            }
+
+            public Observer getObserver() {
+                return null;
+            }
+
+            public RepositoryConnectionFactory getRepositoryConnectionFactory() {
+                return new RepositoryConnectionFactory() {
+
+                    public RepositoryConnection createConnection( String sourceName ) throws RepositorySourceException {
+                        return null;
+                    }
+
+                };
+            }
+
+        });
+    }
+
+    @After
+    public void afterEach() throws Exception {
+        if (this.connection != null) {
+            this.connection.close();
+        }
+    }
+
+    @Test
+    public void shouldReturnNonNullCapabilities() {
+        assertThat(source.getCapabilities(), is(notNullValue()));
+    }
+
+    @Test
+    public void shouldNotSupportSameNameSiblings() {
+        assertThat(source.getCapabilities().supportsSameNameSiblings(), is(false));
+    }
+
+    @Test
+    public void shouldSupportUpdates() {
+        assertThat(source.getCapabilities().supportsUpdates(), is(false));
+    }
+
+    @Test
+    public void shouldHaveNullSourceNameUponConstruction() {
+        source = new SvnRepositorySource();
+        assertThat(source.getName(), is(nullValue()));
+    }
+
+    @Test
+    public void shouldAllowSettingName() {
+        source.setName("name you like");
+        assertThat(source.getName(), is("name you like"));
+        source.setName("name you do not like");
+        assertThat(source.getName(), is("name you do not like"));
+    }
+
+    @Test
+    public void shouldAllowSettingNameToNull() {
+        source.setName("something that can change the world");
+        source.setName(null);
+        assertThat(source.getName(), is(isNull()));
+    }
+
+
+    @Test
+    public void shouldHaveDefaultRetryLimit() {
+        assertThat(source.getRetryLimit(), is(SvnRepositorySource.DEFAULT_RETRY_LIMIT));
+    }
+    
+    @Test( expected = IllegalArgumentException.class )
+    public void shouldNotAllowNullSVNUrl() {
+        source.setRepositoryRootUrl(null);
+    }
+
+    @Test( expected = IllegalArgumentException.class )
+    public void shouldNotAllowEmptySVNUrl() {
+        source.setRepositoryRootUrl("");
+    }
+
+    @Test
+    public void shouldSetRetryLimitToZeroWhenSetWithNonPositiveValue() {
+        source.setRetryLimit(0);
+        assertThat(source.getRetryLimit(), is(0));
+        source.setRetryLimit(-1);
+        assertThat(source.getRetryLimit(), is(0));
+        source.setRetryLimit(-100);
+        assertThat(source.getRetryLimit(), is(0));
+    }
+
+    @Test
+    public void shouldAllowRetryLimitToBeSet() {
+        for (int i = 0; i != 100; ++i) {
+            source.setRetryLimit(i);
+            assertThat(source.getRetryLimit(), is(i));
+        }
+    }
+    
+    @Test( expected = RepositorySourceException.class )
+    public void shouldFailToCreateConnectionIfSourceHasNoName() {
+        source.setName(null);
+        source.getConnection();
+    }
+    
+    @Test( expected = RepositorySourceException.class )
+    public void shouldFailToCreateConnectionIfSourceHasNoUsername() {
+        source.setUsername(null);
+        source.getConnection();
+    }
+    
+    @Test( expected = RepositorySourceException.class )
+    public void shouldFailToCreateConnectionIfSourceHasNoPassword() {
+        source.setPassword(null);
+        source.getConnection();
+    }
+    
+    @Test
+    public void shouldCreateConnection() throws Exception {
+        connection = source.getConnection();
+        assertThat(connection, is(notNullValue()));
+    }
+    
+
+    @Test
+    public void shouldCreateJndiReferenceAndRecreatedObjectFromReference() throws Exception {
+        BasicCachePolicy cachePolicy = new BasicCachePolicy();
+        cachePolicy.setTimeToLive(1000L, TimeUnit.MILLISECONDS);
+        convertToAndFromJndiReference(validName, validRootNodeUuid, url, username, password, validUuidPropertyName, 100);
+    }
+
+    @Test
+    public void shouldCreateJndiReferenceAndRecreatedObjectFromReferenceWithNullProperties() throws Exception {
+        BasicCachePolicy cachePolicy = new BasicCachePolicy();
+        cachePolicy.setTimeToLive(1000L, TimeUnit.MILLISECONDS);
+        convertToAndFromJndiReference("some source", null, "url1", null, null, null, 100);
+        convertToAndFromJndiReference(null, null, "url2", null, null, null, 100);
+    }
+
+    private void convertToAndFromJndiReference( String sourceName,
+                                                UUID rootNodeUuid,
+                                                String url,
+                                                String username,
+                                                String password,
+                                                String uuidPropertyName,
+                                                int retryLimit ) throws Exception {
+        source.setRetryLimit(retryLimit);
+        source.setName(sourceName);
+        source.setRepositoryRootUrl(url);
+        source.setUsername(username);
+        source.setPassword(password);
+
+        Reference ref = source.getReference();
+
+        assertThat(ref.getClassName(), is(SvnRepositorySource.class.getName()));
+        assertThat(ref.getFactoryClassName(), is(SvnRepositorySource.class.getName()));
+
+        Map<String, Object> refAttributes = new HashMap<String, Object>();
+        Enumeration<RefAddr> enumeration = ref.getAll();
+        while (enumeration.hasMoreElements()) {
+            RefAddr addr = enumeration.nextElement();
+            refAttributes.put(addr.getType(), addr.getContent());
+        }
+
+        assertThat((String)refAttributes.remove(SvnRepositorySource.SOURCE_NAME), is(source.getName()));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.SVN_REPOSITORY_ROOT_URL), is(source.getRepositoryRootUrl()));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.SVN_USERNAME), is(source.getUsername()));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.SVN_PASSWORD), is(source.getPassword()));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.ROOT_NODE_UUID), is(source.getRootNodeUuid().toString()));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.RETRY_LIMIT), is(Integer.toString(source.getRetryLimit())));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.ALLOW_CREATING_WORKSPACES),
+                   is(Boolean.toString(source.isCreatingWorkspacesAllowed())));
+        assertThat((String)refAttributes.remove(SvnRepositorySource.DEFAULT_WORKSPACE),
+                   is(source.getDirectoryForDefaultWorkspace()));
+        refAttributes.remove(SvnRepositorySource.PREDEFINED_WORKSPACE_NAMES);
+        assertThat(refAttributes.isEmpty(), is(true));
+
+        // Recreate the object, use a newly constructed source ...
+        ObjectFactory factory = new SvnRepositorySource();
+        Name name = mock(Name.class);
+        Context context = mock(Context.class);
+        Hashtable<?, ?> env = new Hashtable<Object, Object>();
+        SvnRepositorySource recoveredSource = (SvnRepositorySource)factory.getObjectInstance(ref, name, context, env);
+        assertThat(recoveredSource, is(notNullValue()));
+
+        assertThat(recoveredSource.getName(), is(source.getName()));
+        assertThat(recoveredSource.getRepositoryRootUrl(), is(source.getRepositoryRootUrl()));
+        assertThat(recoveredSource.getUsername(), is(source.getUsername()));
+        assertThat(recoveredSource.getPassword(), is(source.getPassword()));
+
+        assertThat(recoveredSource.equals(source), is(true));
+        assertThat(source.equals(recoveredSource), is(true));
+    }
+
+    @Test
+    public void shouldAllowMultipleConnectionsToBeOpenAtTheSameTime() throws Exception {
+        List<RepositoryConnection> connections = new ArrayList<RepositoryConnection>();
+        try {
+            for (int i = 0; i != 10; ++i) {
+                RepositoryConnection conn = source.getConnection();
+                assertThat(conn, is(notNullValue()));
+                connections.add(conn);
+            }
+        } finally {
+            // Close all open connections ...
+            for (RepositoryConnection conn : connections) {
+                if (conn != null) {
+                    try {
+                        conn.close();
+                    } catch (Throwable t) {
+                        t.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
@@ -0,0 +1,119 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn2;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import java.util.List;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.JcrNtLexicon;
+import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.Node;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.test.ReadableConnectorTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Serge Pagop
+ *
+ */
+public class SvnRespositoryConnectorReadableTest extends ReadableConnectorTest {
+
+    private static String url;
+
+    @BeforeClass
+    public static void beforeAny() throws Exception {
+        url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
+
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#setUpSource()
+     */
+    @Override
+    protected RepositorySource setUpSource() throws Exception {
+        String[] predefinedWorkspaceNames = new String[]{url + "trunk", url + "tags"};
+        SvnRepositorySource source = new SvnRepositorySource();
+        source.setName("Test Repository");
+        source.setUsername("sp");
+        source.setPassword("");
+        source.setRepositoryRootUrl(url);
+        source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
+        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setCreatingWorkspacesAllowed(false);
+        
+        return source;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.graph.connector.test.AbstractConnectorTest#initializeContent(org.jboss.dna.graph.Graph)
+     */
+    @Override
+    protected void initializeContent( Graph graph ) throws Exception {
+     // No need to initialize any content ...
+    }
+    
+    @Test
+    public void shouldFindFolderSpecifiedInPathsAsNodesBelowRoot() {
+        Node root = graph.getNodeAt("/root");
+        assertThatNodeIsFolder(root);
+        Node dnaSubmission = graph.getNodeAt("/root/c/h/JBoss DNA Submission Receipt for JBoss World 2009.pdf");
+        assertThatNodeIsFile(dnaSubmission, "application/octet-stream", null);
+    }
+    
+    public void assertThatNodeIsFolder( Node node ) {
+        assertThat(node, is(notNullValue()));
+        assertThat(node.getProperty(JcrLexicon.PRIMARY_TYPE).getFirstValue(), is((Object)JcrNtLexicon.FOLDER));
+    }
+    
+    public void assertThatNodeIsFile( Node node,
+                                      String mimeType,
+                                      String contents ) {
+        assertThat(node, is(notNullValue()));
+        assertThat(node.getProperty(JcrLexicon.PRIMARY_TYPE).getFirstValue(), is((Object)JcrNtLexicon.FILE));
+
+        // Check that there is one child, and that the child is "jcr:content" ...
+        List<Location> children = node.getChildren();
+        assertThat(children.size(), is(1));
+        Location jcrContentLocation = children.get(0);
+        assertThat(jcrContentLocation.getPath().getLastSegment().getName(), is(JcrLexicon.CONTENT));
+
+        // Check that the "jcr:content" node is correct ...
+        Node jcrContent = graph.getNodeAt(jcrContentLocation);
+        assertThat(string(jcrContent.getProperty(JcrLexicon.MIMETYPE).getFirstValue()), is(mimeType));
+        if (contents != null) {
+            assertThat(string(jcrContent.getProperty(JcrLexicon.DATA).getFirstValue()), is(contents));
+        }
+
+    }
+
+}


Property changes on: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF


From dna-commits at lists.jboss.org  Tue Jan  5 07:50:09 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 07:50:09 -0500
Subject: [dna-commits] DNA SVN: r1525 - in trunk:
	extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector
	and 4 other directories.
Message-ID: <201001051250.o05Co92K004004@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 07:50:08 -0500 (Tue, 05 Jan 2010)
New Revision: 1525

Added:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnActionExecutor.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryLexicon.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryUtil.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/
Removed:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2/
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnConnectorTestUtil.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18nTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java
Log:
DNA-519 SVN Connector integration test runs in a very long time

Applied patch (DNA-519_repackage_svn.patch) that moves everything back into the svn package.  At this point, the SVN connector has now been fully converted to the path repository framework and can start to leverage the caching support provided therein.  The next step is to write a CachePolicy and WorkspaceCache implementation for the SVN connector to improve read performance.  After that, connection pooling can be considered.  

There is also a need to implement all-or-nothing transaction support.  That will be covered in a separate defect.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -31,7 +31,7 @@
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.Session;
-import org.jboss.dna.connector.svn2.SvnRepositorySource;
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrEngine;

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnActionExecutor.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnActionExecutor.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnActionExecutor.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnActionExecutor.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,73 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn;
+
+import org.jboss.dna.connector.scm.ScmAction;
+import org.jboss.dna.connector.scm.ScmActionExecutor;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.io.ISVNEditor;
+import org.tmatesoft.svn.core.io.SVNRepository;
+
+/**
+ */
+public class SvnActionExecutor implements ScmActionExecutor {
+
+    private final SVNRepository repository;
+
+    /**
+     * @param repository
+     */
+    public SvnActionExecutor( SVNRepository repository ) {
+        this.repository = repository;
+    }
+
+    /**
+     * @return repository
+     */
+    public SVNRepository getRepository() {
+        return repository;
+    }
+
+    /**
+     * @param action
+     * @param message
+     * @throws SVNException
+     */
+    public void execute( ScmAction action,
+                         String message ) throws SVNException {
+        ISVNEditor editor = this.repository.getCommitEditor(message, null);
+        editor.openRoot(-1);
+        try {
+            action.applyAction(editor);
+        } catch (Exception e) {
+            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: '{0}'", e.getMessage());
+            throw new SVNException(err, e);
+        }
+        editor.closeDir();
+        editor.closeEdit();
+
+    }
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepository.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,889 @@
+package org.jboss.dna.connector.svn;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.connector.scm.ScmAction;
+import org.jboss.dna.connector.svn.mgnt.AddDirectory;
+import org.jboss.dna.connector.svn.mgnt.AddFile;
+import org.jboss.dna.connector.svn.mgnt.DeleteEntry;
+import org.jboss.dna.connector.svn.mgnt.UpdateFile;
+import org.jboss.dna.graph.DnaIntLexicon;
+import org.jboss.dna.graph.DnaLexicon;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.JcrNtLexicon;
+import org.jboss.dna.graph.NodeConflictBehavior;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractWritablePathWorkspace;
+import org.jboss.dna.graph.connector.path.DefaultPathNode;
+import org.jboss.dna.graph.connector.path.PathNode;
+import org.jboss.dna.graph.connector.path.WritablePathRepository;
+import org.jboss.dna.graph.connector.path.WritablePathWorkspace;
+import org.jboss.dna.graph.connector.path.cache.WorkspaceCache;
+import org.jboss.dna.graph.property.Binary;
+import org.jboss.dna.graph.property.BinaryFactory;
+import org.jboss.dna.graph.property.DateTimeFactory;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.NameFactory;
+import org.jboss.dna.graph.property.NamespaceRegistry;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.PathFactory;
+import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.property.PropertyFactory;
+import org.jboss.dna.graph.property.Path.Segment;
+import org.jboss.dna.graph.request.InvalidRequestException;
+import org.tmatesoft.svn.core.SVNDirEntry;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNProperties;
+import org.tmatesoft.svn.core.SVNProperty;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+public class SvnRepository extends WritablePathRepository {
+
+    private static final String DEFAULT_MIME_TYPE = "application/octet-stream";
+    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+
+    private final SvnRepositorySource source;
+
+    static {
+        // for DAV (over http and https)
+        DAVRepositoryFactory.setup();
+        // For File
+        FSRepositoryFactory.setup();
+        // for SVN (over svn and svn+ssh)
+        SVNRepositoryFactoryImpl.setup();
+    }
+
+    public SvnRepository( SvnRepositorySource source ) {
+        super(source);
+
+        this.source = source;
+        initialize();
+    }
+
+    @Override
+    protected void initialize() {
+        ExecutionContext context = source.getRepositoryContext().getExecutionContext();
+        for (String workspaceName : source.getPredefinedWorkspaceNames()) {
+            doCreateWorkspace(context, workspaceName);
+        }
+
+        String defaultWorkspaceName = source.getDirectoryForDefaultWorkspace();
+        if (defaultWorkspaceName != null && !workspaces.containsKey(defaultWorkspaceName)) {
+            doCreateWorkspace(context, defaultWorkspaceName);
+        }
+
+    }
+
+    public WorkspaceCache getCache( String workspaceName ) {
+        return source.getPathRepositoryCache().getCache(workspaceName);
+    }
+
+    /**
+     * Internal method that creates a workspace and adds it to the map of active workspaces without checking to see if the source
+     * allows creating workspaces. This is useful when setting up predefined workspaces.
+     * 
+     * @param context the current execution context; may not be null
+     * @param name the name of the workspace to create; may not be null
+     * @return the newly created workspace; never null
+     */
+    private WritablePathWorkspace doCreateWorkspace( ExecutionContext context,
+                                                     String name ) {
+        SvnWorkspace workspace = new SvnWorkspace(name, source.getRootNodeUuid());
+
+        workspaces.putIfAbsent(name, workspace);
+        return (WritablePathWorkspace)workspaces.get(name);
+
+    }
+
+    @Override
+    protected WritablePathWorkspace createWorkspace( ExecutionContext context,
+                                                     String name ) {
+        if (!source.isCreatingWorkspacesAllowed()) {
+            String msg = SvnRepositoryConnectorI18n.unableToCreateWorkspaces.text(getSourceName(), name);
+            throw new InvalidRequestException(msg);
+        }
+
+        return doCreateWorkspace(context, name);
+    }
+
+    class SvnWorkspace extends AbstractWritablePathWorkspace {
+
+        /**
+         * Only certain properties are tolerated when writing content (dna:resource or jcr:resource) nodes. These properties are
+         * implicitly stored (primary type, data) or silently ignored (encoded, mimetype, last modified). The silently ignored
+         * properties must be accepted to stay compatible with the JCR specification.
+         */
+        private final Set<Name> ALLOWABLE_PROPERTIES_FOR_CONTENT = Collections.unmodifiableSet(new HashSet<Name>(
+                                                                                                                 Arrays.asList(new Name[] {
+                                                                                                                     JcrLexicon.PRIMARY_TYPE,
+                                                                                                                     JcrLexicon.DATA,
+                                                                                                                     JcrLexicon.ENCODED,
+                                                                                                                     JcrLexicon.MIMETYPE,
+                                                                                                                     JcrLexicon.LAST_MODIFIED,
+                                                                                                                     JcrLexicon.UUID,
+                                                                                                                     DnaIntLexicon.NODE_DEFINITON})));
+        /**
+         * Only certain properties are tolerated when writing files (nt:file) or folders (nt:folder) nodes. These properties are
+         * implicitly stored in the file or folder (primary type, created).
+         */
+        private final Set<Name> ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER = Collections.unmodifiableSet(new HashSet<Name>(
+                                                                                                                        Arrays.asList(new Name[] {
+                                                                                                                            JcrLexicon.PRIMARY_TYPE,
+                                                                                                                            JcrLexicon.CREATED,
+                                                                                                                            JcrLexicon.UUID,
+                                                                                                                            DnaIntLexicon.NODE_DEFINITON})));
+
+        private final SVNRepository workspaceRoot;
+
+        public SvnWorkspace( String name,
+                             UUID rootNodeUuid ) {
+            super(name, rootNodeUuid);
+
+            try {
+                workspaceRoot = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(name));
+
+                ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(source.getUsername(),
+                                                                                                     source.getPassword());
+                workspaceRoot.setAuthenticationManager(authManager);
+            } catch (SVNException ex) {
+                throw new IllegalStateException(ex);
+            }
+        }
+
+        public Path getLowestExistingPath( Path path ) {
+            do {
+                path = path.getParent();
+
+                if (getNode(path) != null) {
+                    return path;
+                }
+            } while (path != null);
+
+            assert false : "workspace root path was not a valid path";
+            return null;
+        }
+
+        public PathNode getNode( Path path ) {
+            WorkspaceCache cache = getCache(getName());
+
+            PathNode node = cache.get(path);
+            if (node != null) return node;
+
+            ExecutionContext context = source.getRepositoryContext().getExecutionContext();
+            List<Property> properties = new LinkedList<Property>();
+            List<Segment> children = new LinkedList<Segment>();
+
+            try {
+                boolean result = readNode(context, this.getName(), path, properties, children);
+                if (!result) return null;
+            } catch (SVNException ex) {
+                return null;
+            }
+
+            UUID uuid = path.isRoot() ? source.getRootNodeUuid() : null;
+            node = new DefaultPathNode(path, uuid, properties, children);
+
+            cache.set(node);
+            return node;
+        }
+
+        public PathNode createNode( ExecutionContext context,
+                                    PathNode parentNode,
+                                    Name name,
+                                    Map<Name, Property> properties,
+                                    NodeConflictBehavior conflictBehavior ) {
+
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+            NameFactory nameFactory = context.getValueFactories().getNameFactory();
+            PathFactory pathFactory = context.getValueFactories().getPathFactory();
+
+            // New name to commit into the svn repos workspace
+            String newName = name.getString(registry);
+
+            Property primaryTypeProp = properties.get(JcrLexicon.PRIMARY_TYPE);
+            Name primaryType = primaryTypeProp == null ? null : nameFactory.create(primaryTypeProp.getFirstValue());
+
+            Path parentPath = parentNode.getPath();
+            String parentPathAsString = parentPath.getString(registry);
+            Path newPath = pathFactory.create(parentPath, name);
+
+            String newChildPath = null;
+
+            // File
+            if (JcrNtLexicon.FILE.equals(primaryType)) {
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
+                // Parent node already exist
+                boolean skipWrite = false;
+
+                if (parentPath.isRoot()) {
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newName;
+                    } else {
+                        newChildPath = "/" + newName;
+                    }
+                } else {
+                    newChildPath = newPath.getString(registry);
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newChildPath.substring(1);
+                    }
+                }
+
+                // check if the new name already exist
+                try {
+                    if (SvnRepositoryUtil.exists(workspaceRoot, newChildPath)) {
+                        if (conflictBehavior.equals(NodeConflictBehavior.APPEND)) {
+                            I18n msg = SvnRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
+                            throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
+                        } else if (conflictBehavior.equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
+                            skipWrite = true;
+                        }
+                    }
+                } catch (SVNException e1) {
+                    throw new RepositorySourceException(getSourceName(), e1.getMessage());
+                }
+
+                // Don't try to write if the node conflict behavior is DO_NOT_REPLACE
+                if (!skipWrite) {
+                    // create a new, empty file
+                    if (newChildPath != null) {
+                        try {
+                            String rootPath = null;
+                            if (parentPath.isRoot()) {
+                                rootPath = "";
+                            } else {
+                                rootPath = parentPathAsString;
+                            }
+                            newFile(rootPath, newName, EMPTY_BYTE_ARRAY, null, getName(), workspaceRoot);
+                        } catch (SVNException e) {
+                            I18n msg = SvnRepositoryConnectorI18n.couldNotCreateFile;
+                            throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                          getName(),
+                                                                                          getSourceName(),
+                                                                                          e.getMessage()), e);
+                        }
+                    }
+                }
+            } else if (JcrNtLexicon.RESOURCE.equals(primaryType) || DnaLexicon.RESOURCE.equals(primaryType)) { // Resource
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_CONTENT);
+                if (parentPath.isRoot()) {
+                    newChildPath = parentPathAsString;
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = parentPathAsString.substring(1);
+                    }
+                } else {
+                    newChildPath = parentPathAsString;
+                    if (!source.getRepositoryRootUrl().equals(getName())) {
+                        newChildPath = newChildPath.substring(1);
+                    }
+                }
+
+                if (!JcrLexicon.CONTENT.equals(name)) {
+                    I18n msg = SvnRepositoryConnectorI18n.invalidNameForResource;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                  getName(),
+                                                                                  getSourceName(),
+                                                                                  newName));
+                }
+
+                Property parentPrimaryType = parentNode.getProperty(JcrLexicon.PRIMARY_TYPE);
+                Name parentPrimaryTypeName = parentPrimaryType == null ? null : nameFactory.create(parentPrimaryType.getFirstValue());
+                if (!JcrNtLexicon.FILE.equals(parentPrimaryTypeName)) {
+                    I18n msg = SvnRepositoryConnectorI18n.invalidPathForResource;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString, getName(), getSourceName()));
+                }
+
+                boolean skipWrite = false;
+                if (conflictBehavior.equals(NodeConflictBehavior.APPEND)) {
+                    I18n msg = SvnRepositoryConnectorI18n.sameNameSiblingsAreNotAllowed;
+                    throw new InvalidRequestException(msg.text("SVN Connector does not support Same Name Sibling"));
+                } else if (conflictBehavior.equals(NodeConflictBehavior.DO_NOT_REPLACE)) {
+                    // TODO check if the file already has content
+                    skipWrite = true;
+                }
+
+                if (!skipWrite) {
+                    Property dataProperty = properties.get(JcrLexicon.DATA);
+                    if (dataProperty == null) {
+                        I18n msg = SvnRepositoryConnectorI18n.missingRequiredProperty;
+                        String dataPropName = JcrLexicon.DATA.getString(registry);
+                        throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                      getName(),
+                                                                                      getSourceName(),
+                                                                                      dataPropName));
+                    }
+
+                    BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                    Binary binary = binaryFactory.create(properties.get(JcrLexicon.DATA).getFirstValue());
+                    // get old data
+                    ByteArrayOutputStream contents = new ByteArrayOutputStream();
+                    SVNProperties svnProperties = new SVNProperties();
+                    try {
+                        workspaceRoot.getFile(newChildPath, -1, svnProperties, contents);
+                        byte[] oldData = contents.toByteArray();
+
+                        // modify the empty old data with the new resource
+                        if (oldData != null) {
+                            String pathToFile;
+                            if (parentPath.isRoot()) {
+                                pathToFile = "";
+                            } else {
+                                pathToFile = parentPath.getParent().getString(registry);
+                            }
+                            String fileName = parentPath.getLastSegment().getString(registry);
+
+                            modifyFile(pathToFile, fileName, oldData, binary.getBytes(), null, getName(), workspaceRoot);
+                        }
+                    } catch (SVNException e) {
+                        I18n msg = SvnRepositoryConnectorI18n.couldNotReadData;
+                        throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                      getName(),
+                                                                                      getSourceName(),
+                                                                                      e.getMessage()), e);
+                    }
+                }
+
+            } else if (JcrNtLexicon.FOLDER.equals(primaryType) || primaryType == null) { // Folder
+                ensureValidProperties(context, properties.values(), ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER);
+                try {
+                    mkdir(parentPathAsString, newName, null, getName(), workspaceRoot);
+                } catch (SVNException e) {
+                    I18n msg = SvnRepositoryConnectorI18n.couldNotCreateFile;
+                    throw new RepositorySourceException(getSourceName(), msg.text(parentPathAsString,
+                                                                                  getName(),
+                                                                                  getSourceName(),
+                                                                                  e.getMessage()), e);
+                }
+            } else {
+                I18n msg = SvnRepositoryConnectorI18n.unsupportedPrimaryType;
+                throw new RepositorySourceException(getSourceName(), msg.text(primaryType.getString(registry),
+                                                                              parentPathAsString,
+                                                                              getName(),
+                                                                              getSourceName()));
+            }
+
+            PathNode node = getNode(newPath);
+
+            List<Segment> newChildren = new ArrayList<Segment>(parentNode.getChildSegments().size() + 1);
+            newChildren.addAll(parentNode.getChildSegments());
+            newChildren.add(node.getPath().getLastSegment());
+
+            WorkspaceCache cache = getCache(getName());
+            cache.set(new DefaultPathNode(parentNode.getPath(), parentNode.getUuid(), parentNode.getProperties(), newChildren));
+            cache.set(node);
+
+            return node;
+        }
+
+        /**
+         * Create a directory .
+         * 
+         * @param rootDirPath - the root directory where the created directory will reside
+         * @param childDirPath - the name of the created directory.
+         * @param comment - comment for the creation.
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException - if during the creation, there is an error.
+         */
+        private void mkdir( String rootDirPath,
+                            String childDirPath,
+                            String comment,
+                            String inWorkspace,
+                            SVNRepository currentRepository ) throws SVNException {
+
+            String tempParentPath = rootDirPath;
+            if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
+                    tempParentPath = tempParentPath.substring(1);
+                } else if (tempParentPath.equals("/")) {
+                    tempParentPath = "";
+                }
+            }
+            String checkPath = tempParentPath.length() == 0 ? childDirPath : tempParentPath + "/" + childDirPath;
+            SVNNodeKind nodeKind = null;
+            try {
+                nodeKind = currentRepository.checkPath(checkPath, -1);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "May be a Connecting problem to the repository or a user's authentication failure: {0}",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+
+            if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
+                ScmAction addNodeAction = new AddDirectory(rootDirPath, childDirPath);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Create a new file " + childDirPath : comment;
+                executor.execute(addNodeAction, comment);
+            } else {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "Node with name '{0}' can't be created",
+                                                             childDirPath);
+                throw new SVNException(err);
+            }
+        }
+
+        /**
+         * Create a file.
+         * 
+         * @param rootDirPath
+         * @param childFilePath
+         * @param content
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void newFile( String rootDirPath,
+                              String childFilePath,
+                              byte[] content,
+                              String comment,
+                              String inWorkspace,
+                              SVNRepository currentRepository ) throws SVNException {
+
+            String tempParentPath = rootDirPath;
+            if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                if (!tempParentPath.equals("/") && tempParentPath.startsWith("/")) {
+                    tempParentPath = tempParentPath.substring(1);
+                }
+            }
+            String checkPath = tempParentPath + "/" + childFilePath;
+            SVNNodeKind nodeKind = null;
+            try {
+                nodeKind = currentRepository.checkPath(checkPath, -1);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "May be a Connecting problem to the repository or a user's authentication failure: {0}",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+
+            if (nodeKind != null && nodeKind == SVNNodeKind.NONE) {
+                ScmAction addFileNodeAction = new AddFile(rootDirPath, childFilePath, content);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Create a new file " + childFilePath : comment;
+                executor.execute(addFileNodeAction, comment);
+            } else {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "Item with name '{0}' can't be created (already exist)",
+                                                             childFilePath);
+                throw new SVNException(err);
+            }
+        }
+
+        /**
+         * Modify a file
+         * 
+         * @param rootPath
+         * @param fileName
+         * @param oldData
+         * @param newData
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void modifyFile( String rootPath,
+                                 String fileName,
+                                 byte[] oldData,
+                                 byte[] newData,
+                                 String comment,
+                                 String inWorkspace,
+                                 SVNRepository currentRepository ) throws SVNException {
+            assert rootPath != null;
+            assert fileName != null;
+            assert oldData != null;
+            assert inWorkspace != null;
+            assert currentRepository != null;
+
+            try {
+
+                if (!source.getRepositoryRootUrl().equals(inWorkspace)) {
+                    if (rootPath.equals("/")) {
+                        rootPath = "";
+                    } else {
+                        rootPath = rootPath.substring(1) + "/";
+                    }
+                } else {
+                    if (!rootPath.equals("/")) {
+                        rootPath = rootPath + "/";
+                    }
+                }
+                String path = rootPath + fileName;
+
+                SVNNodeKind nodeKind = currentRepository.checkPath(path, -1);
+                if (nodeKind == SVNNodeKind.NONE || nodeKind == SVNNodeKind.UNKNOWN) {
+                    SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ENTRY_NOT_FOUND,
+                                                                 "Item with name '{0}' can't be found",
+                                                                 path);
+                    throw new SVNException(err);
+                }
+
+                ScmAction modifyFileAction = new UpdateFile(rootPath, fileName, oldData, newData);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "modify the " + fileName : comment;
+                executor.execute(modifyFileAction, comment);
+
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN, "This error is appeared: " + e.getMessage());
+                throw new SVNException(err, e);
+            }
+
+        }
+
+        /**
+         * Delete entry from the repository
+         * 
+         * @param path
+         * @param comment
+         * @param inWorkspace
+         * @param currentRepository
+         * @throws SVNException
+         */
+        private void eraseEntry( String path,
+                                 String comment,
+                                 String inWorkspace,
+                                 SVNRepository currentRepository ) throws SVNException {
+            assert path != null;
+            assert inWorkspace != null;
+            if (path.equals("/") || path.equals("")) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.BAD_URL, "The root directory cannot be deleted");
+                throw new SVNException(err);
+            }
+
+            try {
+                ScmAction deleteEntryAction = new DeleteEntry(path);
+                SvnActionExecutor executor = new SvnActionExecutor(currentRepository);
+                comment = comment == null ? "Delete the " + path : comment;
+                executor.execute(deleteEntryAction, comment);
+            } catch (SVNException e) {
+                SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                             "unknow error during delete action: {0)",
+                                                             e.getMessage());
+                throw new SVNException(err);
+            }
+        }
+
+        public boolean removeNode( ExecutionContext context,
+                                   Path nodePath ) {
+
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            boolean isContentNode = !nodePath.isRoot() && JcrLexicon.CONTENT.equals(nodePath.getLastSegment().getName());
+            Path actualPath = isContentNode ? nodePath.getParent() : nodePath;
+
+            try {
+                SVNNodeKind kind = getNodeKind(context, actualPath, source.getRepositoryRootUrl());
+
+                if (kind == SVNNodeKind.NONE) {
+                    return false;
+                }
+
+                if (isContentNode) {
+                    String rootPath = actualPath.getParent().getString(registry);
+                    String fileName = actualPath.getLastSegment().getString(registry);
+                    modifyFile(rootPath, fileName, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, null, getName(), workspaceRoot);
+                } else {
+                    eraseEntry(actualPath.getString(registry), null, getName(), workspaceRoot);
+                }
+            } catch (SVNException e) {
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.deleteFailed.text(nodePath, getSourceName()));
+            }
+
+            getCache(getName()).invalidate(nodePath);
+
+            return true;
+        }
+
+        public PathNode setProperties( ExecutionContext context,
+                                       Path nodePath,
+                                       Map<Name, Property> properties ) {
+            PathNode targetNode = getNode(nodePath);
+            if (targetNode == null) return null;
+
+            /*
+             * You can't really remove any properties from SVN nodes.
+             * You can clear the data of a dna:resource though
+             */
+
+            NameFactory nameFactory = context.getValueFactories().getNameFactory();
+            Property primaryTypeProperty = targetNode.getProperty(JcrLexicon.PRIMARY_TYPE);
+            Name primaryTypeName = primaryTypeProperty == null ? null : nameFactory.create(primaryTypeProperty.getFirstValue());
+            if (DnaLexicon.RESOURCE.equals(primaryTypeName)) {
+
+                for (Map.Entry<Name, Property> entry : properties.entrySet()) {
+                    if (JcrLexicon.DATA.equals(entry.getKey())) {
+                        NamespaceRegistry registry = context.getNamespaceRegistry();
+                        byte[] data;
+                        if (entry.getValue() == null) {
+                            data = EMPTY_BYTE_ARRAY;
+                        } else {
+                            BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                            data = binaryFactory.create(entry.getValue().getFirstValue()).getBytes();
+
+                        }
+
+                        try {
+                            Path actualPath = nodePath.getParent();
+                            modifyFile(actualPath.getParent().getString(registry),
+                                       actualPath.getLastSegment().getString(registry),
+                                       EMPTY_BYTE_ARRAY,
+                                       data,
+                                       "",
+                                       getName(),
+                                       workspaceRoot);
+
+                            PathNode node = getNode(nodePath);
+                            getCache(getName()).set(node);
+
+                            return node;
+                        } catch (SVNException ex) {
+                            throw new RepositorySourceException(getSourceName(),
+                                                                SvnRepositoryConnectorI18n.deleteFailed.text(nodePath,
+                                                                                                             getSourceName()), ex);
+                        }
+                    }
+                }
+            }
+
+            return targetNode;
+        }
+
+        protected boolean readNode( ExecutionContext context,
+                                    String workspaceName,
+                                    Path requestedPath,
+                                    List<Property> properties,
+                                    List<Segment> children ) throws SVNException {
+            PathFactory pathFactory = context.getValueFactories().getPathFactory();
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            if (requestedPath.isRoot()) {
+                // workspace root must be a directory
+                if (children != null) {
+                    final Collection<SVNDirEntry> entries = SvnRepositoryUtil.getDir(workspaceRoot, "");
+                    for (SVNDirEntry entry : entries) {
+                        // All of the children of a directory will be another directory or a file, but never a "jcr:content" node
+                        // ...
+                        children.add(pathFactory.createSegment(entry.getName()));
+                    }
+                }
+                // There are no properties on the root ...
+            } else {
+                // Generate the properties for this File object ...
+                PropertyFactory factory = context.getPropertyFactory();
+                DateTimeFactory dateFactory = context.getValueFactories().getDateFactory();
+
+                // Figure out the kind of node this represents ...
+                SVNNodeKind kind = getNodeKind(context, requestedPath, source.getRepositoryRootUrl());
+                if (kind == SVNNodeKind.NONE) {
+                    // The node doesn't exist
+                    return false;
+                }
+                if (kind == SVNNodeKind.DIR) {
+                    String directoryPath = requestedPath.getString(registry);
+                    if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                        directoryPath = directoryPath.substring(1);
+                    }
+                    if (children != null) {
+                        // Decide how to represent the children ...
+                        Collection<SVNDirEntry> dirEntries = SvnRepositoryUtil.getDir(workspaceRoot, directoryPath);
+                        for (SVNDirEntry entry : dirEntries) {
+                            // All of the children of a directory will be another directory or a file,
+                            // but never a "jcr:content" node ...
+                            children.add(pathFactory.createSegment(entry.getName()));
+                        }
+                    }
+                    if (properties != null) {
+                        // Load the properties for this directory ......
+                        properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FOLDER));
+                        SVNDirEntry entry = getEntryInfo(workspaceRoot, directoryPath);
+                        if (entry != null) {
+                            properties.add(factory.create(JcrLexicon.CREATED, dateFactory.create(entry.getDate())));
+                        }
+                    }
+                } else {
+                    // It's not a directory, so must be a file; the only child of an nt:file is the "jcr:content" node
+                    // ...
+                    if (requestedPath.endsWith(JcrLexicon.CONTENT)) {
+                        // There are never any children of these nodes, just properties ...
+                        if (properties != null) {
+                            String contentPath = requestedPath.getParent().getString(registry);
+                            if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                                contentPath = contentPath.substring(1);
+                            }
+                            SVNDirEntry entry = getEntryInfo(workspaceRoot, contentPath);
+                            if (entry != null) {
+                                // The request is to get properties of the "jcr:content" child node ...
+                                // Do NOT use "nt:resource", since it extends "mix:referenceable". The JCR spec
+                                // does not require that "jcr:content" is of type "nt:resource", but rather just
+                                // suggests it. Therefore, we can use "dna:resource", which is identical to
+                                // "nt:resource" except it does not extend "mix:referenceable"
+                                properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, DnaLexicon.RESOURCE));
+                                properties.add(factory.create(JcrLexicon.LAST_MODIFIED, dateFactory.create(entry.getDate())));
+                            }
+
+                            ByteArrayOutputStream os = new ByteArrayOutputStream();
+                            SVNProperties fileProperties = new SVNProperties();
+                            getData(contentPath, fileProperties, os);
+                            String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);
+                            if (mimeType == null) mimeType = DEFAULT_MIME_TYPE;
+                            properties.add(factory.create(JcrLexicon.MIMETYPE, mimeType));
+
+                            if (os.toByteArray().length > 0) {
+                                // Now put the file's content into the "jcr:data" property ...
+                                BinaryFactory binaryFactory = context.getValueFactories().getBinaryFactory();
+                                properties.add(factory.create(JcrLexicon.DATA, binaryFactory.create(os.toByteArray())));
+                            }
+                        }
+                    } else {
+                        // Determine the corresponding file path for this object ...
+                        String filePath = requestedPath.getString(registry);
+                        if (!source.getRepositoryRootUrl().equals(workspaceName)) {
+                            filePath = filePath.substring(1);
+                        }
+                        if (children != null) {
+                            // Not a "jcr:content" child node but rather an nt:file node, so add the child ...
+                            children.add(pathFactory.createSegment(JcrLexicon.CONTENT));
+                        }
+                        if (properties != null) {
+                            // Now add the properties to "nt:file" ...
+                            properties.add(factory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.FILE));
+                            ByteArrayOutputStream os = new ByteArrayOutputStream();
+                            SVNProperties fileProperties = new SVNProperties();
+                            getData(filePath, fileProperties, os);
+                            String created = fileProperties.getStringValue(SVNProperty.COMMITTED_DATE);
+                            properties.add(factory.create(JcrLexicon.CREATED, dateFactory.create(created)));
+                        }
+                    }
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Get some important informations of a path
+         * 
+         * @param repos
+         * @param path - the path
+         * @return - the {@link SVNDirEntry}, or null if there is no such entry
+         */
+        protected SVNDirEntry getEntryInfo( SVNRepository repos,
+                                            String path ) {
+            assert path != null;
+            SVNDirEntry entry = null;
+            try {
+                entry = repos.info(path, -1);
+            } catch (SVNException e) {
+                throw new RepositorySourceException(
+                                                    getSourceName(),
+                                                    SvnRepositoryConnectorI18n.connectingFailureOrUserAuthenticationProblem.text(getSourceName()));
+            }
+            return entry;
+        }
+
+        /**
+         * Get the content of a file.
+         * 
+         * @param path - the path to that file.
+         * @param properties - the properties of the file.
+         * @param os - the output stream where to store the content.
+         * @throws SVNException - throws if such path is not at that revision or in case of a connection problem.
+         */
+        protected void getData( String path,
+                                SVNProperties properties,
+                                OutputStream os ) throws SVNException {
+            workspaceRoot.getFile(path, -1, properties, os);
+
+        }
+
+        protected SVNNodeKind getNodeKind( ExecutionContext context,
+                                           Path path,
+                                           String repositoryRootUrl ) throws SVNException {
+            assert path != null;
+            assert repositoryRootUrl != null;
+
+            // See if the path is a "jcr:content" node ...
+            if (path.endsWith(JcrLexicon.CONTENT)) {
+                // We only want to use the parent path to find the actual file ...
+                path = path.getParent();
+            }
+            String pathAsString = path.getString(context.getNamespaceRegistry());
+            if (!repositoryRootUrl.equals(getName())) {
+                pathAsString = pathAsString.substring(1);
+            }
+
+            String absolutePath = pathAsString;
+            SVNNodeKind kind = workspaceRoot.checkPath(absolutePath, -1);
+            if (kind == SVNNodeKind.UNKNOWN) {
+                // node is unknown
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.nodeIsActuallyUnknow.text(pathAsString));
+            }
+            return kind;
+        }
+
+        protected SVNRepository getWorkspaceDirectory( String workspaceName ) {
+            if (workspaceName == null) workspaceName = source.getDirectoryForDefaultWorkspace();
+            SVNRepository repository = null;
+            SVNRepository repos = SvnRepositoryUtil.createRepository(workspaceName, source.getUsername(), source.getPassword());
+            if (SvnRepositoryUtil.isDirectory(repos, "")) {
+                repository = repos;
+            } else {
+                return null;
+            }
+            return repository;
+        }
+
+        /**
+         * Checks that the collection of {@code properties} only contains properties with allowable names.
+         * 
+         * @param context
+         * @param properties
+         * @param validPropertyNames
+         * @throws RepositorySourceException if {@code properties} contains a
+         * @see #ALLOWABLE_PROPERTIES_FOR_CONTENT
+         * @see #ALLOWABLE_PROPERTIES_FOR_FILE_OR_FOLDER
+         */
+        protected void ensureValidProperties( ExecutionContext context,
+                                              Collection<Property> properties,
+                                              Set<Name> validPropertyNames ) {
+            List<String> invalidNames = new LinkedList<String>();
+            NamespaceRegistry registry = context.getNamespaceRegistry();
+
+            for (Property property : properties) {
+                if (!validPropertyNames.contains(property.getName())) {
+                    invalidNames.add(property.getName().getString(registry));
+                }
+            }
+
+            if (!invalidNames.isEmpty()) {
+                throw new RepositorySourceException(getSourceName(),
+                                                    SvnRepositoryConnectorI18n.invalidPropertyNames.text(invalidNames.toString()));
+            }
+        }
+
+    }
+
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18n.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,89 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+* See the AUTHORS.txt file in the distribution for a full listing of 
+* individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn;
+
+import java.util.Locale;
+import java.util.Set;
+import org.jboss.dna.common.i18n.I18n;
+
+/**
+ * The internationalized string constants for the <code>org.jboss.dna.connector.svn*</code> packages.
+ */
+public final class SvnRepositoryConnectorI18n {
+
+    public static I18n connectorName;
+    public static I18n nodeDoesNotExist;
+    public static I18n nodeIsActuallyUnknow;
+    public static I18n propertyIsRequired;
+    public static I18n errorSerializingCachePolicyInSource;
+    public static I18n locationInRequestMustHavePath;
+    public static I18n sourceIsReadOnly;
+    public static I18n sourceDoesNotSupportCreatingWorkspaces;
+    public static I18n sourceDoesNotSupportCloningWorkspaces;
+    public static I18n sourceDoesNotSupportDeletingWorkspaces;
+    public static I18n connectingFailureOrUserAuthenticationProblem;
+    public static I18n pathForPredefinedWorkspaceDoesNotExist;
+    public static I18n pathForPredefinedWorkspaceIsNotDirectory;
+    public static I18n pathForPredefinedWorkspaceCannotBeRead;
+    public static I18n workspaceDoesNotExist;
+    public static I18n pathForDefaultWorkspaceDoesNotExist;
+    public static I18n pathForDefaultWorkspaceIsNotDirectory;
+    public static I18n pathForDefaultWorkspaceCannotBeRead;
+    public static I18n sameNameSiblingsAreNotAllowed;
+    public static I18n onlyTheDefaultNamespaceIsAllowed;
+    public static I18n unableToCreateWorkspaces;
+    public static I18n pathForRequestIsNotCorrect;
+    public static I18n pathForRequestMustStartWithAForwardSlash;
+    public static I18n nodeAlreadyExist;
+    public static I18n unsupportedPrimaryType;
+    public static I18n invalidPropertyNames;
+    public static I18n invalidNameForResource;
+    public static I18n invalidPathForResource;
+    public static I18n missingRequiredProperty;
+    public static I18n couldNotCreateFile;
+    public static I18n couldNotReadData;
+    public static I18n deleteFailed;
+
+    static {
+        try {
+            I18n.initialize(SvnRepositoryConnectorI18n.class);
+        } catch (final Exception err) {
+            System.err.println(err);
+        }
+    }
+
+    public static Set<Locale> getLocalizationProblemLocales() {
+        return I18n.getLocalizationProblemLocales(SvnRepositoryConnectorI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems() {
+        return I18n.getLocalizationProblems(SvnRepositoryConnectorI18n.class);
+    }
+
+    public static Set<String> getLocalizationProblems( Locale locale ) {
+        return I18n.getLocalizationProblems(SvnRepositoryConnectorI18n.class, locale);
+    }
+
+  
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryLexicon.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryLexicon.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryLexicon.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryLexicon.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,43 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn;
+
+import org.jboss.dna.connector.svn.SvnRepositorySource;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.basic.BasicName;
+
+/**
+ * The namespace and property names used within a {@link SvnRepositorySource} to store internal information.
+ */
+public class SvnRepositoryLexicon {
+
+    public static class Namespace {
+        public static final String URI = "http://www.jboss.org/dna/connector/svn";
+        public static final String PREFIX = "dnasvn";
+    }
+
+    public static final Name CHILD_PATH_SEGMENT_LIST = new BasicName(Namespace.URI, "orderedChildNames");
+    public static final Name UUID = new BasicName(Namespace.URI, "uuid");
+
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositorySource.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,408 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn;
+
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.Reference;
+import javax.naming.StringRefAddr;
+import javax.naming.spi.ObjectFactory;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.StringUtil;
+import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.path.AbstractPathRepositorySource;
+import org.jboss.dna.graph.connector.path.PathRepositoryConnection;
+
+/**
+ * The {@link RepositorySource} for the connector that exposes an area of the local/remote svn repository as content in a
+ * repository. This source considers a workspace name to be the path to the directory on the repository's root directory location
+ * that represents the root of that workspace. New workspaces can be created, as long as the names represent valid paths to
+ * existing directories.
+ */
+ at ThreadSafe
+public class SvnRepositorySource extends AbstractPathRepositorySource implements ObjectFactory {
+
+    /**
+     * The first serialized version of this source. Version {@value} .
+     */
+    private static final long serialVersionUID = 1L;
+
+    protected static final String SOURCE_NAME = "sourceName";
+    protected static final String SVN_REPOSITORY_ROOT_URL = "repositoryRootURL";
+    protected static final String SVN_USERNAME = "username";
+    protected static final String SVN_PASSWORD = "password";
+    protected static final String CACHE_TIME_TO_LIVE_IN_MILLISECONDS = "cacheTimeToLiveInMilliseconds";
+    protected static final String RETRY_LIMIT = "retryLimit";
+    protected static final String ROOT_NODE_UUID = "rootNodeUuid";
+    protected static final String DEFAULT_WORKSPACE = "defaultWorkspace";
+    protected static final String PREDEFINED_WORKSPACE_NAMES = "predefinedWorkspaceNames";
+    protected static final String ALLOW_CREATING_WORKSPACES = "allowCreatingWorkspaces";
+
+    /**
+     * This source supports events.
+     */
+    protected static final boolean SUPPORTS_EVENTS = true;
+    /**
+     * This source supports same-name-siblings.
+     */
+    protected static final boolean SUPPORTS_SAME_NAME_SIBLINGS = false;
+    /**
+     * This source does support creating workspaces.
+     */
+    protected static final boolean DEFAULT_SUPPORTS_CREATING_WORKSPACES = true;
+    /**
+     * This source supports udpates by default, but each instance may be configured to be read-only or updateable}.
+     */
+    public static final boolean DEFAULT_SUPPORTS_UPDATES = false;
+
+    /**
+     * This source supports creating references.
+     */
+    protected static final boolean SUPPORTS_REFERENCES = false;
+
+    private volatile String repositoryRootUrl;
+    private volatile String username;
+    private volatile String password;
+    private volatile String defaultWorkspace;
+    private volatile String[] predefinedWorkspaces = new String[] {};
+    private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(
+                                                                                                  SUPPORTS_SAME_NAME_SIBLINGS,
+                                                                                                  DEFAULT_SUPPORTS_UPDATES,
+                                                                                                  SUPPORTS_EVENTS,
+                                                                                                  DEFAULT_SUPPORTS_CREATING_WORKSPACES,
+                                                                                                  SUPPORTS_REFERENCES);
+
+    private transient SvnRepository repository;
+
+    /**
+     * Create a repository source instance.
+     */
+    public SvnRepositorySource() {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getCapabilities()
+     */
+    public RepositorySourceCapabilities getCapabilities() {
+        return capabilities;
+    }
+
+    /**
+     * @return the url
+     */
+    public String getRepositoryRootUrl() {
+        return this.repositoryRootUrl;
+    }
+
+    /**
+     * Set the url for the subversion repository.
+     * 
+     * @param url - the url location.
+     * @throws IllegalArgumentException If svn url is null or empty
+     */
+    public synchronized void setRepositoryRootUrl( String url ) {
+        CheckArg.isNotEmpty(url, "RepositoryRootUrl");
+        this.repositoryRootUrl = url;
+    }
+
+    public String getUsername() {
+        return this.username;
+    }
+
+    /**
+     * @param username
+     */
+    public synchronized void setUsername( String username ) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return this.password;
+    }
+
+    /**
+     * @param password
+     */
+    public synchronized void setPassword( String password ) {
+        this.password = password;
+    }
+
+    /**
+     * Get whether this source supports updates.
+     * 
+     * @return true if this source supports updates, or false if this source only supports reading content.
+     */
+    public boolean getSupportsUpdates() {
+        return capabilities.supportsUpdates();
+    }
+
+    /**
+     * Get the file system path to the existing directory that should be used for the default workspace. If the default is
+     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
+     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * 
+     * @return the file system path to the directory representing the default workspace, or null if the default should be the
+     *         current working directory
+     */
+    public String getDirectoryForDefaultWorkspace() {
+        return defaultWorkspace;
+    }
+
+    public String getDefaultWorkspaceName() {
+        return defaultWorkspace;
+    }
+
+    /**
+     * Set the file system path to the existing directory that should be used for the default workspace. If the default is
+     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
+     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * 
+     * @param pathToDirectoryForDefaultWorkspace the valid and resolvable file system path to the directory representing the
+     *        default workspace, or null if the current working directory should be used as the default workspace
+     */
+    public synchronized void setDirectoryForDefaultWorkspace( String pathToDirectoryForDefaultWorkspace ) {
+        this.defaultWorkspace = pathToDirectoryForDefaultWorkspace;
+    }
+
+    /**
+     * Gets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
+     * to a directory on the file system.
+     * 
+     * @return the names of the workspaces that this source starts with, or null if there are no such workspaces
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     */
+    public synchronized String[] getPredefinedWorkspaceNames() {
+        String[] copy = new String[predefinedWorkspaces.length];
+        System.arraycopy(predefinedWorkspaces, 0, copy, 0, predefinedWorkspaces.length);
+        return copy;
+    }
+
+    /**
+     * Sets the names of the workspaces that are available when this source is created. Each workspace name corresponds to a path
+     * to a directory on the file system.
+     * 
+     * @param predefinedWorkspaceNames the names of the workspaces that this source should start with, or null if there are no
+     *        such workspaces
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     * @see #getPredefinedWorkspaceNames()
+     */
+    public synchronized void setPredefinedWorkspaceNames( String[] predefinedWorkspaceNames ) {
+        this.predefinedWorkspaces = predefinedWorkspaceNames;
+    }
+
+    /**
+     * Get whether this source allows workspaces to be created dynamically.
+     * 
+     * @return true if this source allows workspaces to be created by clients, or false if the set of workspaces is fixed
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #getPredefinedWorkspaceNames()
+     * @see #setCreatingWorkspacesAllowed(boolean)
+     */
+    public boolean isCreatingWorkspacesAllowed() {
+        return capabilities.supportsCreatingWorkspaces();
+    }
+
+    /**
+     * Set whether this source allows workspaces to be created dynamically.
+     * 
+     * @param allowWorkspaceCreation true if this source allows workspaces to be created by clients, or false if the set of
+     *        workspaces is fixed
+     * @see #setPredefinedWorkspaceNames(String[])
+     * @see #getPredefinedWorkspaceNames()
+     * @see #isCreatingWorkspacesAllowed()
+     */
+    public synchronized void setCreatingWorkspacesAllowed( boolean allowWorkspaceCreation ) {
+        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), capabilities.supportsUpdates(),
+                                                        capabilities.supportsEvents(), allowWorkspaceCreation,
+                                                        capabilities.supportsReferences());
+    }
+
+    /**
+     * Get whether this source allows updates.
+     * 
+     * @return true if this source allows updates by clients, or false if no updates are allowed
+     * @see #setUpdatesAllowed(boolean)
+     */
+    @Override
+    public boolean areUpdatesAllowed() {
+        return capabilities.supportsUpdates();
+    }
+
+    /**
+     * Set whether this source allows updates to data within workspaces
+     * 
+     * @param allowUpdates true if this source allows updates to data within workspaces clients, or false if updates are not
+     *        allowed.
+     * @see #areUpdatesAllowed()
+     */
+    public synchronized void setUpdatesAllowed( boolean allowUpdates ) {
+        capabilities = new RepositorySourceCapabilities(capabilities.supportsSameNameSiblings(), allowUpdates,
+                                                        capabilities.supportsEvents(), capabilities.supportsCreatingWorkspaces(),
+                                                        capabilities.supportsReferences());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (obj instanceof SvnRepositorySource) {
+            SvnRepositorySource that = (SvnRepositorySource)obj;
+            if (this.getName() == null) {
+                if (that.getName() != null) return false;
+            } else {
+                if (!this.getName().equals(that.getName())) return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.naming.Referenceable#getReference()
+     */
+    public synchronized Reference getReference() {
+        String className = getClass().getName();
+        String factoryClassName = this.getClass().getName();
+        Reference ref = new Reference(className, factoryClassName, null);
+
+        if (getName() != null) {
+            ref.add(new StringRefAddr(SOURCE_NAME, getName()));
+        }
+        if (getRepositoryRootUrl() != null) {
+            ref.add(new StringRefAddr(SVN_REPOSITORY_ROOT_URL, getRepositoryRootUrl()));
+        }
+        if (getUsername() != null) {
+            ref.add(new StringRefAddr(SVN_USERNAME, getUsername()));
+        }
+        if (getPassword() != null) {
+            ref.add(new StringRefAddr(SVN_PASSWORD, getPassword()));
+        }
+        ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
+        ref.add(new StringRefAddr(ROOT_NODE_UUID, rootNodeUuid.toString()));
+        ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDirectoryForDefaultWorkspace()));
+        ref.add(new StringRefAddr(ALLOW_CREATING_WORKSPACES, Boolean.toString(isCreatingWorkspacesAllowed())));
+        String[] workspaceNames = getPredefinedWorkspaceNames();
+        if (workspaceNames != null && workspaceNames.length != 0) {
+            ref.add(new StringRefAddr(PREDEFINED_WORKSPACE_NAMES, StringUtil.combineLines(workspaceNames)));
+        }
+        return ref;
+
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context,
+     *      java.util.Hashtable)
+     */
+    public Object getObjectInstance( Object obj,
+                                     Name name,
+                                     Context nameCtx,
+                                     Hashtable<?, ?> environment ) throws Exception {
+        if (!(obj instanceof Reference)) return null;
+
+        Map<String, Object> values = valuesFrom((Reference)obj);
+
+        String sourceName = (String)values.get(SOURCE_NAME);
+        String repositoryRootUrl = (String)values.get(SVN_REPOSITORY_ROOT_URL);
+        String username = (String)values.get(SVN_USERNAME);
+        String password = (String)values.get(SVN_PASSWORD);
+        String retryLimit = (String)values.get(RETRY_LIMIT);
+        String rootNodeUuid = (String)values.get(ROOT_NODE_UUID);
+        String defaultWorkspace = (String)values.get(DEFAULT_WORKSPACE);
+        String createWorkspaces = (String)values.get(ALLOW_CREATING_WORKSPACES);
+
+        String combinedWorkspaceNames = (String)values.get(PREDEFINED_WORKSPACE_NAMES);
+        String[] workspaceNames = null;
+        if (combinedWorkspaceNames != null) {
+            List<String> paths = StringUtil.splitLines(combinedWorkspaceNames);
+            workspaceNames = paths.toArray(new String[paths.size()]);
+        }
+        // Create the source instance ...
+        SvnRepositorySource source = new SvnRepositorySource();
+        if (sourceName != null) source.setName(sourceName);
+        if (repositoryRootUrl != null && repositoryRootUrl.length() > 0) source.setRepositoryRootUrl(repositoryRootUrl);
+        if (username != null) source.setUsername(username);
+        if (password != null) source.setPassword(password);
+        if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
+        if (rootNodeUuid != null) source.setRootNodeUuid(rootNodeUuid);
+        if (defaultWorkspace != null) source.setDirectoryForDefaultWorkspace(defaultWorkspace);
+        if (createWorkspaces != null) source.setCreatingWorkspacesAllowed(Boolean.parseBoolean(createWorkspaces));
+        if (workspaceNames != null && workspaceNames.length != 0) source.setPredefinedWorkspaceNames(workspaceNames);
+        return source;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositorySource#getConnection()
+     */
+    public synchronized RepositoryConnection getConnection() throws RepositorySourceException {
+
+        String sourceName = getName();
+        if (sourceName == null || sourceName.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getName(), msg.text("name"));
+        }
+
+        String sourceUsername = getUsername();
+        if (sourceUsername == null || sourceUsername.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getUsername(), msg.text("username"));
+        }
+
+        String sourcePassword = getPassword();
+        if (sourcePassword == null) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getPassword(), msg.text("password"));
+        }
+
+        String repositoryRootURL = getRepositoryRootUrl();
+        if (repositoryRootURL == null || repositoryRootURL.trim().length() == 0) {
+            I18n msg = SvnRepositoryConnectorI18n.propertyIsRequired;
+            throw new RepositorySourceException(getRepositoryRootUrl(), msg.text("repositoryRootURL"));
+        }
+
+        if (this.repository == null) {
+            this.repository = new SvnRepository(this);
+        }
+
+        return new PathRepositoryConnection(this, this.repository);
+    }
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryUtil.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/SvnRepositoryUtil.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryUtil.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositoryUtil.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,235 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.connector.svn;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.request.InvalidWorkspaceException;
+import org.tmatesoft.svn.core.SVNDirEntry;
+import org.tmatesoft.svn.core.SVNErrorCode;
+import org.tmatesoft.svn.core.SVNErrorMessage;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNNodeKind;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
+import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+/**
+ */
+public class SvnRepositoryUtil {
+
+    /**
+     * @param url
+     * @param sourceName
+     * @return SVNURL
+     */
+    public static SVNURL createSVNURL( String url,
+                                       String sourceName ) {
+
+        SVNURL theUrl;
+        try {
+            theUrl = SVNURL.parseURIDecoded(url);
+        } catch (SVNException e) {
+            // protocol not supported by this connector
+            throw new RepositorySourceException(sourceName,
+                                                "Protocol is not supported by this connector or there is problem in the svn url");
+        }
+        return theUrl;
+    }
+
+    public static void setNewSVNRepositoryLocation( SVNRepository oldRespository,
+                                                    String url,
+                                                    boolean forceReconnect,
+                                                    String sourceName ) {
+        try {
+            oldRespository.setLocation(createSVNURL(url, sourceName), forceReconnect);
+        } catch (SVNException e) {
+            throw new RepositorySourceException(sourceName, "the old url and a new one has got different protocols");
+        }
+    }
+
+    /**
+     * @param repository
+     * @param path
+     * @param revisionNumber
+     * @param sourceName
+     * @return SVNNodeKind
+     */
+    public static SVNNodeKind checkThePath( SVNRepository repository,
+                                            String path,
+                                            long revisionNumber,
+                                            String sourceName ) {
+        SVNNodeKind kind;
+        try {
+            kind = repository.checkPath(path, revisionNumber);
+
+        } catch (SVNException e) {
+            return null;
+        }
+        return kind;
+    }
+
+    /**
+     * Create a {@link SVNRepository} from a http protocol.
+     * 
+     * @param url - the url of the repository.
+     * @param username - username credential.
+     * @param password - password credential
+     * @return {@link SVNRepository}.
+     */
+    public static SVNRepository createRepository( String url,
+                                                  String username,
+                                                  String password ) {
+        // for DAV (over http and https)
+        DAVRepositoryFactory.setup();
+        // For File
+        FSRepositoryFactory.setup();
+        // for SVN (over svn and svn+ssh)
+        SVNRepositoryFactoryImpl.setup();
+
+        // The factory knows how to create a DAVRepository
+        SVNRepository repository;
+        try {
+            repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
+
+            ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
+            repository.setAuthenticationManager(authManager);
+        } catch (SVNException e) {
+            throw new InvalidWorkspaceException(SvnRepositoryConnectorI18n.workspaceDoesNotExist.text(e.getMessage()));
+        }
+        return repository;
+    }
+
+    /**
+     * Util to get the last segment from a path.
+     * 
+     * @param repository
+     * @return last segment.
+     */
+    public static String getRepositoryWorspaceName( SVNRepository repository ) {
+        String[] segments = repository.getLocation().getPath().split("/");
+        return segments[segments.length - 1];
+    }
+
+    private SvnRepositoryUtil() {
+        // prvent construction
+    }
+
+    /**
+     * Check if the repository path exist.
+     * 
+     * @param repos
+     * @return true if repository exist and false otherwise.
+     */
+    public static boolean exist( SVNRepository repos ) {
+        try {
+            SVNNodeKind kind = repos.checkPath("", -1);
+            if (kind == SVNNodeKind.NONE) {
+                return false;
+            }
+            return true;
+
+        } catch (SVNException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Check if repository path is a directory.
+     * 
+     * @param repos
+     * @param path
+     * @return true if repository path is a directory and false otherwise.
+     */
+    public static boolean isDirectory( SVNRepository repos,
+                                       String path ) {
+        try {
+            SVNNodeKind kind = repos.checkPath(path, -1);
+            if (kind == SVNNodeKind.DIR) {
+                return true;
+            }
+        } catch (SVNException e) {
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * @param repos
+     * @param path
+     * @return a collect of entry from directory path; never null
+     */
+    @SuppressWarnings( "unchecked" )
+    public static Collection<SVNDirEntry> getDir( SVNRepository repos,
+                                                  String path ) {
+        try {
+            return repos.getDir(path, -1, null, (Collection<SVNDirEntry>)null);
+        } catch (SVNException e) {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * Check if the path is a file.
+     * 
+     * @param repos
+     * @param path
+     * @return true if the path is a file and false otherwise.
+     */
+    public static boolean isFile( SVNRepository repos,
+                                  String path ) {
+        try {
+            SVNNodeKind kind = repos.checkPath(path, -1);
+            if (kind == SVNNodeKind.FILE) {
+                return true;
+            }
+        } catch (SVNException e) {
+            return false;
+        }
+        return false;
+    }
+
+    public static boolean exists( SVNRepository repository,
+                                  String path ) throws SVNException{
+        try {
+            if (repository.checkPath(path, -1) == SVNNodeKind.NONE) {
+                return false;
+            } else if (repository.checkPath(path, -1) == SVNNodeKind.UNKNOWN) {
+                return false;
+            }
+        } catch (SVNException e) {
+            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNKNOWN,
+                                                         "unknow error during delete action: {0)",
+                                                         e.getMessage());
+            throw new SVNException(err);
+        }
+        return true;
+    }
+}

Copied: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java (from rev 1524, trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn2/package-info.java)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/package-info.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -0,0 +1,29 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ * The classes that make up the connector that accesses content from an SVN repository.
+ */
+
+package org.jboss.dna.connector.svn;
+

Copied: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn (from rev 1524, trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn2)

Copied: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn (from rev 1524, trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2)

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnConnectorTestUtil.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnConnectorTestUtil.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnConnectorTestUtil.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,7 +21,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import java.io.File;
 import java.io.IOException;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnIntegrationTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,12 +21,13 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.util.Map;
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18nTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorI18nTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18nTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,9 +21,10 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import org.jboss.dna.common.AbstractI18nTest;
+import org.jboss.dna.connector.svn.SvnRepositoryConnectorI18n;
 
 /**
  */

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNoCreateWorkspaceTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -1,5 +1,6 @@
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.WorkspaceConnectorTest;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorNotWritableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -1,5 +1,6 @@
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.NotWritableConnectorTest;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositoryConnectorWritableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,12 +21,13 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.io.ByteArrayOutputStream;
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRepositorySourceTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,7 +21,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
@@ -42,6 +42,7 @@
 import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.spi.ObjectFactory;
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.cache.BasicCachePolicy;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn2/SvnRespositoryConnectorReadableTest.java	2010-01-05 12:43:25 UTC (rev 1524)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java	2010-01-05 12:50:08 UTC (rev 1525)
@@ -21,12 +21,13 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.dna.connector.svn2;
+package org.jboss.dna.connector.svn;
 
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.util.List;
+import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.JcrNtLexicon;


From dna-commits at lists.jboss.org  Tue Jan  5 08:24:33 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 08:24:33 -0500
Subject: [dna-commits] DNA SVN: r1526 -
	trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn.
Message-ID: <201001051324.o05DOX7J013741@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 08:24:33 -0500 (Tue, 05 Jan 2010)
New Revision: 1526

Added:
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.properties
Removed:
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties
Log:
Renamed properties file to correct case sensitivity issue

Deleted: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties	2010-01-05 12:50:08 UTC (rev 1525)
+++ trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties	2010-01-05 13:24:33 UTC (rev 1526)
@@ -1,59 +0,0 @@
-#
-# JBoss DNA (http://www.jboss.org/dna)
-# See the COPYRIGHT.txt file distributed with this work for information
-# regarding copyright ownership.  Some portions may be licensed
-# to Red Hat, Inc. under one or more contributor license agreements.
-# See the AUTHORS.txt file in the distribution for a full listing of 
-# individual contributors. 
-#
-# JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
-# is licensed to you under the terms of the GNU Lesser General Public License as
-# published by the Free Software Foundation; either version 2.1 of
-# the License, or (at your option) any later version.
-#
-# JBoss DNA is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this software; if not, write to the Free
-# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-#
-
-connectorName = SVN Connector
-nodeDoesNotExist = This node kind is missing at {0}
-nodeAlreadyExist = This node {0} already exist.
-nodeIsActuallyUnknow =  This node kind is actually unknown {0}
-propertyIsRequired = The {0} property is required but has no value
-errorSerializingCachePolicyInSource = Error serializing a {0} instance owned by the {1} SVNRepositorySource
-sourceIsReadOnly = {0} is a read-only source; no updates are allowed
-sourceDoesNotSupportCreatingWorkspaces = {0} is a source that does not allow creating workspaces
-sourceDoesNotSupportCloningWorkspaces = {0} is a source that does not allow cloning workspaces
-sourceDoesNotSupportDeletingWorkspaces = {0} is a source that does not allow deleting workspaces
-connectingFailureOrUserAuthenticationProblem=failure occured while connecting to the repository {0} or the user's authentication failed
-workspaceDoesNotExist = The workspace "{0}" does not exist
-pathForDefaultWorkspaceDoesNotExist = The path "{0}" for the default workspace for the file system source "{1}" does not represent an existing directory
-pathForDefaultWorkspaceIsNotDirectory = The path "{0}" for the default workspace for the file system source "{1}" is actually a path to an existing file
-pathForDefaultWorkspaceCannotBeRead = The path "{0}" for the default workspace for the file system source "{1}" cannot be read
-pathForPredefinedWorkspaceDoesNotExist = The path "{0}" for the predefined workspace for the file system source "{1}" does not represent an existing directory
-pathForPredefinedWorkspaceIsNotDirectory = The path "{0}" for the predefined workspace for the file system source "{1}" is actually a path to an existing file
-pathForPredefinedWorkspaceCannotBeRead = The path "{0}" for the predefined workspace for the file system source "{1}" cannot be read
-sameNameSiblingsAreNotAllowed = {0}
-onlyTheDefaultNamespaceIsAllowed = {0} requires node names use the default namespace: {1}
-locationInRequestMustHavePath = {0} requires a path in the request: {1}
-unableToCreateWorkspaces = {0} does not allow creating new workspaces (request was to create "{1}")
-pathForRequestIsNotCorrect = The path "{0}" for the request is not correct.
-pathForRequestMustStartWithAForwardSlash = The path "{0}" for the request must start with a forward slash.
-unsupportedPrimaryType = Primary type "{3}" for path "{0}" in workspace "{1}" in {2} is not valid for the file system connector.  Valid primary types are nt\:file, nt\:folder, nt\:resource, and dna\:resouce. 
-invalidPropertyNames = Attempt to set or update invalid property names: {0}
-invalidNameForResource = Invalid node name "{3}" for node at path "{0}" in workspace "{1}" in {2}. The name of nodes with primary type nt:resource or dna:resource must be "jcr:content".
-invalidPathForResource = Invalid parent type for node at path "{0}" in workspace "{1}" in {2}. The parent node for nodes with primary type nt:resource or dna:resource must be of type nt:file.
-missingRequiredProperty = Missing required property "{3}" at path "{0}" in workspace "{1}" in {2} 
-
-
-# Writable tests
-couldNotCreateFile =Error reading data at path "{0}" in workspace "{1}" in source "{2}": "{3}"
-couldNotReadData= Error reading data in workspace "{1}" "{0}" "{2}" "{3}"
-deleteFailed=Error deleting path {0} in workspace with source name {1}
\ No newline at end of file

Copied: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.properties (from rev 1525, trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties)
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.properties	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SvnRepositoryConnectorI18n.properties	2010-01-05 13:24:33 UTC (rev 1526)
@@ -0,0 +1,59 @@
+#
+# JBoss DNA (http://www.jboss.org/dna)
+# See the COPYRIGHT.txt file distributed with this work for information
+# regarding copyright ownership.  Some portions may be licensed
+# to Red Hat, Inc. under one or more contributor license agreements.
+# See the AUTHORS.txt file in the distribution for a full listing of 
+# individual contributors. 
+#
+# JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+# is licensed to you under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# JBoss DNA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+
+connectorName = SVN Connector
+nodeDoesNotExist = This node kind is missing at {0}
+nodeAlreadyExist = This node {0} already exist.
+nodeIsActuallyUnknow =  This node kind is actually unknown {0}
+propertyIsRequired = The {0} property is required but has no value
+errorSerializingCachePolicyInSource = Error serializing a {0} instance owned by the {1} SVNRepositorySource
+sourceIsReadOnly = {0} is a read-only source; no updates are allowed
+sourceDoesNotSupportCreatingWorkspaces = {0} is a source that does not allow creating workspaces
+sourceDoesNotSupportCloningWorkspaces = {0} is a source that does not allow cloning workspaces
+sourceDoesNotSupportDeletingWorkspaces = {0} is a source that does not allow deleting workspaces
+connectingFailureOrUserAuthenticationProblem=failure occured while connecting to the repository {0} or the user's authentication failed
+workspaceDoesNotExist = The workspace "{0}" does not exist
+pathForDefaultWorkspaceDoesNotExist = The path "{0}" for the default workspace for the file system source "{1}" does not represent an existing directory
+pathForDefaultWorkspaceIsNotDirectory = The path "{0}" for the default workspace for the file system source "{1}" is actually a path to an existing file
+pathForDefaultWorkspaceCannotBeRead = The path "{0}" for the default workspace for the file system source "{1}" cannot be read
+pathForPredefinedWorkspaceDoesNotExist = The path "{0}" for the predefined workspace for the file system source "{1}" does not represent an existing directory
+pathForPredefinedWorkspaceIsNotDirectory = The path "{0}" for the predefined workspace for the file system source "{1}" is actually a path to an existing file
+pathForPredefinedWorkspaceCannotBeRead = The path "{0}" for the predefined workspace for the file system source "{1}" cannot be read
+sameNameSiblingsAreNotAllowed = {0}
+onlyTheDefaultNamespaceIsAllowed = {0} requires node names use the default namespace: {1}
+locationInRequestMustHavePath = {0} requires a path in the request: {1}
+unableToCreateWorkspaces = {0} does not allow creating new workspaces (request was to create "{1}")
+pathForRequestIsNotCorrect = The path "{0}" for the request is not correct.
+pathForRequestMustStartWithAForwardSlash = The path "{0}" for the request must start with a forward slash.
+unsupportedPrimaryType = Primary type "{3}" for path "{0}" in workspace "{1}" in {2} is not valid for the file system connector.  Valid primary types are nt\:file, nt\:folder, nt\:resource, and dna\:resouce. 
+invalidPropertyNames = Attempt to set or update invalid property names: {0}
+invalidNameForResource = Invalid node name "{3}" for node at path "{0}" in workspace "{1}" in {2}. The name of nodes with primary type nt:resource or dna:resource must be "jcr:content".
+invalidPathForResource = Invalid parent type for node at path "{0}" in workspace "{1}" in {2}. The parent node for nodes with primary type nt:resource or dna:resource must be of type nt:file.
+missingRequiredProperty = Missing required property "{3}" at path "{0}" in workspace "{1}" in {2} 
+
+
+# Writable tests
+couldNotCreateFile =Error reading data at path "{0}" in workspace "{1}" in source "{2}": "{3}"
+couldNotReadData= Error reading data in workspace "{1}" "{0}" "{2}" "{3}"
+deleteFailed=Error deleting path {0} in workspace with source name {1}
\ No newline at end of file


From dna-commits at lists.jboss.org  Tue Jan  5 08:31:48 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 08:31:48 -0500
Subject: [dna-commits] DNA SVN: r1527 - in
	trunk/extensions/dna-sequencer-ddl/src:
	main/java/org/jboss/dna/sequencer/ddl/dialect/derby and 10
	other directories.
Message-ID: <201001051331.o05DVm2K014680@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-05 08:31:47 -0500 (Tue, 05 Jan 2010)
New Revision: 1527

Added:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Removed:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
Modified:
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
Log:
DNA-49 Adding additional parsing and tests. Includes parsing for Grant statements in Standard, Derby & Postgres

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -40,6 +40,9 @@
     public static final String GRANT = "GRANT";
     public static final String INDEX = "INDEX";
     public static final String INSERT = "INSERT";
+    public static final String UPDATE = "UPDATE";
+    public static final String DELETE = "DELETE";
+    public static final String SELECT = "SELECT";
     public static final String KEY = "KEY";
     public static final String OFF = "OFF";
     public static final String ON = "ON";
@@ -125,7 +128,9 @@
         // | <translation definition>
         // | <assertion definition>
         public final static Name[] VALID_SCHEMA_CHILD_TYPES = {StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT,
-            StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT, StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+            StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
+            StandardDdlLexicon.TYPE_GRANT_ON_DOMAIN_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_TRANSLATION_STATEMENT,
+            StandardDdlLexicon.TYPE_GRANT_ON_COLLATION_STATEMENT, StandardDdlLexicon.TYPE_GRANT_ON_CHARACTER_SET_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT, StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT, StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT,
             StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT};

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -42,11 +42,11 @@
     public static I18n unusedTokensParsingColumnDefinition;
     public static I18n alterTableOptionNotFound;
     public static I18n unusedTokensParsingCreateIndex;
+    public static I18n missingReturnTypeForFunction;
 //    public static I18n 
 //    public static I18n 
 //    public static I18n 
 //    public static I18n 
-//    public static I18n 
     
 
     static {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -95,6 +95,11 @@
     public static final Name TYPE_ALTER_TABLE_STATEMENT = new BasicName(Namespace.URI, "alterTableStatement");
     public static final Name TYPE_ALTER_DOMAIN_STATEMENT = new BasicName(Namespace.URI, "alterDomainStatement");
     public static final Name TYPE_GRANT_STATEMENT = new BasicName(Namespace.URI, "grantStatement");
+    public static final Name TYPE_GRANT_ON_TABLE_STATEMENT = new BasicName(Namespace.URI, "grantOnTableStatement");
+    public static final Name TYPE_GRANT_ON_DOMAIN_STATEMENT = new BasicName(Namespace.URI, "grantOnDomainStatement");
+    public static final Name TYPE_GRANT_ON_COLLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnCollationStatement");
+    public static final Name TYPE_GRANT_ON_CHARACTER_SET_STATEMENT = new BasicName(Namespace.URI, "grantOnCharacterSetStatement");
+    public static final Name TYPE_GRANT_ON_TRANSLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnTranslationStatement");
     public static final Name TYPE_SET_STATEMENT = new BasicName(Namespace.URI, "setStatement");
     public static final Name TYPE_INSERT_STATEMENT = new BasicName(Namespace.URI, "insertStatement");
 
@@ -122,18 +127,21 @@
     public static final Name TYPE_FK_COLUMN_REFERENCE = new BasicName(Namespace.URI, "fkColumnReference");
     public static final Name TYPE_CLAUSE = new BasicName(Namespace.URI, "clause");
 
-    public static final Name DDL_EXPRESSION = new BasicName(Namespace.URI, "expression");
-    public static final Name DDL_ORIGINAL_EXPRESSION = new BasicName(Namespace.URI, "originalExpression");
-    public static final Name DDL_START_LINE_NUMBER = new BasicName(Namespace.URI, "startLineNumber");
-    public static final Name DDL_START_COLUMN_NUMBER = new BasicName(Namespace.URI, "startColumnNumber");
-    public static final Name DDL_START_CHAR_INDEX = new BasicName(Namespace.URI, "startCharIndex");
+    public static final Name DDL_EXPRESSION                 = new BasicName(Namespace.URI, "expression");
+    public static final Name DDL_ORIGINAL_EXPRESSION        = new BasicName(Namespace.URI, "originalExpression");
+    public static final Name DDL_START_LINE_NUMBER          = new BasicName(Namespace.URI, "startLineNumber");
+    public static final Name DDL_START_COLUMN_NUMBER        = new BasicName(Namespace.URI, "startColumnNumber");
+    public static final Name DDL_START_CHAR_INDEX           = new BasicName(Namespace.URI, "startCharIndex");
     // public static final Name DDL_LENGTH = new BasicName(Namespace.URI, "length");
 
     /*
      * node property names
      */
     public static final Name NAME = new BasicName(Namespace.URI, "name");
+    public static final Name OPTION = new BasicName(Namespace.URI, "option");
+    public static final Name TYPE = new BasicName(Namespace.URI, "type");
     public static final Name NEW_NAME = new BasicName(Namespace.URI, "newName");
+    public static final Name SQL = new BasicName(Namespace.URI, "sql");
     public static final Name TEMPORARY = new BasicName(Namespace.URI, "temporary");
     public static final Name ON_COMMIT_VALUE = new BasicName(Namespace.URI, "onCommitValue");
     public static final Name COLUMN_DEFINITIONS = new BasicName(Namespace.URI, "datatypeScale");
@@ -153,6 +161,10 @@
     public static final Name DROP_BEHAVIOR = new BasicName(Namespace.URI, "dropBehavior");
     public static final Name PROPERTY_VALUE = new BasicName(Namespace.URI, "propValue");
     public static final Name PROBLEM_LEVEL = new BasicName(Namespace.URI, "problemLevel");
+    public static final Name GRANT_PRIVILEGE = new BasicName(Namespace.URI, "grantPrivilege");
+    public static final Name ALL_PRIVILEGES = new BasicName(Namespace.URI, "allPrivileges");
+    public static final Name WITH_GRANT_OPTION = new BasicName(Namespace.URI, "withGrantOption");
+    public static final Name GRANTEE = new BasicName(Namespace.URI, "grantee");
 
     public static final Name CREATE_VIEW_QUERY_EXPRESSION = new BasicName(Namespace.URI, "queryExpression");
     public static final Name CREATE_VIEW_OPTION_CLAUSE = new BasicName(Namespace.URI, "createViewOption");
@@ -163,15 +175,7 @@
      * node child types
      */
 
-    // public static final Name COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI, "columnReference");
-    // public static final Name TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI, "tableConstraint");
-    // public static final Name STATEMENT_OPTION_TYPE = new BasicName(Namespace.URI, "statementOption");
     public static final Name DROP_OPTION_TYPE = new BasicName(Namespace.URI, "dropOption");
-    // public static final Name DROP_COLUMN_DEFINITION_TYPE = new BasicName(Namespace.URI, "dropColumnDefinition");
-    // public static final Name DROP_TABLE_CONSTRAINT_TYPE = new BasicName(Namespace.URI, "dropTableConstraint");
-    // public static final Name ALTER_COLUMN_DEFINITION_TYPE = new BasicName(Namespace.URI, "alterColumnDefinition");
-    // public static final Name TABLE_REFERENCE_TYPE = new BasicName(Namespace.URI, "tableReference ");
-    // public static final Name FK_COLUMN_REFERENCE_TYPE = new BasicName(Namespace.URI, "fkColumnReference ");
     public static final Name COLUMN_ATTRIBUTE_TYPE = new BasicName(Namespace.URI, "columnAttribute");
     public static final Name CONSTRAINT_ATTRIBUTE_TYPE = new BasicName(Namespace.URI, "constraintAttribute ");
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -29,60 +29,7 @@
  */
 package org.jboss.dna.sequencer.ddl;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CHECK_SEARCH_CONDITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLLATION_NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CONSTRAINT_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.MESSAGE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NULLABLE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROBLEM_LEVEL;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TEMPORARY;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_ASSERTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_CHARACTER_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_COLLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_ASSERTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_CHARACTER_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TRANSLATION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_FK_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_INSERT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_SET_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_CONSTRAINT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_TABLE_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -828,24 +775,140 @@
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
-
-        // Original implementation does NOT parse Insert statement, but just returns a generic TypedStatement
+        assert tokens.matches(GRANT);
+        
         markStartOfStatement(tokens);
 
-        tokens.consume(GRANT);
-        String name = GRANT;
+        //      Syntax for tables
+        //
+        //             GRANT <privileges> ON <object name>
+        //                      TO <grantee> [ { <comma> <grantee> }... ]
+        //                      [ WITH GRANT OPTION ]
+        //
+        //        <object name> ::=
+        //            [ TABLE ] <table name>
+        //          | DOMAIN <domain name>
+        //          | COLLATION <collation name>
+        //          | CHARACTER SET <character set name>
+        //          | TRANSLATION <translation name>
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        AstNode grantNode = null;
+        boolean allPrivileges = false;
 
-        tokens.consume(); // First Privilege token
+        List<AstNode> privileges = new ArrayList<AstNode>();
 
-        AstNode node = nodeFactory().node(name, parentNode, TYPE_GRANT_STATEMENT);
+        tokens.consume("GRANT");
 
-        parseUntilTerminator(tokens);
+            if( tokens.canConsume("ALL", "PRIVILEGES")) {
+                allPrivileges = true;
+            } else { 
+                parseGrantPrivileges(tokens, privileges);
+            }
+            tokens.consume("ON");
 
-        markEndOfStatement(tokens, node);
+            if( tokens.canConsume("DOMAIN") ) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_DOMAIN_STATEMENT);
+            } else if( tokens.canConsume("COLLATION")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_COLLATION_STATEMENT);
+            } else if( tokens.canConsume("CHARACTER", "SET")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_CHARACTER_SET_STATEMENT);
+            } else if( tokens.canConsume("TRANSLATION")) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TRANSLATION_STATEMENT);
+            } else {
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+            }
 
-        return node;
+            
+            // Attach privileges to grant node
+            for( AstNode node : privileges ) {
+                node.setParent(grantNode);
+            }
+            if( allPrivileges ) {
+                grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+            }
+
+        
+        tokens.consume("TO");
+        
+        do {
+            String grantee = parseName(tokens);
+            nodeFactory().node(grantee, grantNode, GRANTEE);
+        } while( tokens.canConsume(COMMA));
+        
+        if( tokens.canConsume("WITH", "GRANT", "OPTION")) {
+            grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+        }
+        
+        markEndOfStatement(tokens, grantNode);
+
+        return grantNode;
     }
 
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          SELECT
+        //        | DELETE
+        //        | INSERT [ <left paren> <privilege column list> <right paren> ]
+        //        | UPDATE [ <left paren> <privilege column list> <right paren> ]
+        //        | REFERENCES [ <left paren> <privilege column list> <right paren> ]
+        //        | USAGE
+
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+            } else if( tokens.canConsume("USAGE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "USAGE");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            }
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
+
+    }
     /**
      * Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
      * 

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -96,7 +96,7 @@
 	    public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
 	    	StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT, 
 	    	StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
-	    	StandardDdlLexicon.TYPE_GRANT_STATEMENT
+	    	StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT
 	  	};
 	}
 	interface DerbyDataTypes {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -41,50 +41,59 @@
      * 
      * SQL-92 Spec
      * 
-     * 		CREATE SCHEMA
-	 *		CREATE DOMAIN
-	 * 		CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
-	 *		CREATE VIEW 		
-	 *		CREATE ASSERTION 
-	 *		CREATE CHARACTER SET 
-	 *		CREATE COLLATION 
-	 *		CREATE TRANSLATION
-	 * ===> CREATE FUNCTION
-	 * ===> CREATE INDEX
-	 * ===> CREATE PROCEDURE
-	 * ===> CREATE ROLE
-	 * ===> CREATE SYNONYM
-	 * ===> CREATE TRIGGER
-	 * 
-	 *		ALTER TABLE
-	 *
-	 * ===> GRANT
-	 * ===> LOCK TABLE
-	 * ===> RENAME TABLE
-	 * ===> RENAME INDEX
-	 * ===> SET
-	 * ===> DECLARE GLOBAL TEMPORARY TABLE
+     *      CREATE SCHEMA
+     *      CREATE DOMAIN
+     *      CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
+     *      CREATE VIEW         
+     *      CREATE ASSERTION 
+     *      CREATE CHARACTER SET 
+     *      CREATE COLLATION 
+     *      CREATE TRANSLATION
+     * ===> CREATE FUNCTION
+     * ===> CREATE INDEX
+     * ===> CREATE PROCEDURE
+     * ===> CREATE ROLE
+     * ===> CREATE SYNONYM
+     * ===> CREATE TRIGGER
+     * 
+     *      ALTER TABLE
+     *
+     * ===> GRANT
+     * ===> LOCK TABLE
+     * ===> RENAME TABLE
+     * ===> RENAME INDEX
+     * ===> SET
+     * ===> DECLARE GLOBAL TEMPORARY TABLE
      */
  
-    public static final Name TYPE_CREATE_FUNCTION_STATEMENT 		= new BasicName(Namespace.URI, "createFunctionStatement");
-    public static final Name TYPE_CREATE_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "createIndexStatement");
-    public static final Name TYPE_CREATE_PROCEDURE_STATEMENT 		= new BasicName(Namespace.URI, "createProcedureStatement");
-    public static final Name TYPE_CREATE_ROLE_STATEMENT 			= new BasicName(Namespace.URI, "createRoleStatement");
-    public static final Name TYPE_CREATE_SYNONYM_STATEMENT 		= new BasicName(Namespace.URI, "createSynonymStatement");
-    public static final Name TYPE_CREATE_TRIGGER_STATEMENT 		= new BasicName(Namespace.URI, "createTriggerStatement");
-    public static final Name TYPE_LOCK_TABLE_STATEMENT 			= new BasicName(Namespace.URI, "lockTableStatement");
-    public static final Name TYPE_RENAME_TABLE_STATEMENT 			= new BasicName(Namespace.URI, "renameTableStatement");
-    public static final Name TYPE_RENAME_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "renameIndexStatement");
+    public static final Name TYPE_CREATE_FUNCTION_STATEMENT     = new BasicName(Namespace.URI, "createFunctionStatement");
+    public static final Name TYPE_CREATE_INDEX_STATEMENT        = new BasicName(Namespace.URI, "createIndexStatement");
+    public static final Name TYPE_CREATE_PROCEDURE_STATEMENT    = new BasicName(Namespace.URI, "createProcedureStatement");
+    public static final Name TYPE_CREATE_ROLE_STATEMENT         = new BasicName(Namespace.URI, "createRoleStatement");
+    public static final Name TYPE_CREATE_SYNONYM_STATEMENT      = new BasicName(Namespace.URI, "createSynonymStatement");
+    public static final Name TYPE_CREATE_TRIGGER_STATEMENT      = new BasicName(Namespace.URI, "createTriggerStatement");
+    public static final Name TYPE_LOCK_TABLE_STATEMENT          = new BasicName(Namespace.URI, "lockTableStatement");
+    public static final Name TYPE_RENAME_TABLE_STATEMENT        = new BasicName(Namespace.URI, "renameTableStatement");
+    public static final Name TYPE_RENAME_INDEX_STATEMENT        = new BasicName(Namespace.URI, "renameIndexStatement");
     public static final Name TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT = new BasicName(Namespace.URI, "declareGlobalTemporaryTableStatement");
 
-    public static final Name TYPE_DROP_FUNCTION_STATEMENT 		= new BasicName(Namespace.URI, "dropFunctionStatement");
-    public static final Name TYPE_DROP_INDEX_STATEMENT 			= new BasicName(Namespace.URI, "dropIndexStatement");
-    public static final Name TYPE_DROP_PROCEDURE_STATEMENT 		= new BasicName(Namespace.URI, "dropProcedureStatement");
-    public static final Name TYPE_DROP_ROLE_STATEMENT 			= new BasicName(Namespace.URI, "dropRoleStatement");
-    public static final Name TYPE_DROP_SYNONYM_STATEMENT 			= new BasicName(Namespace.URI, "dropSynonymStatement");
-    public static final Name TYPE_DROP_TRIGGER_STATEMENT 			= new BasicName(Namespace.URI, "dropTriggerStatement");
+    public static final Name TYPE_DROP_FUNCTION_STATEMENT       = new BasicName(Namespace.URI, "dropFunctionStatement");
+    public static final Name TYPE_DROP_INDEX_STATEMENT          = new BasicName(Namespace.URI, "dropIndexStatement");
+    public static final Name TYPE_DROP_PROCEDURE_STATEMENT      = new BasicName(Namespace.URI, "dropProcedureStatement");
+    public static final Name TYPE_DROP_ROLE_STATEMENT           = new BasicName(Namespace.URI, "dropRoleStatement");
+    public static final Name TYPE_DROP_SYNONYM_STATEMENT        = new BasicName(Namespace.URI, "dropSynonymStatement");
+    public static final Name TYPE_DROP_TRIGGER_STATEMENT        = new BasicName(Namespace.URI, "dropTriggerStatement");
     
-    public static final Name UNIQUE_INDEX 			= new BasicName(Namespace.URI, "unique");
-    public static final Name TABLE_NAME 			= new BasicName(Namespace.URI, "tableName");
-    public static final Name GENERATED_COLUMN_SPEC_CLAUSE = new BasicName(Namespace.URI, "generatedColumnSpecClause");
+    public static final Name TYPE_FUNCTION_PARAMETER            = new BasicName(Namespace.URI, "functionParameter");
+    public static final Name TYPE_INDEX_COLUMN_REFERENCE        = new BasicName(Namespace.URI, "indexColumnReference");
+    public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT   = new BasicName(Namespace.URI, "grantOnFunctionStatement");
+    public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT  = new BasicName(Namespace.URI, "grantOnProcedureStatement");
+    public static final Name TYPE_GRANT_ROLES_STATEMENT         = new BasicName(Namespace.URI, "grantRolesStatement");
+    
+    public static final Name UNIQUE_INDEX                       = new BasicName(Namespace.URI, "unique");
+    public static final Name ORDER                              = new BasicName(Namespace.URI, "order");
+    public static final Name TABLE_NAME                         = new BasicName(Namespace.URI, "tableName");
+    public static final Name ROLE_NAME                          = new BasicName(Namespace.URI, "roleName");
+    public static final Name GENERATED_COLUMN_SPEC_CLAUSE       = new BasicName(Namespace.URI, "generatedColumnSpecClause");
+    public static final Name IS_TABLE_TYPE                      = new BasicName(Namespace.URI, "isTableType");
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,26 +1,7 @@
 package org.jboss.dna.sequencer.ddl.dialect.derby;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.COLUMN_ATTRIBUTE_TYPE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.PROPERTY_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TABLE_NAME;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_PROCEDURE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_SYNONYM_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_PROCEDURE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_SYNONYM_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.UNIQUE_INDEX;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon.*;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -38,7 +19,9 @@
 /**
  * Derby-specific DDL Parser. Includes custom data types as well as custom DDL statements.
  */
-public class DerbyDdlParser extends StandardDdlParser implements DerbyDdlConstants {
+public class DerbyDdlParser extends StandardDdlParser 
+        implements DerbyDdlConstants,
+        DerbyDdlConstants.DerbyStatementStartPhrases {
     private final String parserId = "DERBY";
 
     static List<String[]> derbyDataTypeStrings = new ArrayList<String[]>();
@@ -69,11 +52,11 @@
     public void registerWords( DdlTokenStream tokens ) {
         tokens.registerKeyWords(CUSTOM_KEYWORDS);
 
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.ALTER_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.CREATE_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.DROP_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.SET_PHRASES);
-        tokens.registerStatementStartPhrase(DerbyStatementStartPhrases.MISC_PHRASES);
+        tokens.registerStatementStartPhrase(ALTER_PHRASES);
+        tokens.registerStatementStartPhrase(CREATE_PHRASES);
+        tokens.registerStatementStartPhrase(DROP_PHRASES);
+        tokens.registerStatementStartPhrase(SET_PHRASES);
+        tokens.registerStatementStartPhrase(MISC_PHRASES);
         super.registerWords(tokens);
     }
 
@@ -94,7 +77,7 @@
      */
     @Override
     protected Name[] getValidSchemaChildTypes() {
-        return DerbyStatementStartPhrases.VALID_SCHEMA_CHILD_STMTS;
+        return VALID_SCHEMA_CHILD_STMTS;
     }
 
     /**
@@ -111,34 +94,14 @@
 
         AstNode result = super.parseCustomStatement(tokens, parentNode);
         if (result == null) {
-            if (tokens.matches(DerbyStatementStartPhrases.STMT_LOCK_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_LOCK_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_LOCK_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_RENAME_INDEX)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_RENAME_INDEX);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_RENAME_INDEX),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
-            } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
-                markStartOfStatement(tokens);
-                tokens.consume(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE);
-                result = parseIgnorableStatement(tokens,
-                                                 getStatementTypeName(DerbyStatementStartPhrases.STMT_DECLARE_GLOBAL_TEMP_TABLE),
-                                                 parentNode);
-                markEndOfStatement(tokens, result);
+            if (tokens.matches(STMT_LOCK_TABLE)) {
+                result = parseLockTable(tokens, parentNode);
+            } else if (tokens.matches(STMT_RENAME_TABLE)) {
+                result = parseRenameTable(tokens, parentNode);
+            } else if (tokens.matches(STMT_RENAME_INDEX)) {
+                result = parseRenameIndex(tokens, parentNode);
+            } else if (tokens.matches(STMT_DECLARE_GLOBAL_TEMP_TABLE)) {
+                result = parseDeclareGlobalTempTable(tokens, parentNode);
             }
         }
         return result;
@@ -156,31 +119,22 @@
         assert tokens != null;
         assert parentNode != null;
 
-        if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_INDEX)
-            || tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_UNIQUE_INDEX)) {
+        if (tokens.matches(STMT_CREATE_INDEX)
+            || tokens.matches(STMT_CREATE_UNIQUE_INDEX)) {
             return parseCreateIndex(tokens, parentNode);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_FUNCTION)) {
+        } else if (tokens.matches(STMT_CREATE_FUNCTION)) {
+            return parseCreateFunction(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
             return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_FUNCTION,
+                                  STMT_CREATE_PROCEDURE,
                                   parentNode,
-                                  TYPE_CREATE_FUNCTION_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_PROCEDURE,
-                                  parentNode,
                                   TYPE_CREATE_PROCEDURE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_ROLE)) {
-            return parseStatement(tokens, DerbyStatementStartPhrases.STMT_CREATE_ROLE, parentNode, TYPE_CREATE_ROLE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_SYNONYM)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_SYNONYM,
-                                  parentNode,
-                                  TYPE_CREATE_SYNONYM_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_CREATE_TRIGGER)) {
-            return parseStatement(tokens,
-                                  DerbyStatementStartPhrases.STMT_CREATE_TRIGGER,
-                                  parentNode,
-                                  TYPE_CREATE_TRIGGER_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_ROLE)) {
+            return parseStatement(tokens, STMT_CREATE_ROLE, parentNode, TYPE_CREATE_ROLE_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_SYNONYM)) {
+            return parseCreateSynonym(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_TRIGGER)) {
+            return parseCreateTrigger(tokens, parentNode);
         }
 
         return super.parseCreateStatement(tokens, parentNode);
@@ -217,14 +171,190 @@
         indexNode.setProperty(UNIQUE_INDEX, isUnique);
         indexNode.setProperty(TABLE_NAME, tableName);
 
+        parseIndexTableColumns(tokens, indexNode);
+        
         parseUntilTerminator(tokens);
 
         markEndOfStatement(tokens, indexNode);
 
         return indexNode;
     }
+    
+    private void parseIndexTableColumns(DdlTokenStream tokens, AstNode indexNode) throws ParsingException {
+        assert tokens != null;
+        assert indexNode != null;
 
+        // Assume we start with open parenthesis '(', then we parse comma separated list of column names followed by optional
+        // ASC or DESC
+        
+        
+        tokens.consume(L_PAREN); // EXPECTED
+
+        while (!tokens.canConsume(R_PAREN)) {
+            String colName = parseName(tokens);
+            AstNode colRefNode = nodeFactory().node(colName, indexNode, TYPE_INDEX_COLUMN_REFERENCE);
+            if( tokens.canConsume("ASC")) {
+                colRefNode.setProperty(ORDER, "ASC");
+            } else if( tokens.canConsume("DESC")) {
+                colRefNode.setProperty(ORDER, "DESC");
+            }
+            tokens.canConsume(COMMA);
+        }
+    }
+    
     /**
+     * Parses DDL CREATE FUNCTION statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE FUNCTION statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateFunction( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //  CREATE FUNCTION function-name ( [ FunctionParameter [, FunctionParameter] ] * ) 
+        //        RETURNS ReturnDataType [ FunctionElement ] *
+        
+        //FunctionElement
+        //        {
+        //       | LANGUAGE { JAVA }
+        //       | {DETERMINISTIC | NOT DETERMINISTIC}
+        //       | EXTERNAL NAME string
+        //       | PARAMETER STYLE {JAVA | DERBY_JDBC_RESULT_SET}
+        //       | { NO SQL | CONTAINS SQL | READS SQL DATA }
+        //       | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
+        //        }
+        tokens.consume(CREATE, "FUNCTION"); // CREATE
+
+        String functionName = parseName(tokens);
+
+        AstNode functionNode = nodeFactory().node(functionName, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+
+        parseFunctionParameters(tokens, functionNode);
+        
+        tokens.consume("RETURNS");
+
+        if( tokens.canConsume("TABLE")) {
+            AstNode tableNode = nodeFactory().node("TABLE", functionNode, TYPE_CREATE_TABLE_STATEMENT);
+            parseColumnsAndConstraints(tokens, tableNode);
+            tableNode.setProperty(IS_TABLE_TYPE, true);
+        } else {
+            // Assume DataType
+            DataType datatype = getDatatypeParser().parse(tokens);
+            if( datatype != null) {
+                getDatatypeParser().setPropertiesOnNode(functionNode, datatype);
+            } else {
+                String msg = DdlSequencerI18n.missingReturnTypeForFunction.text(functionName);
+                DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
+                addProblem(problem, functionNode);
+            }
+        }
+        
+        while( !isTerminator(tokens)) {
+            if( tokens.matches("LANGUAGE")) {
+                AstNode optionNode = nodeFactory().node("language", functionNode, TYPE_STATEMENT_OPTION);
+                if( tokens.canConsume("LANGUAGE", "JAVA")) {
+                    optionNode.setProperty(VALUE, "LANGUAGE JAVA");
+                } else {
+                    tokens.consume("LANGUAGE");
+                    optionNode.setProperty(VALUE, "LANGUAGE");
+                }
+            } else if( tokens.canConsume("DETERMINISTIC")) {
+                AstNode optionNode = nodeFactory().node("deterministic", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "DETERMINISTIC");
+            } else if( tokens.canConsume("NOT", "DETERMINISTIC")) {
+                AstNode optionNode = nodeFactory().node("deterministic", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "NOT DETERMINISTIC");
+            } else if( tokens.canConsume("EXTERNAL", "NAME")) {
+                String extName = parseName(tokens);
+                AstNode optionNode = nodeFactory().node("externalName", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "EXTERNAL NAME" + SPACE + extName);
+            } else if( tokens.canConsume("PARAMETER", "STYLE")) {
+                AstNode optionNode = nodeFactory().node("parameterStyle", functionNode, TYPE_STATEMENT_OPTION);
+                if( tokens.canConsume("JAVA")) {
+                    optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE + "JAVA");
+                } else {
+                    tokens.consume("DERBY_JDBC_RESULT_SET");
+                    optionNode.setProperty(VALUE, "PARAMETER STYLE" + SPACE + "DERBY_JDBC_RESULT_SET");
+                }
+            } else if( tokens.canConsume("NO", "SQL")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "NO SQL");
+            } else if( tokens.canConsume("CONTAINS", "SQL")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "CONTAINS SQL");
+            } else if( tokens.canConsume("READS", "SQL", "DATA")) {
+                AstNode optionNode = nodeFactory().node("sqlStatus", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "READS SQL DATA");
+            } else if( tokens.canConsume("RETURNS", "NULL", "ON", "NULL", "INPUT")) {
+                AstNode optionNode = nodeFactory().node("nullInput", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "RETURNS NULL ON NULL INPUT");
+            } else if( tokens.canConsume("CALLED", "ON", "NULL", "INPUT")) {
+                AstNode optionNode = nodeFactory().node("nullInput", functionNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "CALLED ON NULL INPUT");
+            }
+        }
+
+        markEndOfStatement(tokens, functionNode);
+
+        return functionNode;
+    }
+    
+    private void parseFunctionParameters( DdlTokenStream tokens, AstNode functionNode) throws ParsingException {
+        assert tokens != null;
+        assert functionNode != null;
+
+        // Assume we start with open parenthesis '(', then we parse comma separated list of function parameters
+        // which have the form:  [ parameter-Name ] DataType
+        // So, try getting datatype, if datatype == NULL, then parseName() & parse datatype, then repeat as long as next token is ","
+        
+        tokens.consume(L_PAREN); // EXPECTED
+
+        while (!tokens.canConsume(R_PAREN)) {
+            DataType datatype = getDatatypeParser().parse(tokens);
+            if( datatype == null ) {
+                String paramName = parseName(tokens);
+                datatype = getDatatypeParser().parse(tokens);
+                AstNode paramNode = nodeFactory().node(paramName, functionNode, TYPE_FUNCTION_PARAMETER);
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            } else {
+                AstNode paramNode = nodeFactory().node("functionParameter", functionNode, TYPE_FUNCTION_PARAMETER);
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            }
+            tokens.canConsume(COMMA);
+        }
+    }
+
+    /**
+     * Parses DDL CREATE FUNCTION statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE FUNCTION statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateProcedure( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        tokens.consume(CREATE, "PROCEDURE"); // CREATE
+
+        String functionName = parseName(tokens);
+
+        AstNode functionNode = nodeFactory().node(functionName, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+
+        markEndOfStatement(tokens, functionNode);
+
+        return functionNode;
+    }
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseDropStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream,
@@ -240,53 +370,34 @@
 
         String name = null;
 
-        if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_FUNCTION)) {
+        if (tokens.matches(STMT_DROP_FUNCTION)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_FUNCTION);
+            tokens.consume(STMT_DROP_FUNCTION);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_FUNCTION_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_INDEX)) {
+        } else if (tokens.matches(STMT_DROP_INDEX)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_INDEX);
+            tokens.consume(STMT_DROP_INDEX);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_INDEX_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE)) {
+        } else if (tokens.matches(STMT_DROP_PROCEDURE)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_PROCEDURE);
+            tokens.consume(STMT_DROP_PROCEDURE);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_PROCEDURE_STATEMENT);
-
-            // CREATE PROCEDURE procedure-Name ( [ ProcedureParameter [, ProcedureParameter] ] * ) [ ProcedureElement ] *
-            // ProcedureParameter:
-            // [ { IN | OUT | INOUT } ] [ parameter-Name ] DataType
-            // ProcedureElement:
-            //
-            // {
-            // | [ DYNAMIC ] RESULT SETS INTEGER
-            // | LANGUAGE { JAVA }
-            // | DeterministicCharacteristic
-            // | EXTERNAL NAME string
-            // | PARAMETER STYLE JAVA
-            // | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA }
-            // }
-
-            // TODO: BARRY
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_ROLE)) {
+        } else if (tokens.matches(STMT_DROP_ROLE)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_ROLE);
+            tokens.consume(STMT_DROP_ROLE);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_ROLE_STATEMENT);
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_SYNONYM)) {
+        } else if (tokens.matches(STMT_DROP_SYNONYM)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_SYNONYM);
+            tokens.consume(STMT_DROP_SYNONYM);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_SYNONYM_STATEMENT);
-            // CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
-
-            // TODO: BARRY
-        } else if (tokens.matches(DerbyStatementStartPhrases.STMT_DROP_TRIGGER)) {
+        } else if (tokens.matches(STMT_DROP_TRIGGER)) {
             markStartOfStatement(tokens);
-            tokens.consume(DerbyStatementStartPhrases.STMT_DROP_TRIGGER);
+            tokens.consume(STMT_DROP_TRIGGER);
             name = parseName(tokens);
             dropNode = nodeFactory().node(name, parentNode, TYPE_DROP_TRIGGER_STATEMENT);
         }
@@ -317,73 +428,152 @@
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
+        assert tokens.matches(GRANT);
+        
+        markStartOfStatement(tokens);
 
-        return super.parseGrantStatement(tokens, parentNode);
-        // Statement stmt = null;
-        //		
-        // if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true);
-        // tokens.consume("TO");
-        // String toValue = consume(tokens, stmt, true);
+        //      Syntax for tables
         //
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "TO" + SPACE + toValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "ON")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true);
-        // tokens.consume("ON");
-        //			
-        // tokens.canConsume("TABLE");
-        //			
-        // String onValue = tokens.consume();
-        //			
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" + SPACE + onValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, "ALL", "PRIVILEGES", "ON")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        // String privilege = consume(tokens, stmt, true,"ALL", "PRIVILEGES", "ON");
-        // tokens.canConsume("TABLE");
-        //			
-        // String onValue = tokens.consume();
-        //			
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + privilege + SPACE + "ON" + SPACE + onValue);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // } else if( tokens.matches(GRANT, "SELECT") ||
-        // tokens.matches(GRANT, "UPDATE") ||
-        // tokens.matches(GRANT, "DELETE") ||
-        // tokens.matches(GRANT, "INSERT") ||
-        // tokens.matches(GRANT, "TRIGGER") ||
-        // tokens.matches(GRANT, "REFERENCES")) {
-        // stmt = new TypedStatement();
-        // consume(tokens, stmt, false, GRANT);
-        //			
-        // String nextTok = consume(tokens, stmt, true) + SPACE + consume(tokens, stmt, true) + SPACE + consume(tokens, stmt,
-        // true);
+        //          GRANT privilege-type ON [TABLE] { table-Name | view-Name } TO grantees
         //
-        // String value = parseUntilTerminator(tokens);
-        // stmt.appendSource(true, value);
-        // stmt.setType("GRANT" + SPACE + nextTok);
-        // consumeTerminator(tokens);
-        // return stmt;
-        // }
-        //		
-        //		
-        // return null;
+        //      Syntax for routines
+        //
+        //          GRANT EXECUTE ON { FUNCTION | PROCEDURE } {function-name | procedure-name} TO grantees
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        AstNode grantNode = null;
+        boolean allPrivileges = false;
+
+        List<AstNode> privileges = new ArrayList<AstNode>();
+
+        tokens.consume("GRANT");
+        if(tokens.canConsume("EXECUTE", "ON")) {
+            AstNode node = nodeFactory().node("privilege");
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            node.setProperty(TYPE, "EXECUTE");
+            privileges = new ArrayList<AstNode>();
+            privileges.add(node);
+            if( tokens.canConsume("FUNCTION") ) {
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_FUNCTION_STATEMENT);
+            } else {
+                tokens.consume("PROCEDURE");
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_PROCEDURE_STATEMENT);
+            } 
+        } else {
+
+            
+            if( tokens.canConsume("ALL", "PRIVILEGES")) {
+                allPrivileges = true;
+            } else { 
+                parseGrantPrivileges(tokens, privileges);
+                
+                if( privileges.isEmpty() ) {
+                    // ASSUME:  GRANT roleName [ {, roleName }* ] TO grantees
+                    grantNode = nodeFactory().node("grantRoles", parentNode, TYPE_GRANT_ROLES_STATEMENT);
+                    do {
+                        String roleName = parseName(tokens);
+                        nodeFactory().node(roleName, grantNode, ROLE_NAME);
+                    } while( tokens.canConsume(COMMA));
+                }
+            }
+            if( grantNode == null ) {
+                tokens.consume("ON");
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                // Attach privileges to grant node
+                for( AstNode node : privileges ) {
+                    node.setParent(grantNode);
+                }
+                if( allPrivileges ) {
+                    grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+                }
+            }
+            
+        }
+        
+        tokens.consume("TO");
+        
+        do {
+            String grantee = parseName(tokens);
+            nodeFactory().node(grantee, grantNode, GRANTEE);
+        } while( tokens.canConsume(COMMA));
+        
+        markEndOfStatement(tokens, grantNode);
+        
+        return grantNode;
     }
+    
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream, java.util.List)
+     */
+    @Override
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          DELETE |
+        //          INSERT |
+        //          REFERENCES [column list] |
+        //          SELECT [column list] |
+        //          TRIGGER |
+        //          UPDATE [column list]
+        //      column list
+        //           ( column-identifier {, column-identifier}* )
+        
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("TRIGGER")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRIGGER");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            }
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
 
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -668,7 +858,324 @@
 
         return false;
     }
+    
+    private AstNode parseDeclareGlobalTempTable( DdlTokenStream tokens,
+                                                 AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
 
+        markStartOfStatement(tokens);
+        
+        // DECLARE GLOBAL TEMPORARY TABLE table-Name
+        //     { column-definition [ , column-definition ] * }
+        //     [ ON COMMIT {DELETE | PRESERVE} ROWS ]  
+        //      NOT LOGGED [ON ROLLBACK DELETE ROWS]
+
+        tokens.consume(STMT_DECLARE_GLOBAL_TEMP_TABLE);
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT);
+        
+        parseColumnsAndConstraints(tokens, node);
+        
+        if( tokens.canConsume("ON", "COMMIT"))  {
+            AstNode optionNode = nodeFactory().node("onCommit", node, TYPE_STATEMENT_OPTION);
+            if( tokens.canConsume("DELETE", "ROWS")) {
+                optionNode.setProperty(VALUE, "ON COMMIT DELETE ROWS");
+            } else {
+                tokens.consume("PRESERVE", "ROWS");
+                optionNode.setProperty(VALUE, "ON COMMIT PRESERVE ROWS");
+            }
+        }
+        tokens.consume("NOT", "LOGGED");
+        
+        if( tokens.canConsume("ON", "ROLLBACK", "DELETE", "ROWS"))  {
+            AstNode optionNode = nodeFactory().node("onRollback", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "ON ROLLBACK DELETE ROWS");
+        }
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseLockTable( DdlTokenStream tokens,
+                                                 AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        // LOCK TABLE table-Name IN { SHARE | EXCLUSIVE } MODE;
+        
+        tokens.consume(STMT_LOCK_TABLE);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_LOCK_TABLE_STATEMENT);
+        
+        tokens.consume("IN");
+        
+        if( tokens.canConsume("SHARE")) {
+            AstNode propNode = nodeFactory().node("lockMode", node, TYPE_STATEMENT_OPTION);
+            propNode.setProperty(VALUE, "SHARE");
+        } else {
+            tokens.consume("EXCLUSIVE");
+            AstNode propNode = nodeFactory().node("lockMode", node, TYPE_STATEMENT_OPTION);
+            propNode.setProperty(VALUE, "EXCLUSIVE");
+        }
+        tokens.consume("MODE");
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseRenameTable( DdlTokenStream tokens,
+                                    AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+        
+        tokens.consume(STMT_RENAME_TABLE);
+        
+        String oldName = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_TABLE_STATEMENT);
+        
+        tokens.consume("TO");
+        
+        String newName = parseName(tokens);
+        
+        node.setProperty(NEW_NAME, newName);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseRenameIndex( DdlTokenStream tokens,
+                                      AstNode parentNode ) throws ParsingException {
+          assert tokens != null;
+          assert parentNode != null;
+
+          markStartOfStatement(tokens);
+          
+          // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+          
+          tokens.consume(STMT_RENAME_INDEX);
+          
+          String oldName = parseName(tokens);
+          
+          AstNode node = nodeFactory().node(oldName, parentNode, TYPE_RENAME_INDEX_STATEMENT);
+          
+          tokens.consume("TO");
+          
+          String newName = parseName(tokens);
+          
+          node.setProperty(NEW_NAME, newName);
+          
+          markEndOfStatement(tokens, node);
+          
+          return node;
+    }
+    
+    private AstNode parseCreateSynonym( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //CREATE SYNONYM synonym-Name FOR { view-Name | table-Name }
+        
+        tokens.consume(STMT_CREATE_SYNONYM);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_SYNONYM_STATEMENT);
+        
+        tokens.consume("FOR");
+        
+        String tableOrViewName = parseName(tokens);
+        
+        node.setProperty(TABLE_NAME, tableOrViewName);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    private AstNode parseCreateTrigger( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        //      CREATE TRIGGER TriggerName
+        //      { AFTER | NO CASCADE BEFORE } 
+        //      { INSERT | DELETE | UPDATE [ OF column-Name [, column-Name]* ] }
+        //      ON table-Name
+        //      [ ReferencingClause ]
+        //      [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] 
+        //      Triggered-SQL-statement
+        
+        //      ReferencingClause
+        //        REFERENCING
+        //        {
+        //        { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] | 
+        //        { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ]  |
+        //        { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] 
+        //        }
+        
+        
+        // EXAMPLE:
+        //        CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+        //        FOR EACH ROW MODE DB2SQL
+        //        values app.notifyEmail('Jerry', 'Table x is about to be updated'); 
+        
+        tokens.consume(STMT_CREATE_TRIGGER);
+        
+        String name = parseName(tokens);
+        
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_TRIGGER_STATEMENT);
+        
+        String type = null;
+        
+        if( tokens.canConsume("AFTER") ) {
+            AstNode optionNode = nodeFactory().node("beforeOrAfter", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "AFTER");
+        } else {
+            tokens.consume("NO", "CASCADE", "BEFORE");
+            AstNode optionNode = nodeFactory().node("beforeOrAfter", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "NO CASCADE BEFORE");
+        }
+        
+        if( tokens.canConsume(INSERT)) {
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, INSERT);
+            type = INSERT;
+        } else if( tokens.canConsume(DELETE) ) {
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, DELETE);
+            type = DELETE;
+        } else {
+            tokens.consume(UPDATE);
+            AstNode optionNode = nodeFactory().node("eventType", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, UPDATE);
+            type = UPDATE;
+        }
+        
+        if( tokens.canConsume("OF") ) {
+            // Parse comma separated column names
+            String colName = parseName(tokens);
+            nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+            
+            while( tokens.canConsume(COMMA)) {
+                colName = parseName(tokens);
+                nodeFactory().node(colName, node, TYPE_COLUMN_REFERENCE);
+            }
+        }
+        tokens.consume("ON");
+        
+        String tableName = parseName(tokens);
+        
+        node.setProperty(TABLE_NAME, tableName);
+        
+        if( tokens.canConsume("REFERENCING") ) {
+            //      ReferencingClause
+            //        REFERENCING
+            //        {
+            //        { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] | 
+            //        { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ]  |
+            //        { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] 
+            //        }
+            
+            StringBuffer sb = new StringBuffer();
+            if( tokens.matchesAnyOf("OLD", "NEW") ) {
+                if( tokens.canConsume("OLD")) {
+                    sb.append("OLD");
+                } else {
+                    tokens.consume("NEW");
+                    sb.append("NEW");
+                }
+                if( tokens.canConsume("ROW") ) {
+                    sb.append(SPACE).append("ROW");
+                }
+                if( tokens.canConsume("AS") ) {
+                    sb.append(SPACE).append("AS");
+                }
+                if( tokens.matchesAnyOf("OLD", "NEW")) {
+                    if( tokens.canConsume("OLD")) {
+                        sb.append(SPACE).append("OLD");
+                    } else {
+                        tokens.consume("NEW");
+                        sb.append(SPACE).append("NEW");
+                    }
+                    
+                    if( tokens.canConsume("ROW") ) {
+                        sb.append(SPACE).append("ROW");
+                    }
+                    if( tokens.canConsume("AS") ) {
+                        sb.append(SPACE).append("AS");
+                    }
+                    if( ! tokens.matchesAnyOf("FOR", "MODE", type)) {
+                        String corrName = parseName(tokens);
+                        sb.append(SPACE).append(corrName);
+                    }
+                } else {
+                    String corrName = parseName(tokens);
+                    sb.append(SPACE).append(corrName);
+                    
+                    if( tokens.matchesAnyOf("OLD", "NEW") ) {
+                        if( tokens.canConsume("OLD")) {
+                            sb.append(SPACE).append("OLD");
+                        } else {
+                            tokens.consume("NEW");
+                            sb.append(SPACE).append("NEW");
+                        }
+                        
+                        if( tokens.canConsume("ROW") ) {
+                            sb.append(SPACE).append("ROW");
+                        }
+                        if( tokens.canConsume("AS") ) {
+                            sb.append(SPACE).append("AS");
+                        }
+                        if( ! tokens.matchesAnyOf("FOR", "MODE", type)) {
+                            corrName = parseName(tokens);
+                            sb.append(SPACE).append(corrName);
+                        }
+                    }
+                }
+            }
+        }            
+        //[ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ]
+        if( tokens.canConsume("FOR", "EACH")) {
+            if( tokens.canConsume("ROW")) {
+                AstNode optionNode = nodeFactory().node("forEach", node, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "FOR EACH ROW");
+            } else {
+                tokens.consume("STATEMENT");
+                AstNode optionNode = nodeFactory().node("forEach", node, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "FOR EACH STATEMENT");
+            }
+        }
+        if( tokens.canConsume("MODE")) {
+            tokens.consume("DB2SQL");
+            AstNode optionNode = nodeFactory().node("mode", node, TYPE_STATEMENT_OPTION);
+            optionNode.setProperty(VALUE, "MODE DB2SQL");
+        }
+                                                        
+        String sql = parseUntilTerminatorIgnoreEmbeddedStatements(tokens);
+        node.setProperty(SQL, sql);
+        
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
     /**
      * {@inheritDoc}
      * 
@@ -796,23 +1303,28 @@
                 dataType.setKMGLength(isKMGLength);
                 dataType.setKMGValue(kmgValue);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_BIGINT)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR_FBD)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true) + SPACE
                            + consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true) + SPACE
                            + consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_LONG_VARCHAR)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true) + SPACE + consume(tokens, dataType, true);
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_DOUBLE)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             } else if (tokens.matches(DerbyDataTypes.DTYPE_XML)) {
+                dataType = new DataType();
                 typeName = consume(tokens, dataType, true);
-                dataType = new DataType(typeName);
+                dataType.setName(typeName);
             }
 
             if (dataType == null) {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -422,7 +422,27 @@
         CheckArg.isNotNull(tokens, "tokens");
         CheckArg.isNotNull(parentNode, "parentNode");
 
-        // return super.parseGrantStatement(tokens, parentNode);
+        //        GRANT { grant_system_privileges | grant_object_privileges } ;
+        //
+        //            ** grant_system_privileges **
+        //        
+        //            { system_privilege | role | ALL PRIVILEGES } [, { system_privilege | role | ALL PRIVILEGES } ]...
+        //             TO grantee_clause [ WITH ADMIN OPTION ]
+        //
+        //            ** grant_object_privileges **
+        //
+        //            { object_privilege | ALL [ PRIVILEGES ] } [ (column [, column ]...) ] [, { object_privilege | ALL [ PRIVILEGES ] }  [ (column [, column ]...) ] ]...
+        //                 on_object_clause
+        //              TO grantee_clause [ WITH HIERARCHY OPTION ] [ WITH GRANT OPTION ]
+
+        //            ** on_object_clause **
+        //
+        //            { [ schema. ] object | { DIRECTORY directory_name | JAVA { SOURCE | RESOURCE } [ schema. ] object } }
+        //
+        //            ** grantee_clause **
+        //
+        //            { user [ IDENTIFIED BY password ] | role | PUBLIC } [, { user [ IDENTIFIED BY password ] | role | PUBLIC  } ]...
+
         AstNode node = null;
 
         // Original implementation does NOT parse Insert statement, but just returns a generic TypedStatement
@@ -444,8 +464,8 @@
 
         markEndOfStatement(tokens, node);
 
-        return node;
-
+        return node; 
+        
         // if( tokens.matches(GRANT, DdlTokenStream.ANY_VALUE, "TO")) {
         // markStartOfStatement(tokens);
         // tokens.consume(GRANT);

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -243,10 +243,12 @@
 	    public final static Name[] VALID_SCHEMA_CHILD_STMTS = {
 	    	StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT, 
 	    	StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT,
-	    	StandardDdlLexicon.TYPE_GRANT_STATEMENT,
+	    	StandardDdlLexicon.TYPE_GRANT_ON_TABLE_STATEMENT,
 	    	PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT,
 	    	PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT,
-	    	PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT
+	    	PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT,
+	    	PostgresDdlLexicon.TYPE_GRANT_ON_SEQUENCE_STATEMENT,
+	    	PostgresDdlLexicon.TYPE_GRANT_ON_SCHEMA_STATEMENT
 	  	};
 	    
 	    public final static Name[] COMPLEX_STMT_TYPES = {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlLexicon.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -133,9 +133,23 @@
     public static final Name TYPE_UNLISTEN_STATEMENT 				= new BasicName(Namespace.URI, "unlistenStatement");
     public static final Name TYPE_VACUUM_STATEMENT 					= new BasicName(Namespace.URI, "vacuumStatement");
     
-    public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renameColumn");
+    public static final Name TYPE_GRANT_ON_SEQUENCE_STATEMENT       = new BasicName(Namespace.URI, "grantOnSequenceStatement");
+    public static final Name TYPE_GRANT_ON_DATABASE_STATEMENT       = new BasicName(Namespace.URI, "grantOnDatabaseStatement");
+    public static final Name TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT  = new BasicName(Namespace.URI, "grantOnForeignDataWrapperStatement");
+    public static final Name TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT = new BasicName(Namespace.URI, "grantOnForeignServerStatement");
+    public static final Name TYPE_GRANT_ON_FUNCTION_STATEMENT       = new BasicName(Namespace.URI, "grantOnFunctionStatement");
+    public static final Name TYPE_GRANT_ON_LANGUAGE_STATEMENT       = new BasicName(Namespace.URI, "grantOnLanguageStatement");
+    public static final Name TYPE_GRANT_ON_SCHEMA_STATEMENT         = new BasicName(Namespace.URI, "grantOnSchemaStatement");
+    public static final Name TYPE_GRANT_ON_TABLESPACE_STATEMENT     = new BasicName(Namespace.URI, "grantOnTablespaceStatement");
+    public static final Name TYPE_GRANT_ON_PROCEDURE_STATEMENT      = new BasicName(Namespace.URI, "grantOnProcedureStatement");
+    public static final Name TYPE_GRANT_ROLES_STATEMENT             = new BasicName(Namespace.URI, "grantRolesStatement");
     
+    public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renamedColumn");
+    
     public static final Name SCHEMA_NAME 							= new BasicName(Namespace.URI, "schemaName");
+    public static final Name FUNCTION_PARAMETER                     = new BasicName(Namespace.URI, "functionParameter");
+    public static final Name FUNCTION_PARAMETER_MODE                = new BasicName(Namespace.URI, "mode");
+    public static final Name ROLE                                   = new BasicName(Namespace.URI, "role");
     
     // PROPERTY NAMES
     public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,118 +1,11 @@
 package org.jboss.dna.sequencer.ddl.dialect.postgres;
 
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_ORIGINAL_EXPRESSION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_CHAR_INDEX;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_COLUMN_NUMBER;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DDL_START_LINE_NUMBER;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_PRECISION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DEFAULT_VALUE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_DOMAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_STATEMENT_OPTION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.VALUE;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.SCHEMA_NAME;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ABORT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_VIEW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ANALYZE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CLUSTER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COPY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CAST_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONSTRAINT_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DEALLOCATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DECLARE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_AGGREGATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CAST_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONSTRAINT_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_CONVERSION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_DATABASE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_FUNCTION_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_GROUP_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_INDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_LANGUAGE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OPERATOR_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_OWNED_BY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_ROLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_SERVER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TABLESPACE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TEXT_SEARCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TRIGGER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_TYPE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_MAPPING_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_DROP_USER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_EXPLAIN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_FETCH_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOAD_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LOCK_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_MOVE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_NOTIFY_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REASSIGN_OWNED_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_REINDEX_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RELEASE_SAVEPOINT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ROLLBACK_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SELECT_INTO_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_SHOW_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_TRUNCATE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_UNLISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_VACUUM_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -1138,17 +1031,360 @@
 
         return newNode;
     }
-
+    
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream, org.jboss.dna.sequencer.ddl.node.AstNode)
+     */
     @Override
     protected AstNode parseGrantStatement( DdlTokenStream tokens,
                                            AstNode parentNode ) throws ParsingException {
         assert tokens != null;
         assert parentNode != null;
+        assert tokens.matches(GRANT);
+        
+        markStartOfStatement(tokens);
 
-        return super.parseGrantStatement(tokens, parentNode);
+        // NOTE: The first wack at this does not take into account the apparent potential repeating name elements after each type
+        // declaration. Example:
+        //          GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
+        //             [,...] | ALL [ PRIVILEGES ] }
+        //             ON [ TABLE ] tablename [, ...]
+        //             TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+        //
+        // the "ON [ TABLE ] tablename [, ...]" seems to indicate that you can grant privileges on multiple tables at once, which is
+        // different thatn the SQL 92 standard. So this pass ONLY allows one and an parsing error will probably occur if multiple.
+        //
+        //      Syntax for tables
+        //
+        //             GRANT <privileges> ON <object name>
+        //                      TO <grantee> [ { <comma> <grantee> }... ]
+        //                      [ WITH GRANT OPTION ]
+        //
+        //        <object name> ::=
+        //            [ TABLE ] <table name>
+        //          | SEQUENCE <sequence name>
+        //          | DATABASE <db name>
+        //          | FOREIGN DATA WRAPPER <fdw name>
+        //          | FOREIGN SERVER <server name>
+        //          | FUNCTION <function name>
+        //          | LANGUAGE <language name>
+        //          | SCHEMA <schema name>
+        //          | TABLESPACE <tablespace name>
+
+        //
+        //      Syntax for roles
+        //
+        //          GRANT roleName [ {, roleName }* ] TO grantees
+        
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        boolean allPrivileges = false;
+
+        List<AstNode> privileges = new ArrayList<AstNode>();
+
+        tokens.consume("GRANT");
+
+        if( tokens.canConsume("ALL", "PRIVILEGES")) {
+            allPrivileges = true;
+        } else { 
+            parseGrantPrivileges(tokens, privileges);
+        }
+        
+        if( allPrivileges || !privileges.isEmpty() ) {
+            
+            tokens.consume("ON");
+            
+            if( tokens.canConsume("SCHEMA")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_SCHEMA_STATEMENT);
+            } else if( tokens.canConsume("SEQUENCE") ) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_SEQUENCE_STATEMENT);
+            } else if( tokens.canConsume("TABLESPACE") ) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_TABLESPACE_STATEMENT);
+            } else if( tokens.canConsume("DATABASE")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_DATABASE_STATEMENT);
+            } else if( tokens.canConsume("FUNCTION")) {
+                grantNodes = parseFunctionAndParameters(tokens, parentNode);
+            } else if( tokens.canConsume("LANGUAGE")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_LANGUAGE_STATEMENT);
+            } else if( tokens.canConsume("FOREIGN", "DATA", "WRAPPER")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_FOREIGN_DATA_WRAPPER_STATEMENT);
+            } else if( tokens.canConsume("FOREIGN", "SERVER")) {
+                grantNodes = parseMultipleGrantTargets(tokens, parentNode, TYPE_GRANT_ON_FOREIGN_SERVER_STATEMENT);
+            } else {
+                tokens.canConsume(TABLE); // OPTIONAL
+                String name = parseName(tokens);
+                AstNode grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                grantNodes.add(grantNode);
+                while( tokens.canConsume(COMMA) ) {
+                    // Assume more names here
+                    name = parseName(tokens);
+                    grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+                    grantNodes.add(grantNode);
+                }
+            }
+        } else {
+            // Assume ROLES here
+            // role [, ...]
+            AstNode grantNode = nodeFactory().node("roles", parentNode, TYPE_GRANT_ROLES_STATEMENT);
+            grantNodes.add(grantNode);
+            do {
+                String role = parseName(tokens);
+                nodeFactory().node(role, grantNode, ROLE);
+            } while( tokens.canConsume(COMMA));
+        }
+        
+        tokens.consume("TO");
+        List<String> grantees = new ArrayList<String>();
+        
+        do {
+            String grantee = parseName(tokens);
+            grantees.add(grantee);
+        } while( tokens.canConsume(COMMA));
+        
+        boolean withGrantOption = false;
+        if( tokens.canConsume("WITH", "GRANT", "OPTION")) {
+            withGrantOption = true;
+        }
+        
+        // Set all properties and children on Grant Nodes
+        for( AstNode grantNode : grantNodes) {
+            List<AstNode> copyOfPrivileges = copyOfPrivileges(privileges);
+            // Attach privileges to grant node
+            for( AstNode node : copyOfPrivileges ) {
+                node.setParent(grantNode);
+            }
+            if( allPrivileges ) {
+                grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+            }
+            for( String grantee : grantees) {
+                nodeFactory().node(grantee, grantNode, GRANTEE);
+            }
+            
+            if( withGrantOption ) {
+                AstNode optionNode = nodeFactory().node("withGrant", grantNode, TYPE_STATEMENT_OPTION);
+                optionNode.setProperty(VALUE, "WITH GRANT OPTION");
+            }
+        }
+        AstNode firstGrantNode = grantNodes.get(0);
+        
+        markEndOfStatement(tokens, firstGrantNode);
+
+        // Update additional grant nodes with statement info
+        
+        for( int i=1; i<grantNodes.size(); i++) {
+            AstNode grantNode = grantNodes.get(i);
+            grantNode.setProperty(DDL_EXPRESSION, firstGrantNode.getProperty(DDL_EXPRESSION));
+            grantNode.setProperty(DDL_START_LINE_NUMBER, firstGrantNode.getProperty(DDL_START_LINE_NUMBER));
+            grantNode.setProperty(DDL_START_CHAR_INDEX, firstGrantNode.getProperty(DDL_START_CHAR_INDEX));
+            grantNode.setProperty(DDL_START_COLUMN_NUMBER, firstGrantNode.getProperty(DDL_START_COLUMN_NUMBER));
+        }
+        
+        
+        return grantNodes.get(0);
     }
 
+
+    /**
+     * 
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseGrantPrivileges(org.jboss.dna.sequencer.ddl.DdlTokenStream, java.util.List)
+     */
     @Override
+    protected void parseGrantPrivileges( DdlTokenStream tokens, List<AstNode> privileges) throws ParsingException {
+        //      privilege-types
+        //
+        //          ALL PRIVILEGES | privilege-list
+        //
+        //      privilege-list
+        //
+        //          table-privilege {, table-privilege }*
+        //
+        //      table-privilege
+        //          SELECT [ <left paren> <privilege column list> <right paren> ]
+        //        | DELETE
+        //        | INSERT [ <left paren> <privilege column list> <right paren> ]
+        //        | UPDATE [ <left paren> <privilege column list> <right paren> ]
+        //        | REFERENCES [ <left paren> <privilege column list> <right paren> ]
+        //        | USAGE
+        //        | TRIGGER
+        //        | TRUNCATE
+        //        | CREATE
+        //        | CONNECT
+        //        | TEMPORARY
+        //        | TEMP
+        //        | EXECUTE
+        
+        //  POSTGRES has the following Privileges:
+        //          GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
+        
+        do {
+            AstNode node = null;
+            
+            if( tokens.canConsume(DELETE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, DELETE);
+            } else if( tokens.canConsume(INSERT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, INSERT);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("REFERENCES")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "REFERENCES");
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume(SELECT)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, SELECT);
+                // Could have columns here
+                // GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
+
+                // Let's just swallow the column data.
+                
+                consumeParenBoundedTokens(tokens, true);
+            } else if( tokens.canConsume("USAGE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "USAGE");
+            } else if( tokens.canConsume(UPDATE)) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, UPDATE);
+                parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
+            } else if( tokens.canConsume("TRIGGER")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRIGGER");
+            } else if( tokens.canConsume("TRUNCATE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TRUNCATE");
+            } else if( tokens.canConsume("CREATE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "CREATE");
+            } else if( tokens.canConsume("CONNECT")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "CONNECT");
+            } else if( tokens.canConsume("TEMPORARY")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TEMPORARY");
+            } else if( tokens.canConsume("TEMP")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "TEMP");
+            } else if( tokens.canConsume("EXECUTE")) {
+                node = nodeFactory().node("privilege");
+                node.setProperty(TYPE, "EXECUTE");
+            }
+            
+            if( node == null) {
+                break;
+            }
+            nodeFactory().setType(node, GRANT_PRIVILEGE);
+            privileges.add(node);
+            
+        } while( tokens.canConsume(COMMA));
+
+    }
+    
+    private List<AstNode> parseMultipleGrantTargets(DdlTokenStream tokens,
+                                                    AstNode parentNode,
+                                                    Name nodeType) throws ParsingException {
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        String name = parseName(tokens);
+        AstNode grantNode = nodeFactory().node(name, parentNode, nodeType);
+        grantNodes.add(grantNode);
+        while( tokens.canConsume(COMMA) ) {
+            // Assume more names here
+            name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, nodeType);
+            grantNodes.add(grantNode);
+        }
+        
+        return grantNodes;
+    }
+    
+    private List<AstNode> copyOfPrivileges(List<AstNode> privileges) {
+        List<AstNode> copyOfPrivileges = new ArrayList<AstNode>();
+        for( AstNode node : privileges) {
+            copyOfPrivileges.add(node.clone());
+        }
+        
+        return copyOfPrivileges;
+    }
+    
+    private List<AstNode> parseFunctionAndParameters( DdlTokenStream tokens,
+                                                AstNode parentNode ) throws ParsingException {
+        boolean isFirstFunction = true;
+        List<AstNode> grantNodes = new ArrayList<AstNode>();
+        
+        // FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
+
+        // argmode = [ IN, OUT, INOUT, or VARIADIC ]
+        
+        // p(a int, b TEXT), q(integer, double)
+        
+        //        [postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+        //        + * (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+        
+        do {
+            String name = parseName(tokens);
+            AstNode grantFunctionNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_FUNCTION_STATEMENT);
+            
+            grantNodes.add(grantFunctionNode);
+
+            // Parse Parameter Data
+            if( tokens.matches(L_PAREN)) {
+                tokens.consume(L_PAREN);
+                
+                if( !tokens.canConsume(R_PAREN)) {
+                    // check for datatype
+                    do{
+                        String mode = null;
+                        
+                        if( tokens.matchesAnyOf("IN", "OUT", "INOUT", "VARIADIC")) {
+                            mode = tokens.consume();
+                        }
+                        AstNode paramNode = null;
+                        
+                        DataType dType = getDatatypeParser().parse(tokens);
+                        if( dType != null ) {
+                            // NO Parameter Name, only DataType
+                            paramNode = nodeFactory().node("parameter", grantFunctionNode, FUNCTION_PARAMETER);
+                            if( mode != null ) {
+                                paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+                            }
+                            getDatatypeParser().setPropertiesOnNode(paramNode, dType);
+                        } else {
+                            String paramName = parseName(tokens);
+                            dType = getDatatypeParser().parse(tokens);
+                            assert paramName != null;
+
+                            paramNode = nodeFactory().node(paramName, grantFunctionNode, FUNCTION_PARAMETER);
+                            if( mode != null ) {
+                                paramNode.setProperty(FUNCTION_PARAMETER_MODE, mode);
+                            }
+                            if( dType != null ) {
+                                getDatatypeParser().setPropertiesOnNode(paramNode, dType);
+                            }
+                        }
+                    } while( tokens.canConsume(COMMA));
+                    
+                    tokens.consume(R_PAREN);
+                }
+            }
+            
+            // RESET first parameter flag
+            if( isFirstFunction ) {
+                isFirstFunction = false;
+            }
+        } while( tokens.canConsume(COMMA) );
+        
+        
+        return grantNodes;
+    }
+
+    @Override
     protected AstNode parseSetStatement( DdlTokenStream tokens,
                                          AstNode parentNode ) throws ParsingException {
         assert tokens != null;

Modified: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-05 13:31:47 UTC (rev 1527)
@@ -29,4 +29,5 @@
 unusedTokensParsingColumnsAndConstraints = The following unused tokens were found parsing columns and constraints for table: {0}. 
 unusedTokensParsingColumnDefinition = The following unused tokens were found parsing a column definition for table: {0}.
 alterTableOptionNotFound = ALTER TABLE Option not found. Check your DDL for incomplete statement near line {0}, column {1} 
-unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create index statement: {0}.
\ No newline at end of file
+unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create index statement: {0}.
+missingReturnTypeForFunction = The function {0} is missing a return data type.
\ No newline at end of file

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,266 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-
-[ddl:operation] mixin abstract
-[ddl:operand] mixin abstract
-  - ddl:name (STRING) mandatory
-
-// =============================================================================
-// STATEMENT
-// =============================================================================
-[ddl:statement] mixin abstract
-  - ddl:expression (string) mandatory                       // The string fragment encompassing the statement expression.
-  - ddl:originalExpression (string) mandatory               // The string fragment encompassing the original statement expression.
-  - ddl:startLineNumber (long) mandatory                    // The starting line number for the statement
-  - ddl:startColumnNumber (long) mandatory                  // The starting column number for the statement
-  - ddl:startCharIndex (long) mandatory                     // The starting content character index for the statement
-  - ddl:length (long) mandatory                             // The string length
-  + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple  // Problems encountered during parsing.
-
-// =============================================================================
-// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
-// =============================================================================
-[ddl:creatable] > ddl:operation abstract
-[ddl:alterable] > ddl:operation abstract
-[ddl:droppable] > ddl:operation abstract
-  - ddl:dropBehavior (STRING)
-  + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
-[ddl:insertable] > ddl:operation abstract
-[ddl:settable]  > ddl:operation abstract
-[ddl:grantable] > ddl:operation abstract
-[ddl:revokable] > ddl:operation abstract
-[ddl:renamable] > ddl:operation, ddl:operand abstract
-  - ddl:newName (STRING)
-
-// =============================================================================
-// OPERANDS:  SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION, TRANSLATION
-// =============================================================================
-[ddl:schemaOperand]             > ddl:operand abstract
-[ddl:tableOperand]              > ddl:operand abstract
-[ddl:domainOperand]             > ddl:operand abstract
-[ddl:viewOperand]               > ddl:operand abstract
-[ddl:assertionOperand]          > ddl:operand abstract
-[ddl:characterSetOperand]       > ddl:operand abstract
-[ddl:collationOperand]          > ddl:operand abstract
-[ddl:translationOperand]        > ddl:operand abstract
-[ddl:columnOperand]             > ddl:operand abstract
-[ddl:tableConstraintOperand]    > ddl:operand abstract
-[ddl:referenceOperand]          > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:nullable (STRING)
-  - ddl:defaultOption (STRING) 
-      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
-  - ddl:defaultValue (STRING)
-  - ddl:defaultPrecision (LONG)
-  - ddl:collationName (STRING)
-  + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
-  + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// TABLE CONSTRAINT
-// =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
-  - ddl:constraintType (STRING) mandatory
-      < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
-  - ddl:deferrable (STRING)
-      < 'DEFERRABLE', 'NOT DEFERRABLE'
-  - ddl:checkSearchCondition (STRING)
-      < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
-  + * (ddl:columnReference) = ddl:columnReference multiple
-  + * (ddl:tableReference) = ddl:tableReference
-  + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-  
-// =============================================================================
-// REFERENCE
-// =============================================================================
-[ddl:columnReference]       > ddl:referenceOperand mixin
-[ddl:tableReference]        > ddl:referenceOperand mixin
-[ddl:fkColumnReference]     > ddl:referenceOperand mixin
-
-// =============================================================================
-// SIMPLE STRING PROPERTY
-// =============================================================================
-[ddl:simpleProperty] mixin
-  - ddl:propValue (STRING) mandatory
-
-// =============================================================================
-// STATEMENT OPTION
-// =============================================================================
-[ddl:statementOption] mixin
-  - ddl:value (STRING) mandatory
-  
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
-  - ddl:problemLevel (LONG) mandatory
-  - ddl:message (STRING) mandatory
-
-// =============================================================================
-// CREATE SCHEMA
-// =============================================================================
-[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand  mixin
-  - ddl:defaultCharacterSetName (STRING)
-  + * (ddl:statement) = ddl:statement multiple
-
-// =============================================================================
-// CREATE TABLE
-// =============================================================================
-[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
-  - ddl:temporary (STRING)
-    < 'GLOBAL', 'LOCAL'
-  - ddl:onCommitValue (STRING)
-    < 'DELETE ROWS', 'PRESERVE ROWS'
-  + * (ddl:columnDefinition) = ddl:columnDefinition multiple
-  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
-  + * (ddl:statementOption) = ddl:statementOption multiple 
-
-// =============================================================================
-// CREATE VIEW
-// =============================================================================
-[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin 
-  - ddl:sqlExpression (STRING) mandatory
-  - ddl:checkOption (STRING)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-  
-// =============================================================================
-// CREATE DOMAIN
-// =============================================================================
-[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin 
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:nullable (STRING)
-  - ddl:defaultOption (STRING) 
-      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
-  - ddl:defaultValue (STRING)
-  - ddl:defaultPrecision (LONG)
-  - ddl:collationName (STRING)
-  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
-
-// =============================================================================
-// CREATE ASSERTION
-// =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
-  - ddl:constraintName (STRING) mandatory
-  - ddl:searchCondition (STRING) mandatory
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
-
-// =============================================================================
-// CREATE CHARACTER SET
-// =============================================================================
-[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable, ddl:characterSetOperand mixin
-  - ddl:existingName (STRING) mandatory
-  - ddl:collateClause (STRING)                      // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  - ddl:limitedCollationDefinition (STRING)         // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  
-// =============================================================================
-// CREATE COLLATION
-// =============================================================================
-[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand mixin
-  - ddl:characterSetName (STRING) mandatory
-  - ddl:collationSource (STRING)                    // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  - ddl:padAttribute (STRING)
-    < 'NO PAD', 'PAD SPACE'
-    
-// =============================================================================
-// CREATE TRANSLATION
-// =============================================================================
-[ddl:createTranslationStatement] > ddl:statement, ddl:creatable, ddl:translationOperand mixin
-  - ddl:sourceCharacterSetName (STRING) mandatory
-  - ddl:targetCharacterSetName (STRING) mandatory
-  - ddl:translationSource (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-  
-// =============================================================================
-// ALTER TABLE
-// =============================================================================
-[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
-  + * (ddl:addColumnDefinition)             = ddl:addColumnDefinition multiple
-  + * (ddl:dropColumnDefinition)            = ddl:dropColumnDefinition multiple
-  + * (ddl:alterColumnDefinition)           = ddl:alterColumnDefinition multiple
-  + * (ddl:addTableConstraintDefinition)    = ddl:addTableConstraintDefinition multiple
-  + * (ddl:dropTableConstraintDefinition)   = ddl:dropTableConstraintDefinition multiple
-  + * (ddl:statementOption) = ddl:statementOption multiple
-
-// =============================================================================
-// ALTER DOMAIN
-// =============================================================================
-[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
-  - ddl:alterDomainAction (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[ddl:dropSchemaStatement]           > ddl:statement, ddl:droppable, ddl:schemaOperand mixin
-[ddl:dropTableStatement]            > ddl:statement, ddl:droppable, ddl:tableOperand mixin
-[ddl:dropViewStatement]             > ddl:statement, ddl:droppable, ddl:viewOperand mixin
-[ddl:dropDomainStatement]           > ddl:statement, ddl:droppable, ddl:domainOperand mixin
-[ddl:dropCharacterSetStatement]     > ddl:statement, ddl:droppable, ddl:characterSetOperand mixin
-[ddl:dropCollationStatement]        > ddl:statement, ddl:droppable, ddl:collationOperand mixin
-[ddl:dropTranslationStatement]      > ddl:statement, ddl:droppable, ddl:translationOperand mixin
-[ddl:dropAssertionStatement]        > ddl:statement, ddl:droppable, ddl:assertionOperand mixin
-
-[ddl:alterColumnDefinition]         > ddl:columnDefinition, ddl:alterable mixin
-[ddl:addColumnDefinition]           > ddl:columnDefinition, ddl:creatable mixin
-[ddl:dropColumnDefinition]          > ddl:columnDefinition, ddl:droppable mixin
-[ddl:addTableConstraintDefinition]  > ddl:tableConstraintDefinition, ddl:creatable mixin
-[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-[ddl:setStatement] > ddl:statement, ddl:settable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-   
-[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-   
-[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-
-
-

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,280 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[ddl:operation] mixin abstract
+[ddl:operand] mixin abstract
+  - ddl:name (STRING) mandatory
+
+// =============================================================================
+// STATEMENT
+// =============================================================================
+[ddl:statement] mixin abstract
+  - ddl:expression (string) mandatory                       // The string fragment encompassing the statement expression.
+  - ddl:originalExpression (string) mandatory               // The string fragment encompassing the original statement expression.
+  - ddl:startLineNumber (long) mandatory                    // The starting line number for the statement
+  - ddl:startColumnNumber (long) mandatory                  // The starting column number for the statement
+  - ddl:startCharIndex (long) mandatory                     // The starting content character index for the statement
+  - ddl:length (long) mandatory                             // The string length
+  + ddl:problem (ddl:ddlProblem) = ddl:ddlProblem multiple  // Problems encountered during parsing.
+
+// =============================================================================
+// CREATE, ALTER, DROP, INSERT, SET, GRANT, REVOKE
+// =============================================================================
+[ddl:creatable] > ddl:operation abstract
+[ddl:alterable] > ddl:operation abstract
+[ddl:droppable] > ddl:operation abstract
+  - ddl:dropBehavior (STRING)
+  + ddl:dropOption (ddl:statementOption) = ddl:statementOption multiple
+[ddl:insertable] > ddl:operation abstract
+[ddl:settable]  > ddl:operation abstract
+[ddl:grantable] > ddl:operation abstract
+[ddl:revokable] > ddl:operation abstract
+[ddl:renamable] > ddl:operation abstract
+  - ddl:newName (STRING)
+
+// =============================================================================
+// OPERANDS:  SCHEMA, TABLE, DOMAIN, VIEW, ASSERTION, CHARACTER SET, COLLATION, TRANSLATION
+// =============================================================================
+[ddl:schemaOperand]             > ddl:operand abstract
+[ddl:tableOperand]              > ddl:operand abstract
+[ddl:domainOperand]             > ddl:operand abstract
+[ddl:viewOperand]               > ddl:operand abstract
+[ddl:assertionOperand]          > ddl:operand abstract
+[ddl:characterSetOperand]       > ddl:operand abstract
+[ddl:collationOperand]          > ddl:operand abstract
+[ddl:translationOperand]        > ddl:operand abstract
+[ddl:columnOperand]             > ddl:operand abstract
+[ddl:tableConstraintOperand]    > ddl:operand abstract
+[ddl:referenceOperand]          > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING) 
+      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
+  - ddl:defaultValue (STRING)
+  - ddl:defaultPrecision (LONG)
+  - ddl:collationName (STRING)
+  + ddl:dropBehavior (ddl:simpleProperty) = ddl:simpleProperty
+  + ddl:columnAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// TABLE CONSTRAINT
+// =============================================================================
+[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+  - ddl:constraintType (STRING) mandatory
+      < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
+  - ddl:deferrable (STRING)
+      < 'DEFERRABLE', 'NOT DEFERRABLE'
+  - ddl:checkSearchCondition (STRING)
+      < 'INITIALLY DEFERRED', 'INITIALLY IMMEDIATE'
+  + * (ddl:columnReference) = ddl:columnReference multiple
+  + * (ddl:tableReference) = ddl:tableReference
+  + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
+  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  
+// =============================================================================
+// REFERENCE
+// =============================================================================
+[ddl:columnReference]       > ddl:referenceOperand mixin
+[ddl:tableReference]        > ddl:referenceOperand mixin
+[ddl:fkColumnReference]     > ddl:referenceOperand mixin
+[ddl:grantee]               > ddl:referenceOperand mixin
+
+// =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+  - ddl:propValue (STRING) mandatory
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+  - ddl:value (STRING) mandatory
+  
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+  - ddl:problemLevel (LONG) mandatory
+  - ddl:message (STRING) mandatory
+
+// =============================================================================
+// CREATE SCHEMA
+// =============================================================================
+[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand  mixin
+  - ddl:defaultCharacterSetName (STRING)
+  + * (ddl:statement) = ddl:statement multiple
+
+// =============================================================================
+// CREATE TABLE
+// =============================================================================
+[ddl:createTableStatement] > ddl:statement, ddl:creatable, ddl:tableOperand mixin
+  - ddl:temporary (STRING)
+    < 'GLOBAL', 'LOCAL'
+  - ddl:onCommitValue (STRING)
+    < 'DELETE ROWS', 'PRESERVE ROWS'
+  + * (ddl:columnDefinition) = ddl:columnDefinition multiple
+  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple 
+
+// =============================================================================
+// CREATE VIEW
+// =============================================================================
+[ddl:createViewStatement] > ddl:statement, ddl:creatable, ddl:viewOperand mixin 
+  - ddl:sqlExpression (STRING) mandatory
+  - ddl:checkOption (STRING)
+  + * (ddl:columnReference) = ddl:columnReference multiple
+  
+// =============================================================================
+// CREATE DOMAIN
+// =============================================================================
+[ddl:createDomainStatement] > ddl:statement, ddl:creatable, ddl:domainOperand mixin 
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING) 
+      < 'LITERAL', 'DATETIME', 'USER', 'CURRENT_USER', 'SESSION_USER', 'SYSTEM_USER', 'NULL'
+  - ddl:defaultValue (STRING)
+  - ddl:defaultPrecision (LONG)
+  - ddl:collationName (STRING)
+  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+
+// =============================================================================
+// CREATE ASSERTION
+// =============================================================================
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
+  - ddl:constraintName (STRING) mandatory
+  - ddl:searchCondition (STRING) mandatory
+  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+
+// =============================================================================
+// CREATE CHARACTER SET
+// =============================================================================
+[ddl:createCharacterSetStatement] > ddl:statement, ddl:creatable, ddl:characterSetOperand mixin
+  - ddl:existingName (STRING) mandatory
+  - ddl:collateClause (STRING)                      // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  - ddl:limitedCollationDefinition (STRING)         // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  
+// =============================================================================
+// CREATE COLLATION
+// =============================================================================
+[ddl:createCollationStatement] > ddl:statement, ddl:creatable, ddl:collationOperand mixin
+  - ddl:characterSetName (STRING) mandatory
+  - ddl:collationSource (STRING)                    // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  - ddl:padAttribute (STRING)
+    < 'NO PAD', 'PAD SPACE'
+    
+// =============================================================================
+// CREATE TRANSLATION
+// =============================================================================
+[ddl:createTranslationStatement] > ddl:statement, ddl:creatable, ddl:translationOperand mixin
+  - ddl:sourceCharacterSetName (STRING) mandatory
+  - ddl:targetCharacterSetName (STRING) mandatory
+  - ddl:translationSource (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+  
+// =============================================================================
+// ALTER TABLE
+// =============================================================================
+[ddl:alterTableStatement] > ddl:statement, ddl:alterable, ddl:tableOperand mixin
+  + * (ddl:addColumnDefinition)             = ddl:addColumnDefinition multiple
+  + * (ddl:dropColumnDefinition)            = ddl:dropColumnDefinition multiple
+  + * (ddl:alterColumnDefinition)           = ddl:alterColumnDefinition multiple
+  + * (ddl:addTableConstraintDefinition)    = ddl:addTableConstraintDefinition multiple
+  + * (ddl:dropTableConstraintDefinition)   = ddl:dropTableConstraintDefinition multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+
+// =============================================================================
+// ALTER DOMAIN
+// =============================================================================
+[ddl:alterDomainStatement] > ddl:statement, ddl:alterable, ddl:domainOperand mixin
+  - ddl:alterDomainAction (STRING)                  // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[ddl:dropSchemaStatement]           > ddl:statement, ddl:droppable, ddl:schemaOperand mixin
+[ddl:dropTableStatement]            > ddl:statement, ddl:droppable, ddl:tableOperand mixin
+[ddl:dropViewStatement]             > ddl:statement, ddl:droppable, ddl:viewOperand mixin
+[ddl:dropDomainStatement]           > ddl:statement, ddl:droppable, ddl:domainOperand mixin
+[ddl:dropCharacterSetStatement]     > ddl:statement, ddl:droppable, ddl:characterSetOperand mixin
+[ddl:dropCollationStatement]        > ddl:statement, ddl:droppable, ddl:collationOperand mixin
+[ddl:dropTranslationStatement]      > ddl:statement, ddl:droppable, ddl:translationOperand mixin
+[ddl:dropAssertionStatement]        > ddl:statement, ddl:droppable, ddl:assertionOperand mixin
+
+[ddl:alterColumnDefinition]         > ddl:columnDefinition, ddl:alterable mixin
+[ddl:addColumnDefinition]           > ddl:columnDefinition, ddl:creatable mixin
+[ddl:dropColumnDefinition]          > ddl:columnDefinition, ddl:droppable mixin
+[ddl:addTableConstraintDefinition]  > ddl:tableConstraintDefinition, ddl:creatable mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[ddl:setStatement] > ddl:statement, ddl:settable mixin
+   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+   
+[ddl:insertStatement] > ddl:statement, ddl:insertable mixin
+   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+
+[ddl:grantPrivilege] mixin
+  - ddl:type (STRING) mandatory
+  + * (ddl:columnReference) = ddl:columnReference multiple
+
+[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
+  - ddl:allPrivileges (boolean)
+  + * (ddl:grantPrivilege) = ddl:grantPrivilege multiple
+  + * (ddl:grantee) = ddl:grantee multiple
+
+[ddl:grantOnTableStatement]         > ddl:grantStatement, ddl:tableOperand mixin
+[ddl:grantOnDomainStatement]        > ddl:grantStatement, ddl:domainOperand mixin
+[ddl:grantOnCollationStatement]     > ddl:grantStatement, ddl:collationOperand mixin
+[ddl:grantOnCharacterSetStatement]  > ddl:grantStatement, ddl:characterSetOperand mixin
+[ddl:grantOnTranslationStatement]   > ddl:grantStatement, ddl:translationOperand mixin


Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/StandardDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,72 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[derbyddl:functionOperand]  > ddl:operand abstract
-[derbyddl:indexOperand]     > ddl:operand abstract
-[derbyddl:procedureOperand] > ddl:operand abstract
-[derbyddl:roleOperand]      > ddl:operand abstract
-[derbyddl:synonymOperand]   > ddl:operand abstract
-[derbyddl:triggerOperand]   > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[derbyddl:columnDefinition] > ddl:columnDefinition mixin
-  - derbyddl:dropDefault (boolean)
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
-[derbyddl:createIndex]                 > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
-  - derbyddl:tableName (string) mandatory
-  - derbyddl:unique (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
-[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
-[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
-[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
-
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
-[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
-[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
-[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
-[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
-[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,102 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[derbyddl:functionOperand]  > ddl:operand abstract
+[derbyddl:indexOperand]     > ddl:operand abstract
+[derbyddl:procedureOperand] > ddl:operand abstract
+[derbyddl:roleOperand]      > ddl:operand abstract
+[derbyddl:synonymOperand]   > ddl:operand abstract
+[derbyddl:triggerOperand]   > ddl:operand abstract
+
+[derbyddl:roleName]         > derbyddl:roleOperand mixin
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[derbyddl:columnDefinition] > ddl:columnDefinition mixin
+  - derbyddl:dropDefault (boolean)
+  
+[derbyddl:functionParameter] > ddl:columnDefinition mixin
+
+[derbyddl:indexColumnReference] > ddl:columnReference mixin
+  - derbyddl:order (STRING)
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:isTableType (boolean)
+  + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+[derbyddl:createIndexStatement]        > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - derbyddl:unique (boolean)
+  + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
+[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
+[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
+[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
+  - derbyddl:tableName (string) mandatory
+[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - ddl:sql (string) mandatory
+  + * (ddl:columnReference) = ddl:columnreference multiple
+[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
+[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
+[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
+[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
+[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
+[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[derbyddl:lockTableStatement]       > ddl:statement, ddl:tableOperand mixin
+[derbyddl:renameTableStatement]     > ddl:statement, ddl:renamable, ddl:tableOperand mixin
+
+[derbyddl:grantOnFunctionStatement]     > ddl:grantStatement, derbyddl:functionOperand mixin
+[derbyddl:grantOnProcedureStatement]    > ddl:grantStatement, derbyddl:procedureOperand mixin
+
+[derbyddl:grantRolesStatement]          > ddl:grantStatement mixin
+  + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file


Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -1,178 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[postgresddl:aggregateOperand]      > ddl:operand abstract
-[postgresddl:castOperand]           > ddl:operand abstract
-[postgresddl:commentOperand]      > ddl:operand abstract
-[postgresddl:constraintTriggerOperand] > ddl:operand abstract
-[postgresddl:conversionOperand]     > ddl:operand abstract
-[postgresddl:databaseOperand]       > ddl:operand abstract
-[postgresddl:foreignDataOperand]    > ddl:operand abstract
-[postgresddl:groupOperand]          > ddl:operand abstract
-[postgresddl:functionOperand]       > ddl:operand abstractmandatory
-[postgresddl:indexOperand]          > ddl:operand abstract
-[postgresddl:languageOperand]       > ddl:operand abstract
-[postgresddl:operatorOperand]       > ddl:operand abstract
-[postgresddl:ownedByOperand]        > ddl:operand abstract
-[postgresddl:roleOperand]           > ddl:operand abstract
-[postgresddl:ruleOperand]           > ddl:operand abstract
-[postgresddl:sequenceOperand]       > ddl:operand abstract
-[postgresddl:serverOperand]         > ddl:operand abstract
-[postgresddl:tablespaceOperand]     > ddl:operand abstract
-[postgresddl:textSearchOperand]     > ddl:operand abstract
-[postgresddl:triggerOperand]        > ddl:operand abstract
-[postgresddl:typeOperand]           > ddl:operand abstract
-[postgresddl:userOperand]           > ddl:operand abstract
-[postgresddl:userMappingOperand]    > ddl:operand abstract
-
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
-[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
-[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
-
-[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - postgresddl:newTableName (STRING)
-  - postgresddl:schemaName (STRING)
-  + postgresddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
-[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[postgresddl:abortStatement]            > ddl:statement mixin
-[postgresddl:analyzeStatement]          > ddl:statement mixin
-[postgresddl:clusterStatement]          > ddl:statement mixin
-[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
-  - postgresddl:targetObjectType (STRING) mandatory
-  - postgresddl:targetObjectName (STRING)
-  - postgresddl:comment (STRING) mandatory
-[postgresddl:copyStatement]             > ddl:statement mixin
-[postgresddl:deallocateStatement]       > ddl:statement mixin
-[postgresddl:declareStatement]          > ddl:statement mixin
-[postgresddl:discardStatement]          > ddl:statement mixin
-[postgresddl:explainStatement]          > ddl:statement mixin
-[postgresddl:fetchStatement]            > ddl:statement mixin
-[postgresddl:listenStatement]           > ddl:statement mixin
-[postgresddl:loadStatement]             > ddl:statement mixin
-[postgresddl:lockTableStatement]        > ddl:statement mixin
-[postgresddl:moveStatement]             > ddl:statement mixin
-[postgresddl:notifyStatement]           > ddl:statement mixin
-[postgresddl:prepareStatement]          > ddl:statement mixin
-[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
-[postgresddl:reindexStatement]          > ddl:statement mixin
-[postgresddl:releaseSavepointStatement] > ddl:statement mixin
-[postgresddl:rollbackStatement]         > ddl:statement mixin
-[postgresddl:selectIntoStatement]       > ddl:statement mixin
-[postgresddl:showStatement]             > ddl:statement mixin
-[postgresddl:truncateStatement]         > ddl:statement mixin
-[postgresddl:unlistenStatement]         > ddl:statement mixin
-[postgresddl:vacuumStatement]           > ddl:statement mixin
-
-

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
@@ -0,0 +1,205 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[postgresddl:aggregateOperand]      > ddl:operand abstract
+[postgresddl:castOperand]           > ddl:operand abstract
+[postgresddl:commentOperand]      > ddl:operand abstract
+[postgresddl:constraintTriggerOperand] > ddl:operand abstract
+[postgresddl:conversionOperand]     > ddl:operand abstract
+[postgresddl:databaseOperand]       > ddl:operand abstract
+[postgresddl:foreignDataOperand]    > ddl:operand abstract
+[postgresddl:groupOperand]          > ddl:operand abstract
+[postgresddl:functionOperand]       > ddl:operand abstract
+[postgresddl:indexOperand]          > ddl:operand abstract
+[postgresddl:languageOperand]       > ddl:operand abstract
+[postgresddl:operatorOperand]       > ddl:operand abstract
+[postgresddl:ownedByOperand]        > ddl:operand abstract
+[postgresddl:roleOperand]           > ddl:operand abstract
+[postgresddl:ruleOperand]           > ddl:operand abstract
+[postgresddl:sequenceOperand]       > ddl:operand abstract
+[postgresddl:serverOperand]         > ddl:operand abstract
+[postgresddl:tablespaceOperand]     > ddl:operand abstract
+[postgresddl:textSearchOperand]     > ddl:operand abstract
+[postgresddl:triggerOperand]        > ddl:operand abstract
+[postgresddl:typeOperand]           > ddl:operand abstract
+[postgresddl:userOperand]           > ddl:operand abstract
+[postgresddl:userMappingOperand]    > ddl:operand abstract
+[postgresddl:parameterOperand]      > ddl:operand abstract
+
+[postgresddl:functionParameter]     > postgresddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING)
+  - postgresddl:mode (STRING)
+
+[postgresddl:role]                  > postgresddl:roleOperand mixin
+
+[postgresddl:renamedColumn]         > ddl:renamable mixin
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
+[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
+[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
+
+[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - postgresddl:newTableName (STRING)
+  - postgresddl:schemaName (STRING)
+  + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn multiple
+
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
+[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[postgresddl:abortStatement]            > ddl:statement mixin
+[postgresddl:analyzeStatement]          > ddl:statement mixin
+[postgresddl:clusterStatement]          > ddl:statement mixin
+[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
+  - postgresddl:targetObjectType (STRING) mandatory
+  - postgresddl:targetObjectName (STRING)
+  - postgresddl:comment (STRING) mandatory
+[postgresddl:copyStatement]             > ddl:statement mixin
+[postgresddl:deallocateStatement]       > ddl:statement mixin
+[postgresddl:declareStatement]          > ddl:statement mixin
+[postgresddl:discardStatement]          > ddl:statement mixin
+[postgresddl:explainStatement]          > ddl:statement mixin
+[postgresddl:fetchStatement]            > ddl:statement mixin
+[postgresddl:listenStatement]           > ddl:statement mixin
+[postgresddl:loadStatement]             > ddl:statement mixin
+[postgresddl:lockTableStatement]        > ddl:statement mixin
+[postgresddl:moveStatement]             > ddl:statement mixin
+[postgresddl:notifyStatement]           > ddl:statement mixin
+[postgresddl:prepareStatement]          > ddl:statement mixin
+[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
+[postgresddl:reindexStatement]          > ddl:statement mixin
+[postgresddl:releaseSavepointStatement] > ddl:statement mixin
+[postgresddl:rollbackStatement]         > ddl:statement mixin
+[postgresddl:selectIntoStatement]       > ddl:statement mixin
+[postgresddl:showStatement]             > ddl:statement mixin
+[postgresddl:truncateStatement]         > ddl:statement mixin
+[postgresddl:unlistenStatement]         > ddl:statement mixin
+[postgresddl:vacuumStatement]           > ddl:statement mixin
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+[postgresddl:grantOnTableStatement]            > ddl:grantStatement, ddl:tableOperand mixin
+[postgresddl:grantOnSequenceStatement]         > ddl:grantStatement, postgresddl:sequenceOperand mixin
+[postgresddl:grantOnDatabaseStatement]         > ddl:grantStatement, postgresddl:databaseOperand mixin
+[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement, postgresddl:foreignDataOperand mixin
+[postgresddl:grantOnForeignServerStatement]    > ddl:grantStatement, postgresddl:serverOperand mixin
+[postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+  + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+[postgresddl:grantOnLanguageStatement]         > ddl:grantStatement, postgresddl:languageOperand mixin
+[postgresddl:grantOnSchemaStatement]           > ddl:grantStatement, ddl:schemaOperand mixin
+[postgresddl:grantOnTablespaceStatement]       > ddl:grantStatement, postgresddl:tablespaceOperand mixin
+[postgresddl:grantRolesStatement]              > ddl:grantStatement mixin
+  + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple


Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParserTestHelper.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -39,7 +39,7 @@
  */
 public class DdlParserTestHelper implements DdlConstants {
 	private boolean printToConsole = false;
-	
+	public final static String NEWLINE = "\n";
 
 	/**
 	 * 

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -47,6 +47,7 @@
 import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -488,6 +489,7 @@
         assertThat(verifyMixinType(node_2, "ddl:columnDefinition"), is(true));
     }
     
+    @Ignore
     @Test
     public void shouldSequenceDerbyDdl() throws IOException {
         URL url = this.getClass().getClassLoader().getResource("ddl/dialect/derby/derby_test_statements.ddl");

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -790,7 +790,7 @@
         boolean success = parser.parse(content, rootNode);
 
         assertThat(success, is(true));
-        assertThat(rootNode.getChildCount(), is(7));
+        assertThat(rootNode.getChildCount(), is(11));
 
         // List<AstNode> theNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_MISSING_TERMINATOR);
         // assertThat(theNodes.size(), is(3));
@@ -834,4 +834,17 @@
         assertThat(rootNode.getChildCount(), is(3));
 
     }
+    
+    @Test
+    public void shouldParseGrantStatements() {
+        printTest("shouldParseGrantStatements()");
+        String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;" + NEWLINE
+            + "GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;" + NEWLINE
+            + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+            + "GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(4));
+    }
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -4,17 +4,14 @@
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
-
 import java.util.List;
-
 import org.jboss.dna.sequencer.ddl.DdlParserTestHelper;
-import org.jboss.dna.sequencer.ddl.StandardDdlParser;
 import org.jboss.dna.sequencer.ddl.node.AstNode;
 import org.junit.Before;
 import org.junit.Test;
 
-public class DerbyDdlParserTest extends DdlParserTestHelper{
-	private StandardDdlParser parser;
+public class DerbyDdlParserTest extends DdlParserTestHelper {
+	private DerbyDdlParser parser;
 	private AstNode rootNode;
 	
 	public static final String DDL_FILE_PATH = "src/test/resources/ddl/dialect/derby/";
@@ -29,27 +26,69 @@
     	rootNode = parser.nodeFactory().node("ddlRootNode");
 	}
     
-//	@Test
-//	public void shouldParseDerbyDDL() {
-//	  	String content = getFileContent(DDL_FILE_PATH + "derby_test_create.ddl");
-//	  
-//	  	List<Statement> stmts = parser.parse(content);
-//	  	
-//	  	assertEquals(744, stmts.size());
-//
-//	  	System.out.println("  END PARSING.  # Statements = " + stmts.size());
-//	  
-//	}
+	@Test
+    public void shouldParseCreateFunctionWithDataTypeReturn() {
+	    //setPrintToConsole(true);
+	    //parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateFunctionWithDataTypeReturn()");
+        String content = "CREATE FUNCTION TO_DEGREES" + NEWLINE
+            + "( RADIANS DOUBLE )" + NEWLINE
+            + "RETURNS DOUBLE" + NEWLINE
+            + "PARAMETER STYLE JAVA" + NEWLINE
+            + "NO SQL LANGUAGE JAVA" + NEWLINE
+            + "EXTERNAL NAME 'java.lang.Math.toDegrees';";
+        
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+
+    }
 	
+   @Test
+    public void shouldParseCreateFunctionWithTableTypeReturn() {
+        //setPrintToConsole(true);
+        //parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateFunctionWithTableTypeReturn()");
+        String content = "CREATE FUNCTION PROPERTY_FILE_READER" + NEWLINE
+            + "( FILENAME VARCHAR( 32672 ), FILESIZE INTEGER )" + NEWLINE
+            + "RETURNS TABLE (KEY_COL VARCHAR( 10 ), VALUE_COL VARCHAR( 1000 ))" + NEWLINE
+            + "LANGUAGE JAVA" + NEWLINE
+            + "PARAMETER STYLE DERBY_JDBC_RESULT_SET" + NEWLINE
+            + "NO SQL" + NEWLINE
+            + "EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI';";
+        
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+    }
+	
     @Test
     public void shouldParseDropSchemaRestrict() {
-    	printTest("shouldParseDeclareGlobaTemporaryTable()");
+    	printTest("shouldParseDropSchemaRestrict()");
     	String content = "DROP SCHEMA SAMP RESTRICT;";
 
     	boolean success = parser.parse(content, rootNode);
     	assertThat(true, is(success));
+    	assertThat(rootNode.getChildCount(), is(1));
     }
     
+    @Test
+    public void shouldParseCreateIndex() {
+        printTest("shouldParseCreateIndex()");
+        String content = "CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY DESC, UNIT);";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseLockTable() {
+        printTest("shouldParseLockTable()");
+        String content = "LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
 	
     @Test
     public void shouldParseDeclareGlobaTemporaryTable() {
@@ -59,8 +98,69 @@
     	boolean success = parser.parse(content, rootNode);
     	assertThat(true, is(success));
     }
-	
+    
     @Test
+    public void shouldParseRenameTable() {
+        printTest("shouldParseRenameTable()");
+        String content = "RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateSynonym() {
+        printTest("shouldParseCreateSynonym()");
+        String content = "CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateTrigger() {
+        printTest("shouldParseCreateTrigger()");
+        String content = "CREATE TRIGGER FLIGHTSDELETE3" + NEWLINE
+           + "AFTER DELETE ON FLIGHTS" + NEWLINE
+           + "REFERENCING OLD AS OLD" + NEWLINE
+           + "FOR EACH ROW" + NEWLINE
+           + "DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseCreateTrigger_2() {
+        printTest("shouldParseCreateTrigger_2()");
+        String content = "CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x" + NEWLINE
+        + "FOR EACH ROW MODE DB2SQL" + NEWLINE
+        + "values app.notifyEmail('Jerry', 'Table x is about to be updated');";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
+    
+    @Test
+    public void shouldParseGrantStatements() {
+        printTest("shouldParseGrantStatements()");
+        String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;" + NEWLINE
+            + "GRANT UPDATE, TRIGGER ON TABLE purchaseOrders TO anita,zhi;" + NEWLINE
+            + "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+            + "GRANT EXECUTE ON PROCEDURE updatePurchases TO george;" + NEWLINE
+            + "GRANT purchases_reader_role TO george,maria;" + NEWLINE
+            + "GRANT SELECT ON TABLE purchaseOrders TO purchases_reader_role;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(6));
+    }
+    
+    @Test
     public void shouldParseAlterTableAlterColumnDefaultRealNumber() {
     	printTest("shouldParseAlterTableAlterColumnDefaultRealNumber()");
     	String content = "ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0;";
@@ -82,6 +182,8 @@
 	
 	@Test
 	public void shouldParseDerbyStatements() {
+	    //setPrintToConsole(true);
+        //parser.setTestMode(isPrintToConsole());
 		printTest("shouldParseDerbyStatements()");
 	  	String content = getFileContent(DDL_FILE_PATH + "derby_test_statements.ddl");
 
@@ -91,6 +193,5 @@
 		List<AstNode> problems = parser.nodeFactory().getChildrenForType(rootNode, TYPE_PROBLEM);
 		int nStatements = rootNode.getChildCount() - problems.size();
 		assertEquals(64, nStatements);
-		
 	}
 }
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParserTest.java	2010-01-05 13:31:47 UTC (rev 1527)
@@ -23,16 +23,8 @@
  */
 package org.jboss.dna.sequencer.ddl.dialect.postgres;
 
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_SCHEMA_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_TABLE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_FOREIGN_DATA_WRAPPER_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_ALTER_TABLE_STATEMENT_POSTGRES;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_COMMENT_ON_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_RULE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_CREATE_SEQUENCE_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_LISTEN_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_RENAME_COLUMN;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.*;
+import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import org.jboss.dna.graph.JcrLexicon;
@@ -422,8 +414,59 @@
         assertEquals(true, success);
         assertEquals(2, rootNode.getChildCount());
     }
+    
+    @Test
+    public void shouldParseGrantOnTable() {
+        printTest("shouldParseGrantOnTable()");
+        String content = "GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi;";
 
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+    }
+    
     @Test
+    public void shouldParseGrantOnMultipleTables() {
+        printTest("shouldParseGrantOnMultipleTables()");
+        String content = "GRANT UPDATE, TRIGGER ON TABLE t1, t2, t3 TO anita,zhi;";
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(3, rootNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseGrantExecuteOnFunction() {
+        printTest("shouldParseGrantExecuteOnFunction()");
+        String content = "GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;";
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_GRANT_ON_FUNCTION_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseGrantExecuteAndUpdateOnMultipleFunctions() {
+        printTest("shouldParseGrantExecuteOnMultipleFunctions()");
+        String content = "GRANT EXECUTE, UPDATE ON FUNCTION cos(), sin(b double precision) TO peter;";
+
+        boolean success = parser.parse(content, rootNode);
+
+        assertEquals(true, success);
+        assertEquals(2, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChild(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_GRANT_ON_FUNCTION_STATEMENT));
+        assertEquals(3, childNode.getChildCount());
+        childNode = rootNode.getChild(1);
+        assertEquals(4, childNode.getChildCount());
+    }
+    
+    @Test
     public void shouldParsePostgresStatements_1() {
         printTest("shouldParsePostgresStatements_1()");
         String content = getFileContent(DDL_FILE_PATH + "postgres_test_statements_1.ddl");

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/postgres/postgres_test_statements_4.ddl	2010-01-05 13:31:47 UTC (rev 1527)
@@ -43,7 +43,7 @@
 
 GRANT SELECT ON TABLE s.v to PUBLIC;
 
-GRANT EXECUTE ON PROCEDURE p TO george;
+GRANT EXECUTE ON FUNCTION p(a int, b TEXT) TO george;
 -- 10 STATEMENTS *******************************************************
 GRANT purchases_reader_role TO george,maria;
 

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl	2010-01-05 13:24:33 UTC (rev 1526)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/standardDdlTest.ddl	2010-01-05 13:31:47 UTC (rev 1527)
@@ -37,4 +37,13 @@
      (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
     ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
 
+GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
 
+GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;
+
+GRANT SELECT ON TABLE orders.bills to PUBLIC;
+
+GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
+
+
+


From dna-commits at lists.jboss.org  Tue Jan  5 08:33:30 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 08:33:30 -0500
Subject: [dna-commits] DNA SVN: r1528 - in
	trunk/dna-integration-tests/src/test:
	resources/org/jboss/dna/test/integration/sequencer/ddl and 1
	other directory.
Message-ID: <201001051333.o05DXUfT014705@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-05 08:33:29 -0500 (Tue, 05 Jan 2010)
New Revision: 1528

Added:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
Removed:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl
Log:
DNA-49 integration test changes for additional parsing.  Includes parsing for Grant statements in Standard, Derby & Postgres

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-05 13:31:47 UTC (rev 1527)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-05 13:33:29 UTC (rev 1528)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.test.integration.sequencer.ddl;
 
+import static org.junit.Assert.assertNotNull;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -199,6 +200,53 @@
     }
     
     @Test
+    public void shouldSequenceStandardDdlFile() throws Exception {
+        System.out.println("STARTED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
+        URL url = getUrl(cndDdlFolder + "standard_test_statements.ddl");
+        uploadFile(url);
+        
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+
+                    //printNodeProperties(ddlNode);
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 11);
+                    
+                    //GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
+                    Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
+                    assertNotNull(grantNode);
+                    Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
+                    assertNotNull(granteeNode);
+                    Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "SELECT");
+                    
+                    //GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;
+                    grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
+                    assertNotNull(grantNode);
+                    privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
+                    granteeNode = findNode(grantNode, "anita", "ddl:grantee");
+                    assertNotNull(granteeNode);
+                }
+            }
+        }
+        
+        System.out.println("FINISHED:  shouldSequenceStandardDdlFile(create_schema.ddl)");
+    }
+    
+    @Test
     public void shouldSequenceDerbyDdlFile() throws Exception {
         System.out.println("STARTED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
         URL url = getUrl(cndDdlFolder + "derby_test_statements.ddl");
@@ -225,6 +273,89 @@
                     verifyNode(ddlNode, "SAMP.DEPARTMENT", "ddl:expression");
                     verifyNode(ddlNode, "HOTEL_ID", "ddl:datatypeName");
                     verifyNode(ddlNode, "CITIES", "ddl:startLineNumber");
+                    
+                    // Create Function
+                    verifyNode(ddlNode, "PROPERTY_FILE_READER", "ddl:startLineNumber", 71);
+                    verifyNodeTypes(ddlNode, "PROPERTY_FILE_READER", 
+                                    "derbyddl:createFunctionStatement", 
+                                    "ddl:creatable", 
+                                    "derbyddl:functionOperand");
+                    verifyNode(ddlNode, "KEY_COL", "ddl:datatypeName", "VARCHAR");
+                    
+                    Node functionNode = findNode(ddlNode, "TO_DEGREES");
+                    assertNotNull(functionNode);
+                    verifyChildNode(functionNode, "parameterStyle", "ddl:value", "PARAMETER STYLE JAVA");
+                    
+                    // Create Index
+                    // CREATE INDEX IXSALE ON SAMP.SALES (SALES);
+                    Node indexNode = findNode(ddlNode, "IXSALE", "derbyddl:createIndexStatement");
+                    assertNotNull(indexNode);
+                    verifySimpleStringProperty(indexNode, "derbyddl:tableName", "SAMP.SALES");
+                    Node colRefNode = findNode(indexNode, "SALES");
+                    assertNotNull(colRefNode);
+                    colRefNode = findNode(ddlNode, "SALES", "derbyddl:indexColumnReference");
+                    assertNotNull(colRefNode);
+                    verifyNodeTypes(colRefNode, "SALES", 
+                                    "derbyddl:indexColumnReference", 
+                                    "ddl:columnReference", 
+                                    "ddl:referenceOperand");
+                    
+                    // declare global temporary table SESSION.t1(c11 int) not logged;
+                    Node ttNode = findNode(ddlNode, "SESSION.t1", "derbyddl:declareGlobalTemporaryTableStatement");
+                    assertNotNull(ttNode);
+                    Node colNode = findNode(ttNode, "c11");
+                    assertNotNull(colNode);
+                    verifySimpleStringProperty(colNode, "ddl:datatypeName", "int");
+                    
+                    // LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
+                    Node lockNode = findNode(ddlNode, "FlightAvailability", "derbyddl:lockTableStatement");
+                    assertNotNull(lockNode);
+                    Node optionNode = findNode(lockNode, "lockMode");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "EXCLUSIVE");
+                    
+                    // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT
+                    Node renameTableNode = findNode(ddlNode, "SAMP.EMP_ACT", "derbyddl:renameTableStatement");
+                    assertNotNull(renameTableNode);
+                    verifySimpleStringProperty(renameTableNode, "ddl:newName", "EMPLOYEE_ACT");
+                    
+                    // CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;
+                    Node synonymNode = findNode(ddlNode, "SAMP.T1", "derbyddl:createSynonymStatement");
+                    assertNotNull(synonymNode);
+                    verifySimpleStringProperty(synonymNode, "derbyddl:tableName", "SAMP.TABLEWITHLONGNAME");
+                    
+                    //CREATE TRIGGER FLIGHTSDELETE3
+                    //   AFTER DELETE ON FLIGHTS
+                    //   REFERENCING OLD AS OLD
+                    //   FOR EACH ROW 
+                    //   DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
+                    Node triggerNode = findNode(ddlNode, "FLIGHTSDELETE3", "derbyddl:createTriggerStatement");
+                    assertNotNull(triggerNode);
+                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "FLIGHTS");
+                    
+                    //CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+                    //   FOR EACH ROW MODE DB2SQL
+                    //   values app.notifyEmail('Jerry', 'Table x is about to be updated');
+                    triggerNode = findNode(ddlNode, "t1", "derbyddl:createTriggerStatement");
+                    assertNotNull(triggerNode);
+                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "x");
+                    optionNode = findNode(triggerNode, "forEach");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "FOR EACH ROW");
+                    optionNode = findNode(triggerNode, "eventType");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "UPDATE");
+                    
+                    //GRANT EXECUTE ON PROCEDURE p TO george;
+                    Node grantNode = findNode(ddlNode, "p", "derbyddl:grantOnProcedureStatement");
+                    assertNotNull(grantNode);
+                    
+                    //GRANT purchases_reader_role TO george,maria;
+                    grantNode = findNode(ddlNode, "grantRoles", "derbyddl:grantRolesStatement");
+                    assertNotNull(grantNode);
+                    Node roleNode = findNode(grantNode, "george", "ddl:grantee");
+                    assertNotNull(roleNode);
+                    
                 }
             }
         }
@@ -288,7 +419,7 @@
                     Node ddlNode = iter.nextNode();
                     
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 101);
+                    assertEquals(numStatements, 106);
                     
                     //printNodeProperties(ddlNode);
                     
@@ -307,6 +438,20 @@
                     verifyNode(ddlNode, "my_function", "ddl:startLineNumber", 44);
                     verifyNode(ddlNode, "my_function", "ddl:startCharIndex", 1573);
                     verifyNode(ddlNode, "my_function", "postgresddl:comment", "'Returns Roman Numeral'");
+                    
+                    //ALTER TABLE foreign_companies RENAME COLUMN address TO city;
+                    Node alterTableNode = findNode(ddlNode, "foreign_companies", "postgresddl:alterTableStatement");
+                    assertNotNull(alterTableNode);
+                    Node renameColNode = findNode(alterTableNode, "address","postgresddl:renamedColumn");
+                    assertNotNull(renameColNode);
+                    verifySingleValueProperty(renameColNode, "ddl:newName", "city");
+                    
+                    //GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
+                    Node grantNode = findNode(ddlNode, "divideByTwo", "postgresddl:grantOnFunctionStatement");
+                    assertNotNull(grantNode);
+                    Node parameter_1 = findNode(grantNode, "numerator","postgresddl:functionParameter");
+                    assertNotNull(parameter_1);
+                    verifySingleValueProperty(parameter_1, "ddl:datatypeName", "int");
                 }
             }
         }
@@ -345,12 +490,33 @@
     
     public void printNodeProperties(Node node) throws Exception {
         printProperties(node);
+        
         for (NodeIterator iter = node.getNodes(); iter.hasNext();) { 
             printNodeProperties(iter.nextNode());
         }
          
     }
     
+    private void verifyChildNode(Node parentNode, String childNodeName, String propName, String expectedValue) throws Exception {
+        // Find child node
+        Node childNode = null;
+        for (NodeIterator iter = parentNode.getNodes(); iter.hasNext();) {
+            Node nextNode = iter.nextNode();
+            if( nextNode.getName().equals(childNodeName)) {
+                childNode = nextNode;
+                break;
+            }
+        }
+        if( childNode != null ) {
+            assertThat( childNode.hasProperty(propName), is(true));
+            verifySingleValueProperty(childNode, propName, expectedValue);
+            
+        } else {
+            fail("NODE: " + childNodeName + " not found");
+        }
+        
+    }
+    
     private void verifyNode(Node topNode, String name, String propName) throws Exception {
         Node node = findNode(topNode, name);
         
@@ -362,6 +528,11 @@
         
     }
     
+    private void verifySimpleStringProperty(Node node, String propName, String expectedValue) throws Exception {
+        assertThat( node.hasProperty(propName), is(true));
+        verifySingleValueProperty(node, propName, expectedValue);
+    }
+    
     private void verifyNode(Node topNode, String name, String propName, String expectedValue) throws Exception {
         Node node = findNode(topNode, name);
         
@@ -433,15 +604,19 @@
         }
     }
     
-    private void verifyMixin(Node node, String nodeType) throws Exception {
-        boolean foundMixin = false;
+    private boolean hasMixin(Node node, String nodeType) throws Exception { 
         for( NodeType mixin : node.getMixinNodeTypes() ) {
             String mixinName = mixin.getName();
             if( mixinName.equals(nodeType) ) {
-                foundMixin = true;
-                break;
+                return true;
             }
         }
+        return false;
+    }
+    
+    private void verifyMixin(Node node, String nodeType) throws Exception {
+        boolean foundMixin = hasMixin(node, nodeType);
+
         
         assertThat(foundMixin, is(true));
     }
@@ -457,6 +632,20 @@
         
     }
     
+    private void verifyNodeTypes(Node topNode, String nodeName, String nodeTypeName, String...moreNodeTypeNames) throws Exception {
+        Node node = findNode(topNode, nodeName);
+        
+        if( node != null ) {
+            assertThat(node.isNodeType(nodeTypeName), is(true));
+            for( String nextTypeName : moreNodeTypeNames ) {
+                assertThat(node.isNodeType(nextTypeName), is(true));
+            }
+        } else {
+            fail("NODE: " + nodeName + " not found");
+        }
+        
+    }
+    
     private Node findNode(Node node, String name) throws Exception  {
         if( node.getName().equals(name)) {
             return node;
@@ -475,6 +664,24 @@
         return null;
     }
     
+    private Node findNode(Node node, String name, String type) throws Exception  {
+        if( node.getName().equals(name) && node.isNodeType(type)) { //(hasMixin(node, type) || node.isNodeType(type))) {
+            return node;
+        }
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            Node nextNode = iter.nextNode();
+            if( nextNode.getName().equals(name) && node.isNodeType(type)) { //(hasMixin(node, type) || node.isNodeType(type))) {
+                return nextNode;
+            }
+            Node someNode = findNode(nextNode, name, type);
+            if( someNode != null ) {
+                return someNode;
+            }
+        }
+        
+        return null;
+    }
+    
     private void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
         
         System.out.println("\n >>>  NODE PATH: " + node.getPath() );

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd	2010-01-05 13:33:29 UTC (rev 1528)
@@ -41,26 +41,44 @@
 [derbyddl:synonymOperand]   > ddl:operand abstract
 [derbyddl:triggerOperand]   > ddl:operand abstract
 
+[derbyddl:roleName]         > derbyddl:roleOperand mixin
+
 // =============================================================================
 // COLUMN
 // =============================================================================
 [derbyddl:columnDefinition] > ddl:columnDefinition mixin
   - derbyddl:dropDefault (boolean)
   
+[derbyddl:functionParameter] > ddl:columnDefinition mixin
+
+[derbyddl:indexColumnReference] > ddl:columnReference mixin
+  - derbyddl:order (STRING)
+  
 // =============================================================================
 // CREATE STATEMENTS
 // =============================================================================
 [derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
-[derbyddl:createIndex]                 > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:isTableType (boolean)
+  + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+[derbyddl:createIndexStatement]        > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
   - derbyddl:tableName (string) mandatory
   - derbyddl:unique (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
+  + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
 [derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
 [derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
 [derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
+  - derbyddl:tableName (string) mandatory
 [derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - ddl:sql (string) mandatory
+  + * (ddl:columnReference) = ddl:columnreference multiple
+[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
 
-
 // =============================================================================
 // DROP STATEMENTS
 // =============================================================================
@@ -70,3 +88,15 @@
 [derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
 [derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
 [derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[derbyddl:lockTableStatement]       > ddl:statement, ddl:tableOperand mixin
+[derbyddl:renameTableStatement]     > ddl:statement, ddl:renamable, ddl:tableOperand mixin
+
+[derbyddl:grantOnFunctionStatement]     > ddl:grantStatement, derbyddl:functionOperand mixin
+[derbyddl:grantOnProcedureStatement]    > ddl:grantStatement, derbyddl:procedureOperand mixin
+
+[derbyddl:grantRolesStatement]          > ddl:grantStatement mixin
+  + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	2010-01-05 13:33:29 UTC (rev 1528)
@@ -1,178 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[postgresddl:aggregateOperand]      > ddl:operand abstract
-[postgresddl:castOperand]           > ddl:operand abstract
-[postgresddl:commentOperand]        > ddl:operand abstract
-[postgresddl:constraintTriggerOperand] > ddl:operand abstract
-[postgresddl:conversionOperand]     > ddl:operand abstract
-[postgresddl:databaseOperand]       > ddl:operand abstract
-[postgresddl:foreignDataOperand]    > ddl:operand abstract
-[postgresddl:groupOperand]          > ddl:operand abstract
-[postgresddl:functionOperand]       > ddl:operand abstract
-[postgresddl:indexOperand]          > ddl:operand abstract
-[postgresddl:languageOperand]       > ddl:operand abstract
-[postgresddl:operatorOperand]       > ddl:operand abstract
-[postgresddl:ownedByOperand]        > ddl:operand abstract
-[postgresddl:roleOperand]           > ddl:operand abstract
-[postgresddl:ruleOperand]           > ddl:operand abstract
-[postgresddl:sequenceOperand]       > ddl:operand abstract
-[postgresddl:serverOperand]         > ddl:operand abstract
-[postgresddl:tablespaceOperand]     > ddl:operand abstract
-[postgresddl:textSearchOperand]     > ddl:operand abstract
-[postgresddl:triggerOperand]        > ddl:operand abstract
-[postgresddl:typeOperand]           > ddl:operand abstract
-[postgresddl:userOperand]           > ddl:operand abstract
-[postgresddl:userMappingOperand]    > ddl:operand abstract
-
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
-[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
-[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
-
-[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - postgresddl:newTableName (STRING)
-  - postgresddl:schemaName (STRING)
-  + postgresddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
-[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[postgresddl:abortStatement]            > ddl:statement mixin
-[postgresddl:analyzeStatement]          > ddl:statement mixin
-[postgresddl:clusterStatement]          > ddl:statement mixin
-[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
-  - postgresddl:targetObjectType (STRING) mandatory
-  - postgresddl:targetObjectName (STRING)
-  - postgresddl:comment (STRING) mandatory
-[postgresddl:copyStatement]             > ddl:statement mixin
-[postgresddl:deallocateStatement]       > ddl:statement mixin
-[postgresddl:declareStatement]          > ddl:statement mixin
-[postgresddl:discardStatement]          > ddl:statement mixin
-[postgresddl:explainStatement]          > ddl:statement mixin
-[postgresddl:fetchStatement]            > ddl:statement mixin
-[postgresddl:listenStatement]           > ddl:statement mixin
-[postgresddl:loadStatement]             > ddl:statement mixin
-[postgresddl:lockTableStatement]        > ddl:statement mixin
-[postgresddl:moveStatement]             > ddl:statement mixin
-[postgresddl:notifyStatement]           > ddl:statement mixin
-[postgresddl:prepareStatement]          > ddl:statement mixin
-[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
-[postgresddl:reindexStatement]          > ddl:statement mixin
-[postgresddl:releaseSavepointStatement] > ddl:statement mixin
-[postgresddl:rollbackStatement]         > ddl:statement mixin
-[postgresddl:selectIntoStatement]       > ddl:statement mixin
-[postgresddl:showStatement]             > ddl:statement mixin
-[postgresddl:truncateStatement]         > ddl:statement mixin
-[postgresddl:unlistenStatement]         > ddl:statement mixin
-[postgresddl:vacuumStatement]           > ddl:statement mixin
-
-

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	2010-01-05 13:33:29 UTC (rev 1528)
@@ -0,0 +1,205 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[postgresddl:aggregateOperand]      > ddl:operand abstract
+[postgresddl:castOperand]           > ddl:operand abstract
+[postgresddl:commentOperand]      > ddl:operand abstract
+[postgresddl:constraintTriggerOperand] > ddl:operand abstract
+[postgresddl:conversionOperand]     > ddl:operand abstract
+[postgresddl:databaseOperand]       > ddl:operand abstract
+[postgresddl:foreignDataOperand]    > ddl:operand abstract
+[postgresddl:groupOperand]          > ddl:operand abstract
+[postgresddl:functionOperand]       > ddl:operand abstract
+[postgresddl:indexOperand]          > ddl:operand abstract
+[postgresddl:languageOperand]       > ddl:operand abstract
+[postgresddl:operatorOperand]       > ddl:operand abstract
+[postgresddl:ownedByOperand]        > ddl:operand abstract
+[postgresddl:roleOperand]           > ddl:operand abstract
+[postgresddl:ruleOperand]           > ddl:operand abstract
+[postgresddl:sequenceOperand]       > ddl:operand abstract
+[postgresddl:serverOperand]         > ddl:operand abstract
+[postgresddl:tablespaceOperand]     > ddl:operand abstract
+[postgresddl:textSearchOperand]     > ddl:operand abstract
+[postgresddl:triggerOperand]        > ddl:operand abstract
+[postgresddl:typeOperand]           > ddl:operand abstract
+[postgresddl:userOperand]           > ddl:operand abstract
+[postgresddl:userMappingOperand]    > ddl:operand abstract
+[postgresddl:parameterOperand]      > ddl:operand abstract
+
+[postgresddl:functionParameter]     > postgresddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING)
+  - postgresddl:mode (STRING)
+
+[postgresddl:role]                  > postgresddl:roleOperand mixin
+
+[postgresddl:renamedColumn]         > ddl:renamable mixin
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
+[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
+[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
+
+[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - postgresddl:newTableName (STRING)
+  - postgresddl:schemaName (STRING)
+  + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn multiple
+
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
+[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[postgresddl:abortStatement]            > ddl:statement mixin
+[postgresddl:analyzeStatement]          > ddl:statement mixin
+[postgresddl:clusterStatement]          > ddl:statement mixin
+[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
+  - postgresddl:targetObjectType (STRING) mandatory
+  - postgresddl:targetObjectName (STRING)
+  - postgresddl:comment (STRING) mandatory
+[postgresddl:copyStatement]             > ddl:statement mixin
+[postgresddl:deallocateStatement]       > ddl:statement mixin
+[postgresddl:declareStatement]          > ddl:statement mixin
+[postgresddl:discardStatement]          > ddl:statement mixin
+[postgresddl:explainStatement]          > ddl:statement mixin
+[postgresddl:fetchStatement]            > ddl:statement mixin
+[postgresddl:listenStatement]           > ddl:statement mixin
+[postgresddl:loadStatement]             > ddl:statement mixin
+[postgresddl:lockTableStatement]        > ddl:statement mixin
+[postgresddl:moveStatement]             > ddl:statement mixin
+[postgresddl:notifyStatement]           > ddl:statement mixin
+[postgresddl:prepareStatement]          > ddl:statement mixin
+[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
+[postgresddl:reindexStatement]          > ddl:statement mixin
+[postgresddl:releaseSavepointStatement] > ddl:statement mixin
+[postgresddl:rollbackStatement]         > ddl:statement mixin
+[postgresddl:selectIntoStatement]       > ddl:statement mixin
+[postgresddl:showStatement]             > ddl:statement mixin
+[postgresddl:truncateStatement]         > ddl:statement mixin
+[postgresddl:unlistenStatement]         > ddl:statement mixin
+[postgresddl:vacuumStatement]           > ddl:statement mixin
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+[postgresddl:grantOnTableStatement]            > ddl:grantStatement, ddl:tableOperand mixin
+[postgresddl:grantOnSequenceStatement]         > ddl:grantStatement, postgresddl:sequenceOperand mixin
+[postgresddl:grantOnDatabaseStatement]         > ddl:grantStatement, postgresddl:databaseOperand mixin
+[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement, postgresddl:foreignDataOperand mixin
+[postgresddl:grantOnForeignServerStatement]    > ddl:grantStatement, postgresddl:serverOperand mixin
+[postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+  + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+[postgresddl:grantOnLanguageStatement]         > ddl:grantStatement, postgresddl:languageOperand mixin
+[postgresddl:grantOnSchemaStatement]           > ddl:grantStatement, ddl:schemaOperand mixin
+[postgresddl:grantOnTablespaceStatement]       > ddl:grantStatement, postgresddl:tablespaceOperand mixin
+[postgresddl:grantRolesStatement]              > ddl:grantStatement mixin
+  + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:31:47 UTC (rev 1527)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-05 13:33:29 UTC (rev 1528)
@@ -63,7 +63,7 @@
 [ddl:settable]  > ddl:operation abstract
 [ddl:grantable] > ddl:operation abstract
 [ddl:revokable] > ddl:operation abstract
-[ddl:renamable] > ddl:operation, ddl:operand abstract
+[ddl:renamable] > ddl:operation abstract
   - ddl:newName (STRING)
 
 // =============================================================================
@@ -119,6 +119,7 @@
 [ddl:columnReference]       > ddl:referenceOperand mixin
 [ddl:tableReference]        > ddl:referenceOperand mixin
 [ddl:fkColumnReference]     > ddl:referenceOperand mixin
+[ddl:grantee]               > ddl:referenceOperand mixin
 
 // =============================================================================
 // SIMPLE STRING PROPERTY
@@ -258,9 +259,22 @@
    
 [ddl:insertStatement] > ddl:statement, ddl:insertable mixin
    // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
-   
-[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
-   // TODO: THIS IS COMPLEX, NEED TO BREAK DOWN
 
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
 
+[ddl:grantPrivilege] mixin
+  - ddl:type (STRING) mandatory
+  + * (ddl:columnReference) = ddl:columnReference multiple
 
+[ddl:grantStatement] > ddl:statement, ddl:grantable mixin
+  - ddl:allPrivileges (boolean)
+  + * (ddl:grantPrivilege) = ddl:grantPrivilege multiple
+  + * (ddl:grantee) = ddl:grantee multiple
+
+[ddl:grantOnTableStatement]         > ddl:grantStatement, ddl:tableOperand mixin
+[ddl:grantOnDomainStatement]        > ddl:grantStatement, ddl:domainOperand mixin
+[ddl:grantOnCollationStatement]     > ddl:grantStatement, ddl:collationOperand mixin
+[ddl:grantOnCharacterSetStatement]  > ddl:grantStatement, ddl:characterSetOperand mixin
+[ddl:grantOnTranslationStatement]   > ddl:grantStatement, ddl:translationOperand mixin

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl	2010-01-05 13:31:47 UTC (rev 1527)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl	2010-01-05 13:33:29 UTC (rev 1528)
@@ -595,4 +595,15 @@
 CREATE TRIGGER trigger_name BEFORE dawn
     ON table
     EXECUTE PROCEDURE funcname ( 'arg1', 'arg2' );
--- 101 STATEMENTS *******************************************************
\ No newline at end of file
+
+ALTER TABLE foreign_companies RENAME COLUMN address TO city;
+
+ALTER TABLE us_companies RENAME TO suppliers;
+
+ALTER TABLE old_addresses ALTER COLUMN street SET NOT NULL;
+
+ALTER TABLE new_addresses ALTER COLUMN street DROP NOT NULL;
+
+GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
+
+-- 106 STATEMENTS *******************************************************

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-05 13:33:29 UTC (rev 1528)
@@ -0,0 +1,49 @@
+CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
+    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
+
+CREATE SCHEMA AUTHORIZATION oe
+   CREATE TABLE new_product 
+      (color VARCHAR(10)  PRIMARY KEY, quantity NUMERIC) 
+   CREATE VIEW new_product_view 
+      AS SELECT color, quantity FROM new_product WHERE color = 'RED' 
+   GRANT select ON new_product_view TO hr;
+    
+CREATE TABLE PEOPLE
+    (PERSON_ID INT NOT NULL CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
+
+CREATE SCHEMA schema_name_1
+	CREATE TABLE table_name_15 (
+	    column_name_1 VARCHAR(255) 
+	        REFERENCES ref_table_name (ref_column_name_1) 
+	        ON UPDATE NO ACTION )
+	CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
+	    AS SELECT COMM + BONUS, COMM - BONUS
+	       FROM SAMP.EMPLOYEE
+	CREATE TABLE table_name26 (
+	    column_name_1 VARCHAR(255),
+	    UNIQUE (ref_column_name_1));
+      
+CREATE TABLE table_name29 (
+    column_name_1 VARCHAR(255),
+    CONSTRAINT fk_name FOREIGN KEY (ref_column_name_1, ref_column_name_2)
+        REFERENCES ref_table_name (ref_column_name_1)
+        ON DELETE CASCADE ON UPDATE SET NULL
+        MATCH FULL);
+        
+CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL,
+    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL)  
+
+CREATE TABLE HOTELAVAILABILITY
+     (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
+    ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+
+GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
+
+GRANT UPDATE, USAGE ON TABLE billedOrders TO anita,zhi;
+
+GRANT SELECT ON TABLE orders.bills to PUBLIC;
+
+GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
+
+
+


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
___________________________________________________________________
Name: svn:executable
   + *


From dna-commits at lists.jboss.org  Tue Jan  5 14:16:20 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 14:16:20 -0500
Subject: [dna-commits] DNA SVN:  r1529 - trunk.
Message-ID: <201001051916.o05JGKHp025745@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 14:16:20 -0500 (Tue, 05 Jan 2010)
New Revision: 1529

Removed:
   trunk/dna-search/
Log:
DNA-622 Remove from SVN the 'dna-search' project, which contains only empty directories

Removing the empty directories as per the defect.


From dna-commits at lists.jboss.org  Tue Jan  5 15:33:14 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 15:33:14 -0500
Subject: [dna-commits] DNA SVN: r1530 - in trunk:
	dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect
	and 12 other directories.
Message-ID: <201001052033.o05KXEEV008320@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-05 15:33:13 -0500 (Tue, 05 Jan 2010)
New Revision: 1530

Added:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/derby_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/oracle_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/postgres_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/grant_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/revoke_test_statements.ddl
Removed:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/OracleDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/derby_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/oracle_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/test_cnd.cnd
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
Log:
DNA-49 refactored ddl sequencer integration tests. Separated per dialect. Added standard revoke statement parsing.

Added: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,348 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.test.integration.sequencer.ddl;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Calendar;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.NodeType;
+import org.jboss.dna.graph.SecurityContext;
+import org.jboss.dna.jcr.JcrEngine;
+import org.jboss.dna.jcr.JcrTools;
+import org.jboss.dna.repository.sequencer.SequencingService;
+
+/**
+ *
+ */
+public class DdlIntegrationTestUtil {
+    public JcrEngine engine;
+    public Session session;
+    public JcrTools tools;
+    public static final String ddlTestResourceRootFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
+    
+    
+    public void uploadFile(URL url) throws RepositoryException, IOException {
+        // Grab the last segment of the URL path, using it as the filename
+        String filename = url.getPath().replaceAll("([^/]*/)*", "");
+        String nodePath = "/a/b/" + filename;
+        String mimeType = "ddl";
+
+        // Now use the JCR API to upload the file ...
+
+
+        // Create the node at the supplied path ...
+        Node node = tools.findOrCreateNode(session.getRootNode(), nodePath, "nt:folder", "nt:file");
+
+        // Upload the file to that node ...
+        Node contentNode = tools.findOrCreateChild(node, "jcr:content", "nt:resource");
+        contentNode.setProperty("jcr:mimeType", mimeType);
+        contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
+        contentNode.setProperty("jcr:data", url.openStream());
+
+        // Save the session ...
+        session.save();
+
+    }
+    
+    /**
+     * Get the sequencing statistics.
+     * 
+     * @return the statistics; never null
+     */
+    public SequencingService.Statistics getStatistics() {
+        return this.engine.getSequencingService().getStatistics();
+    }
+    
+    public void waitUntilSequencedNodesIs( int totalNumberOfNodesSequenced ) throws InterruptedException {
+        // check 50 times, waiting 0.1 seconds between (for a total of 5 seconds max) ...
+        long numFound = 0;
+        for (int i = 0; i != 50; i++) {
+            numFound = getStatistics().getNumberOfNodesSequenced();
+            if (numFound >= totalNumberOfNodesSequenced) {
+                return;
+            }
+            Thread.sleep(1000);
+        }
+        fail("Expected to find " + totalNumberOfNodesSequenced + " nodes sequenced, but found " + numFound);
+    }
+    
+    
+    public class MyCustomSecurityContext implements SecurityContext {
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.SecurityContext#getUserName()
+         */
+        public String getUserName() {
+            return "Fred";
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.SecurityContext#hasRole(java.lang.String)
+         */
+        public boolean hasRole( String roleName ) {
+            return true;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.SecurityContext#logout()
+         */
+        public void logout() {
+            // do something
+        }
+    }
+    
+    public void verifyChildNode(Node parentNode, String childNodeName, String propName, String expectedValue) throws Exception {
+        // Find child node
+        Node childNode = null;
+        for (NodeIterator iter = parentNode.getNodes(); iter.hasNext();) {
+            Node nextNode = iter.nextNode();
+            if( nextNode.getName().equals(childNodeName)) {
+                childNode = nextNode;
+                break;
+            }
+        }
+        if( childNode != null ) {
+            assertThat( childNode.hasProperty(propName), is(true));
+            verifySingleValueProperty(childNode, propName, expectedValue);
+            
+        } else {
+            fail("NODE: " + childNodeName + " not found");
+        }
+        
+    }
+    
+    public void verifyNode(Node topNode, String name, String propName) throws Exception {
+        Node node = findNode(topNode, name);
+        
+        if( node != null ) {
+            assertThat( node.hasProperty(propName), is(true));
+        } else {
+            fail("NODE: " + name + " not found");
+        }
+        
+    }
+    
+    public void verifySimpleStringProperty(Node node, String propName, String expectedValue) throws Exception {
+        assertThat( node.hasProperty(propName), is(true));
+        verifySingleValueProperty(node, propName, expectedValue);
+    }
+    
+    public void verifyNode(Node topNode, String name, String propName, String expectedValue) throws Exception {
+        Node node = findNode(topNode, name);
+        
+        if( node != null ) {
+            assertThat( node.hasProperty(propName), is(true));
+            verifySingleValueProperty(node, propName, expectedValue);
+            
+        } else {
+            fail("NODE: " + name + " not found");
+        }
+        
+    }
+    
+    public void verifyNode(Node topNode, String name, String propName, int expectedValue) throws Exception {
+        Node node = findNode(topNode, name);
+        
+        if( node != null ) {
+            assertThat( node.hasProperty(propName), is(true));
+            verifySingleValueProperty(node, propName, expectedValue);
+            
+        } else {
+            fail("NODE: " + name + " not found");
+        }
+        
+    }
+    
+    protected Value value( String value ) throws Exception {
+        return session.getValueFactory().createValue(value);
+    }
+    
+    public void verifySingleValueProperty(Node node, String propNameStr, String expectedValue) throws Exception {
+        Value expValue = value(expectedValue);
+        Property prop = node.getProperty(propNameStr);
+        if( prop.getDefinition().isMultiple()) {
+            boolean hasValue = false;
+            
+            Object[] values = prop.getValues();
+            for( Object val : values) {
+                if(val.equals(expValue)) {
+                    hasValue = true;
+                }
+            }
+            
+            assertThat(hasValue, is(true));
+        } else {
+            Object actualValue = prop.getValue();
+            assertThat(expValue, is(actualValue));
+        }
+        
+    }
+    
+   
+    public void verifySingleValueProperty(Node node, String propNameStr, int expectedValue) throws Exception {
+        Property prop = node.getProperty(propNameStr);
+        Value expValue = session.getValueFactory().createValue(expectedValue);
+        Object actualValue = prop.getValue();
+        assertThat(expValue, is(actualValue));
+        
+    }
+    
+    public void verifyMixin(Node topNode, String nodeName, String nodeType) throws Exception {
+        Node node = findNode(topNode, nodeName);
+        
+        if( node != null ) {
+            verifyMixin(node, nodeType);
+            
+        } else {
+            fail("NODE: " + nodeName + " not found");
+        }
+    }
+    
+    public boolean hasMixin(Node node, String nodeType) throws Exception { 
+        for( NodeType mixin : node.getMixinNodeTypes() ) {
+            String mixinName = mixin.getName();
+            if( mixinName.equals(nodeType) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    public void verifyMixin(Node node, String nodeType) throws Exception {
+        boolean foundMixin = hasMixin(node, nodeType);
+
+        
+        assertThat(foundMixin, is(true));
+    }
+    
+    public void verifyNodeType(Node topNode, String nodeName, String nodeTypeName) throws Exception {
+        Node node = findNode(topNode, nodeName);
+        
+        if( node != null ) {
+            assertThat(node.isNodeType(nodeTypeName), is(true));
+        } else {
+            fail("NODE: " + nodeName + " not found");
+        }
+        
+    }
+    
+    public void verifyNodeTypes(Node topNode, String nodeName, String nodeTypeName, String...moreNodeTypeNames) throws Exception {
+        Node node = findNode(topNode, nodeName);
+        
+        if( node != null ) {
+            assertThat(node.isNodeType(nodeTypeName), is(true));
+            for( String nextTypeName : moreNodeTypeNames ) {
+                assertThat(node.isNodeType(nextTypeName), is(true));
+            }
+        } else {
+            fail("NODE: " + nodeName + " not found");
+        }
+        
+    }
+    
+    public Node findNode(Node node, String name) throws Exception  {
+        if( node.getName().equals(name)) {
+            return node;
+        }
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            Node nextNode = iter.nextNode();
+            if( nextNode.getName().equals(name)) {
+                return nextNode;
+            }
+            Node someNode = findNode(nextNode, name);
+            if( someNode != null ) {
+                return someNode;
+            }
+        }
+        
+        return null;
+    }
+    
+    public Node findNode(Node node, String name, String type) throws Exception  {
+        if( node.getName().equals(name) && node.isNodeType(type)) { //(hasMixin(node, type) || node.isNodeType(type))) {
+            return node;
+        }
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            Node nextNode = iter.nextNode();
+            //String nextNodeName = nextNode.getName();
+            //boolean isNodeType = nextNode.isNodeType(type);
+            if( nextNode.getName().equals(name) && nextNode.isNodeType(type)) { //nextNodeName.equals(name) && isNodeType) { //(hasMixin(node, type) || node.isNodeType(type))) {
+                return nextNode;
+            }
+            Node someNode = findNode(nextNode, name, type);
+            if( someNode != null ) {
+                return someNode;
+            }
+        }
+        
+        return null;
+    }
+    
+    public void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+        
+        System.out.println("\n >>>  NODE PATH: " + node.getPath() );
+        System.out.println("           NAME: " + node.getName() + "\n" );
+
+        // Create a Properties object containing the properties for this node; ignore any children ...
+        //Properties props = new PropMyCustomSecurityContexterties();
+        for (PropertyIterator propertyIter = node.getProperties(); propertyIter.hasNext();) {
+            Property property = propertyIter.nextProperty();
+            String name = property.getName();
+            String stringValue = null;
+            if (property.getDefinition().isMultiple()) {
+                StringBuilder sb = new StringBuilder();
+                boolean first = true;
+                for (Value value : property.getValues()) {
+                    if (!first) {
+                        sb.append(", ");
+                        first = false;
+                    }
+                    sb.append(value.getString());
+                }
+                stringValue = sb.toString();
+            } else {
+                stringValue = property.getValue().getString();
+            }
+            System.out.println("   | PROP: " + name + "  VALUE: " + stringValue);
+            //props.put(name, stringValue);
+        }
+    }
+}


Property changes on: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -23,35 +23,16 @@
  */
 package org.jboss.dna.test.integration.sequencer.ddl;
 
-import static org.junit.Assert.assertNotNull;
-import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-import java.io.IOException;
+import static org.junit.Assert.assertNotNull;
 import java.net.URL;
-import java.util.Calendar;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.Value;
-import javax.jcr.ValueFormatException;
-import javax.jcr.nodetype.NodeType;
-import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.jcr.JcrConfiguration;
-import org.jboss.dna.jcr.JcrEngine;
 import org.jboss.dna.jcr.JcrTools;
 import org.jboss.dna.jcr.SecurityContextCredentials;
-import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.sequencer.ddl.StandardDdlLexicon;
-import org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon;
-import org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon;
-import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -59,11 +40,11 @@
 /**
  *
  */
-public class DdlSequencerIntegrationTest {
-    private JcrEngine engine;
-    private Session session;
-    private JcrTools tools;
-    private static final String cndDdlFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
+public class DdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
+//    private JcrEngine engine;
+//    private Session session;
+//    private JcrTools tools;
+//    private static final String cndDdlFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
     
     @Before
     public void beforeEach() throws Exception {
@@ -85,14 +66,8 @@
               .setProperty("defaultWorkspaceName", workspaceName);
         // Set up the JCR repository to use the source ...
         config.repository(repositoryName)
-            .addNodeTypes(getUrl(cndDdlFolder + "StandardDdl.cnd"))
-            .addNodeTypes(getUrl(cndDdlFolder + "DerbyDdl.cnd"))
-            .addNodeTypes(getUrl(cndDdlFolder + "OracleDdl.cnd"))
-            .addNodeTypes(getUrl(cndDdlFolder + "PostgresDdl.cnd"))
+            .addNodeTypes(getUrl(ddlTestResourceRootFolder + "StandardDdl.cnd"))
             .registerNamespace(StandardDdlLexicon.Namespace.PREFIX, StandardDdlLexicon.Namespace.URI)
-            .registerNamespace(DerbyDdlLexicon.Namespace.PREFIX, DerbyDdlLexicon.Namespace.URI)
-            .registerNamespace(OracleDdlLexicon.Namespace.PREFIX, OracleDdlLexicon.Namespace.URI)
-            .registerNamespace(PostgresDdlLexicon.Namespace.PREFIX, PostgresDdlLexicon.Namespace.URI)
             .setSource(repositorySource);
         // Set up the DDL sequencer ...
         config.sequencer("DDL Sequencer")
@@ -124,55 +99,10 @@
         }
     }
     
-    private void uploadFile(URL url) throws RepositoryException, IOException {
-        // Grab the last segment of the URL path, using it as the filename
-        String filename = url.getPath().replaceAll("([^/]*/)*", "");
-        String nodePath = "/a/b/" + filename;
-        String mimeType = "ddl";
-
-        // Now use the JCR API to upload the file ...
-
-
-        // Create the node at the supplied path ...
-        Node node = tools.findOrCreateNode(session.getRootNode(), nodePath, "nt:folder", "nt:file");
-
-        // Upload the file to that node ...
-        Node contentNode = tools.findOrCreateChild(node, "jcr:content", "nt:resource");
-        contentNode.setProperty("jcr:mimeType", mimeType);
-        contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
-        contentNode.setProperty("jcr:data", url.openStream());
-
-        // Save the session ...
-        session.save();
-
-    }
-    
-    /**
-     * Get the sequencing statistics.
-     * 
-     * @return the statistics; never null
-     */
-    public SequencingService.Statistics getStatistics() {
-        return this.engine.getSequencingService().getStatistics();
-    }
-    
-    protected void waitUntilSequencedNodesIs( int totalNumberOfNodesSequenced ) throws InterruptedException {
-        // check 50 times, waiting 0.1 seconds between (for a total of 5 seconds max) ...
-        long numFound = 0;
-        for (int i = 0; i != 50; i++) {
-            numFound = getStatistics().getNumberOfNodesSequenced();
-            if (numFound >= totalNumberOfNodesSequenced) {
-                return;
-            }
-            Thread.sleep(1000);
-        }
-        fail("Expected to find " + totalNumberOfNodesSequenced + " nodes sequenced, but found " + numFound);
-    }
-
     @Test
     public void shouldSequenceCreateSchemaDdlFile() throws Exception {
         System.out.println("STARTED:  shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
-        URL url = getUrl(cndDdlFolder + "create_schema.ddl");
+        URL url = getUrl(ddlTestResourceRootFolder + "create_schema.ddl");
         uploadFile(url);
         
         waitUntilSequencedNodesIs(1);
@@ -202,7 +132,7 @@
     @Test
     public void shouldSequenceStandardDdlFile() throws Exception {
         System.out.println("STARTED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
-        URL url = getUrl(cndDdlFolder + "standard_test_statements.ddl");
+        URL url = getUrl(ddlTestResourceRootFolder + "standard_test_statements.ddl");
         uploadFile(url);
         
         waitUntilSequencedNodesIs(1);
@@ -220,36 +150,18 @@
                     //printNodeProperties(ddlNode);
                     
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 11);
-                    
-                    //GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
-                    Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
-                    assertNotNull(granteeNode);
-                    Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
-                    verifySingleValueProperty(privNode, "ddl:type", "SELECT");
-                    
-                    //GRANT UPDATE, USAGE ON TABLE purchaseOrders TO anita,zhi;
-                    grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
-                    verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
-                    granteeNode = findNode(grantNode, "anita", "ddl:grantee");
-                    assertNotNull(granteeNode);
+                    assertEquals(numStatements, 7);
                 }
             }
         }
         
-        System.out.println("FINISHED:  shouldSequenceStandardDdlFile(create_schema.ddl)");
+        System.out.println("FINISHED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
     }
     
     @Test
-    public void shouldSequenceDerbyDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
-        URL url = getUrl(cndDdlFolder + "derby_test_statements.ddl");
+    public void shouldSequenceStandardDdlGrantStatements() throws Exception {
+        System.out.println("STARTED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
+        URL url = getUrl(ddlTestResourceRootFolder + "grant_test_statements.ddl");
         uploadFile(url);
         
         waitUntilSequencedNodesIs(1);
@@ -263,110 +175,40 @@
                 //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
                 for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
                     Node ddlNode = iter.nextNode();
+
+                    //printNodeProperties(ddlNode);
                     
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 64);
+                    assertEquals(numStatements, 4);
                     
-                    //printNodeProperties(ddlNode);
-                    
-                    verifyNode(ddlNode, "HOTELAVAILABILITY", "ddl:startLineNumber");
-                    verifyNode(ddlNode, "SAMP.DEPARTMENT", "ddl:expression");
-                    verifyNode(ddlNode, "HOTEL_ID", "ddl:datatypeName");
-                    verifyNode(ddlNode, "CITIES", "ddl:startLineNumber");
-                    
-                    // Create Function
-                    verifyNode(ddlNode, "PROPERTY_FILE_READER", "ddl:startLineNumber", 71);
-                    verifyNodeTypes(ddlNode, "PROPERTY_FILE_READER", 
-                                    "derbyddl:createFunctionStatement", 
-                                    "ddl:creatable", 
-                                    "derbyddl:functionOperand");
-                    verifyNode(ddlNode, "KEY_COL", "ddl:datatypeName", "VARCHAR");
-                    
-                    Node functionNode = findNode(ddlNode, "TO_DEGREES");
-                    assertNotNull(functionNode);
-                    verifyChildNode(functionNode, "parameterStyle", "ddl:value", "PARAMETER STYLE JAVA");
-                    
-                    // Create Index
-                    // CREATE INDEX IXSALE ON SAMP.SALES (SALES);
-                    Node indexNode = findNode(ddlNode, "IXSALE", "derbyddl:createIndexStatement");
-                    assertNotNull(indexNode);
-                    verifySimpleStringProperty(indexNode, "derbyddl:tableName", "SAMP.SALES");
-                    Node colRefNode = findNode(indexNode, "SALES");
-                    assertNotNull(colRefNode);
-                    colRefNode = findNode(ddlNode, "SALES", "derbyddl:indexColumnReference");
-                    assertNotNull(colRefNode);
-                    verifyNodeTypes(colRefNode, "SALES", 
-                                    "derbyddl:indexColumnReference", 
-                                    "ddl:columnReference", 
-                                    "ddl:referenceOperand");
-                    
-                    // declare global temporary table SESSION.t1(c11 int) not logged;
-                    Node ttNode = findNode(ddlNode, "SESSION.t1", "derbyddl:declareGlobalTemporaryTableStatement");
-                    assertNotNull(ttNode);
-                    Node colNode = findNode(ttNode, "c11");
-                    assertNotNull(colNode);
-                    verifySimpleStringProperty(colNode, "ddl:datatypeName", "int");
-                    
-                    // LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
-                    Node lockNode = findNode(ddlNode, "FlightAvailability", "derbyddl:lockTableStatement");
-                    assertNotNull(lockNode);
-                    Node optionNode = findNode(lockNode, "lockMode");
-                    assertNotNull(optionNode);
-                    verifySimpleStringProperty(optionNode, "ddl:value", "EXCLUSIVE");
-                    
-                    // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT
-                    Node renameTableNode = findNode(ddlNode, "SAMP.EMP_ACT", "derbyddl:renameTableStatement");
-                    assertNotNull(renameTableNode);
-                    verifySimpleStringProperty(renameTableNode, "ddl:newName", "EMPLOYEE_ACT");
-                    
-                    // CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;
-                    Node synonymNode = findNode(ddlNode, "SAMP.T1", "derbyddl:createSynonymStatement");
-                    assertNotNull(synonymNode);
-                    verifySimpleStringProperty(synonymNode, "derbyddl:tableName", "SAMP.TABLEWITHLONGNAME");
-                    
-                    //CREATE TRIGGER FLIGHTSDELETE3
-                    //   AFTER DELETE ON FLIGHTS
-                    //   REFERENCING OLD AS OLD
-                    //   FOR EACH ROW 
-                    //   DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
-                    Node triggerNode = findNode(ddlNode, "FLIGHTSDELETE3", "derbyddl:createTriggerStatement");
-                    assertNotNull(triggerNode);
-                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "FLIGHTS");
-                    
-                    //CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
-                    //   FOR EACH ROW MODE DB2SQL
-                    //   values app.notifyEmail('Jerry', 'Table x is about to be updated');
-                    triggerNode = findNode(ddlNode, "t1", "derbyddl:createTriggerStatement");
-                    assertNotNull(triggerNode);
-                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "x");
-                    optionNode = findNode(triggerNode, "forEach");
-                    assertNotNull(optionNode);
-                    verifySimpleStringProperty(optionNode, "ddl:value", "FOR EACH ROW");
-                    optionNode = findNode(triggerNode, "eventType");
-                    assertNotNull(optionNode);
-                    verifySimpleStringProperty(optionNode, "ddl:value", "UPDATE");
-                    
-                    //GRANT EXECUTE ON PROCEDURE p TO george;
-                    Node grantNode = findNode(ddlNode, "p", "derbyddl:grantOnProcedureStatement");
+                    //GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
+                    Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
                     assertNotNull(grantNode);
+                    Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
+                    assertNotNull(granteeNode);
+                    Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
-                    //GRANT purchases_reader_role TO george,maria;
-                    grantNode = findNode(ddlNode, "grantRoles", "derbyddl:grantRolesStatement");
+                    //GRANT UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi;
+                    grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
                     assertNotNull(grantNode);
-                    Node roleNode = findNode(grantNode, "george", "ddl:grantee");
-                    assertNotNull(roleNode);
-                    
+                    privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
+                    granteeNode = findNode(grantNode, "anita", "ddl:grantee");
+                    assertNotNull(granteeNode);
                 }
             }
         }
         
-        System.out.println("FINISHED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
+        System.out.println("FINISHED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
     }
     
     @Test
-    public void shouldSequenceOracleDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
-        URL url = getUrl(cndDdlFolder + "oracle_test_statements.ddl");
+    public void shouldSequenceStandardDdlRevokeStatements() throws Exception {
+        System.out.println("STARTED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
+        URL url = getUrl(ddlTestResourceRootFolder + "revoke_test_statements.ddl");
         uploadFile(url);
         
         waitUntilSequencedNodesIs(1);
@@ -380,335 +222,34 @@
                 //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
                 for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
                     Node ddlNode = iter.nextNode();
-                    
-                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 50);
-                    
+
                     //printNodeProperties(ddlNode);
                     
-                    verifyNode(ddlNode, "address", "ddl:startLineNumber");
-                    verifyNode(ddlNode, "cust_orders", "ddl:expression");
-                    verifyMixin(ddlNode, "cust_orders", "oracleddl:createIndexStatement");
-                    verifyNodeType(ddlNode, "cust_orders", "oracleddl:createIndexStatement");
-                    verifyNodeType(ddlNode, "cust_orders", "ddl:creatable");
-                    verifyNode(ddlNode, "cust_orders", "ddl:startCharIndex", 1698);
-                    verifyNode(ddlNode, "customers_dim", "ddl:startColumnNumber");
-                }
-            }
-        }
-        
-        System.out.println("FINISHED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
-    }
-    
-    @Test
-    public void shouldSequencePostgresDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
-        URL url = getUrl(cndDdlFolder + "postgres_test_statements.ddl");
-        uploadFile(url);
-        
-        waitUntilSequencedNodesIs(1);
-        
-        // Find the node ...
-        Node root = session.getRootNode();
-
-        if (root.hasNode("ddls") ) {
-            if (root.hasNode("ddls")) {
-                Node ddlsNode = root.getNode("ddls");
-                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
-                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
-                    Node ddlNode = iter.nextNode();
-                    
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 106);
+                    assertEquals(numStatements, 4);
                     
-                    //printNodeProperties(ddlNode);
+                    //REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;
+                    Node revokeNode = findNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
+                    assertNotNull(revokeNode);
+                    Node granteeNode = findNode(revokeNode, "maria", "ddl:grantee");
+                    assertNotNull(granteeNode);
+                    Node privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
-                    verifyNodeType(ddlNode, "increment", "postgresddl:createFunctionStatement");
-                    verifyNode(ddlNode, "increment", "ddl:expression");
-                    verifyNodeType(ddlNode, "increment", "ddl:creatable");
-                    verifyNodeType(ddlNode, "increment", "postgresddl:functionOperand");
-                    verifyNode(ddlNode, "increment", "ddl:startLineNumber", 214);
-                    verifyNode(ddlNode, "increment", "ddl:startCharIndex", 7604);
-                    
-                    
-                    //COMMENT ON FUNCTION my_function (timestamp) IS ?Returns Roman Numeral?;
-                    verifyNodeType(ddlNode, "my_function", "postgresddl:commentOnStatement");
-                    verifyNode(ddlNode, "my_function", "ddl:expression");
-                    verifyNodeType(ddlNode, "my_function", "postgresddl:commentOperand");
-                    verifyNode(ddlNode, "my_function", "ddl:startLineNumber", 44);
-                    verifyNode(ddlNode, "my_function", "ddl:startCharIndex", 1573);
-                    verifyNode(ddlNode, "my_function", "postgresddl:comment", "'Returns Roman Numeral'");
-                    
-                    //ALTER TABLE foreign_companies RENAME COLUMN address TO city;
-                    Node alterTableNode = findNode(ddlNode, "foreign_companies", "postgresddl:alterTableStatement");
-                    assertNotNull(alterTableNode);
-                    Node renameColNode = findNode(alterTableNode, "address","postgresddl:renamedColumn");
-                    assertNotNull(renameColNode);
-                    verifySingleValueProperty(renameColNode, "ddl:newName", "city");
-                    
-                    //GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
-                    Node grantNode = findNode(ddlNode, "divideByTwo", "postgresddl:grantOnFunctionStatement");
-                    assertNotNull(grantNode);
-                    Node parameter_1 = findNode(grantNode, "numerator","postgresddl:functionParameter");
-                    assertNotNull(parameter_1);
-                    verifySingleValueProperty(parameter_1, "ddl:datatypeName", "int");
+                    //REVOKE UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi CASCADE;
+                    revokeNode = findNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
+                    assertNotNull(revokeNode);
+                    privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
+                    assertNotNull(privNode);
+                    verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
+                    granteeNode = findNode(revokeNode, "anita", "ddl:grantee");
+                    assertNotNull(granteeNode);
                 }
             }
         }
         
-        System.out.println("FINISHED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
+        System.out.println("FINISHED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
     }
-    
-    protected class MyCustomSecurityContext implements SecurityContext {
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.graph.SecurityContext#getUserName()
-         */
-        public String getUserName() {
-            return "Fred";
-        }
 
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.graph.SecurityContext#hasRole(java.lang.String)
-         */
-        public boolean hasRole( String roleName ) {
-            return true;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.graph.SecurityContext#logout()
-         */
-        public void logout() {
-            // do something
-        }
-    }
-    
-    public void printNodeProperties(Node node) throws Exception {
-        printProperties(node);
-        
-        for (NodeIterator iter = node.getNodes(); iter.hasNext();) { 
-            printNodeProperties(iter.nextNode());
-        }
-         
-    }
-    
-    private void verifyChildNode(Node parentNode, String childNodeName, String propName, String expectedValue) throws Exception {
-        // Find child node
-        Node childNode = null;
-        for (NodeIterator iter = parentNode.getNodes(); iter.hasNext();) {
-            Node nextNode = iter.nextNode();
-            if( nextNode.getName().equals(childNodeName)) {
-                childNode = nextNode;
-                break;
-            }
-        }
-        if( childNode != null ) {
-            assertThat( childNode.hasProperty(propName), is(true));
-            verifySingleValueProperty(childNode, propName, expectedValue);
-            
-        } else {
-            fail("NODE: " + childNodeName + " not found");
-        }
-        
-    }
-    
-    private void verifyNode(Node topNode, String name, String propName) throws Exception {
-        Node node = findNode(topNode, name);
-        
-        if( node != null ) {
-            assertThat( node.hasProperty(propName), is(true));
-        } else {
-            fail("NODE: " + name + " not found");
-        }
-        
-    }
-    
-    private void verifySimpleStringProperty(Node node, String propName, String expectedValue) throws Exception {
-        assertThat( node.hasProperty(propName), is(true));
-        verifySingleValueProperty(node, propName, expectedValue);
-    }
-    
-    private void verifyNode(Node topNode, String name, String propName, String expectedValue) throws Exception {
-        Node node = findNode(topNode, name);
-        
-        if( node != null ) {
-            assertThat( node.hasProperty(propName), is(true));
-            verifySingleValueProperty(node, propName, expectedValue);
-            
-        } else {
-            fail("NODE: " + name + " not found");
-        }
-        
-    }
-    
-    private void verifyNode(Node topNode, String name, String propName, int expectedValue) throws Exception {
-        Node node = findNode(topNode, name);
-        
-        if( node != null ) {
-            assertThat( node.hasProperty(propName), is(true));
-            verifySingleValueProperty(node, propName, expectedValue);
-            
-        } else {
-            fail("NODE: " + name + " not found");
-        }
-        
-    }
-    
-    protected Value value( String value ) throws Exception {
-        return session.getValueFactory().createValue(value);
-    }
-    
-    private void verifySingleValueProperty(Node node, String propNameStr, String expectedValue) throws Exception {
-        Value expValue = value(expectedValue);
-        Property prop = node.getProperty(propNameStr);
-        if( prop.getDefinition().isMultiple()) {
-            boolean hasValue = false;
-            
-            Object[] values = prop.getValues();
-            for( Object val : values) {
-                if(val.equals(expValue)) {
-                    hasValue = true;
-                }
-            }
-            
-            assertThat(hasValue, is(true));
-        } else {
-            Object actualValue = prop.getValue();
-            assertThat(expValue, is(actualValue));
-        }
-        
-    }
-    
-   
-    private void verifySingleValueProperty(Node node, String propNameStr, int expectedValue) throws Exception {
-        Property prop = node.getProperty(propNameStr);
-        Value expValue = session.getValueFactory().createValue(expectedValue);
-        Object actualValue = prop.getValue();
-        assertThat(expValue, is(actualValue));
-        
-    }
-    
-    private void verifyMixin(Node topNode, String nodeName, String nodeType) throws Exception {
-        Node node = findNode(topNode, nodeName);
-        
-        if( node != null ) {
-            verifyMixin(node, nodeType);
-            
-        } else {
-            fail("NODE: " + nodeName + " not found");
-        }
-    }
-    
-    private boolean hasMixin(Node node, String nodeType) throws Exception { 
-        for( NodeType mixin : node.getMixinNodeTypes() ) {
-            String mixinName = mixin.getName();
-            if( mixinName.equals(nodeType) ) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    private void verifyMixin(Node node, String nodeType) throws Exception {
-        boolean foundMixin = hasMixin(node, nodeType);
-
-        
-        assertThat(foundMixin, is(true));
-    }
-    
-    private void verifyNodeType(Node topNode, String nodeName, String nodeTypeName) throws Exception {
-        Node node = findNode(topNode, nodeName);
-        
-        if( node != null ) {
-            assertThat(node.isNodeType(nodeTypeName), is(true));
-        } else {
-            fail("NODE: " + nodeName + " not found");
-        }
-        
-    }
-    
-    private void verifyNodeTypes(Node topNode, String nodeName, String nodeTypeName, String...moreNodeTypeNames) throws Exception {
-        Node node = findNode(topNode, nodeName);
-        
-        if( node != null ) {
-            assertThat(node.isNodeType(nodeTypeName), is(true));
-            for( String nextTypeName : moreNodeTypeNames ) {
-                assertThat(node.isNodeType(nextTypeName), is(true));
-            }
-        } else {
-            fail("NODE: " + nodeName + " not found");
-        }
-        
-    }
-    
-    private Node findNode(Node node, String name) throws Exception  {
-        if( node.getName().equals(name)) {
-            return node;
-        }
-        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
-            Node nextNode = iter.nextNode();
-            if( nextNode.getName().equals(name)) {
-                return nextNode;
-            }
-            Node someNode = findNode(nextNode, name);
-            if( someNode != null ) {
-                return someNode;
-            }
-        }
-        
-        return null;
-    }
-    
-    private Node findNode(Node node, String name, String type) throws Exception  {
-        if( node.getName().equals(name) && node.isNodeType(type)) { //(hasMixin(node, type) || node.isNodeType(type))) {
-            return node;
-        }
-        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
-            Node nextNode = iter.nextNode();
-            if( nextNode.getName().equals(name) && node.isNodeType(type)) { //(hasMixin(node, type) || node.isNodeType(type))) {
-                return nextNode;
-            }
-            Node someNode = findNode(nextNode, name, type);
-            if( someNode != null ) {
-                return someNode;
-            }
-        }
-        
-        return null;
-    }
-    
-    private void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
-        
-        System.out.println("\n >>>  NODE PATH: " + node.getPath() );
-        System.out.println("           NAME: " + node.getName() + "\n" );
-
-        // Create a Properties object containing the properties for this node; ignore any children ...
-        //Properties props = new Properties();
-        for (PropertyIterator propertyIter = node.getProperties(); propertyIter.hasNext();) {
-            Property property = propertyIter.nextProperty();
-            String name = property.getName();
-            String stringValue = null;
-            if (property.getDefinition().isMultiple()) {
-                StringBuilder sb = new StringBuilder();
-                boolean first = true;
-                for (Value value : property.getValues()) {
-                    if (!first) {
-                        sb.append(", ");
-                        first = false;
-                    }
-                    sb.append(value.getString());
-                }
-                stringValue = sb.toString();
-            } else {
-                stringValue = property.getValue().getString();
-            }
-            System.out.println("   | PROP: " + name + "  VALUE: " + stringValue);
-            //props.put(name, stringValue);
-        }
-    }
 }

Added: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,220 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.test.integration.sequencer.ddl.dialect.derby;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.net.URL;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.jcr.JcrConfiguration;
+import org.jboss.dna.jcr.JcrTools;
+import org.jboss.dna.jcr.SecurityContextCredentials;
+import org.jboss.dna.sequencer.ddl.StandardDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon;
+import org.jboss.dna.test.integration.sequencer.ddl.DdlIntegrationTestUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author blafond
+ *
+ */
+public class DerbyDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
+    private String resourceFolder = ddlTestResourceRootFolder + "/dialect/derby/";
+    
+    @Before
+    public void beforeEach() throws Exception {
+        // Configure the DNA configuration. This could be done by loading a configuration from a file, or by
+        // using a (local or remote) configuration repository, or by setting up the configuration programmatically.
+        // This test uses the programmatic approach...
+        
+        tools = new JcrTools();
+        
+        String repositoryName = "ddlRepository";
+        String workspaceName = "default";
+        String repositorySource = "ddlRepositorySource";
+        
+        JcrConfiguration config = new JcrConfiguration();
+        // Set up the in-memory source where we'll upload the content and where the sequenced output will be stored ...
+        config.repositorySource(repositorySource)
+              .usingClass(InMemoryRepositorySource.class)
+              .setDescription("The repository for our content")
+              .setProperty("defaultWorkspaceName", workspaceName);
+        // Set up the JCR repository to use the source ..protected.
+        config.repository(repositoryName)
+            .addNodeTypes(getUrl(ddlTestResourceRootFolder + "StandardDdl.cnd"))
+            .addNodeTypes(getUrl(resourceFolder + "DerbyDdl.cnd"))
+            .registerNamespace(StandardDdlLexicon.Namespace.PREFIX, StandardDdlLexicon.Namespace.URI)
+            .registerNamespace(DerbyDdlLexicon.Namespace.PREFIX, DerbyDdlLexicon.Namespace.URI)
+            .setSource(repositorySource);
+        // Set up the DDL sequencer ...
+        config.sequencer("DDL Sequencer")
+            .usingClass("org.jboss.dna.sequencer.ddl.DdlSequencer")
+            .loadedFromClasspath()
+            .setDescription("Sequences DDL files to extract individual statements and accompanying statement properties and values")
+            .sequencingFrom("//(*.(ddl)[*])/jcr:content[@jcr:data]")
+            .andOutputtingTo("/ddls/$1"); 
+        config.save();
+        this.engine = config.build();
+        this.engine.start();
+
+        this.session = this.engine.getRepository(repositoryName)
+                                  .login(new SecurityContextCredentials(new MyCustomSecurityContext()), workspaceName);
+
+    }
+
+    private URL getUrl(String urlStr) {
+        return this.getClass().getClassLoader().getResource(urlStr);
+    }
+
+    @After
+    public void afterEach() throws Exception {
+        if (this.session != null) {
+            this.session.logout();
+        }
+        if (this.engine != null) {
+            this.engine.shutdown();
+        }
+    }
+    
+    @Test
+    public void shouldSequenceDerbyDdlFile() throws Exception {
+        System.out.println("STARTED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
+        URL url = getUrl(resourceFolder + "derby_test_statements.ddl");
+        uploadFile(url);
+        
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 64);
+                    
+                    //printNodeProperties(ddlNode);
+                    
+                    verifyNode(ddlNode, "HOTELAVAILABILITY", "ddl:startLineNumber");
+                    verifyNode(ddlNode, "SAMP.DEPARTMENT", "ddl:expression");
+                    verifyNode(ddlNode, "HOTEL_ID", "ddl:datatypeName");
+                    verifyNode(ddlNode, "CITIES", "ddl:startLineNumber");
+                    
+                    // Create Function
+                    verifyNode(ddlNode, "PROPERTY_FILE_READER", "ddl:startLineNumber", 71);
+                    verifyNodeTypes(ddlNode, "PROPERTY_FILE_READER", 
+                                    "derbyddl:createFunctionStatement", 
+                                    "ddl:creatable", 
+                                    "derbyddl:functionOperand");
+                    verifyNode(ddlNode, "KEY_COL", "ddl:datatypeName", "VARCHAR");
+                    
+                    Node functionNode = findNode(ddlNode, "TO_DEGREES");
+                    assertNotNull(functionNode);
+                    verifyChildNode(functionNode, "parameterStyle", "ddl:value", "PARAMETER STYLE JAVA");
+                    
+                    // Create Index
+                    // CREATE INDEX IXSALE ON SAMP.SALES (SALES);
+                    Node indexNode = findNode(ddlNode, "IXSALE", "derbyddl:createIndexStatement");
+                    assertNotNull(indexNode);
+                    verifySimpleStringProperty(indexNode, "derbyddl:tableName", "SAMP.SALES");
+                    Node colRefNode = findNode(indexNode, "SALES");
+                    assertNotNull(colRefNode);
+                    colRefNode = findNode(ddlNode, "SALES", "derbyddl:indexColumnReference");
+                    assertNotNull(colRefNode);
+                    verifyNodeTypes(colRefNode, "SALES", 
+                                    "derbyddl:indexColumnReference", 
+                                    "ddl:columnReference", 
+                                    "ddl:referenceOperand");
+                    
+                    // declare global temporary table SESSION.t1(c11 int) not logged;
+                    Node ttNode = findNode(ddlNode, "SESSION.t1", "derbyddl:declareGlobalTemporaryTableStatement");
+                    assertNotNull(ttNode);
+                    Node colNode = findNode(ttNode, "c11");
+                    assertNotNull(colNode);
+                    verifySimpleStringProperty(colNode, "ddl:datatypeName", "int");
+                    
+                    // LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
+                    Node lockNode = findNode(ddlNode, "FlightAvailability", "derbyddl:lockTableStatement");
+                    assertNotNull(lockNode);
+                    Node optionNode = findNode(lockNode, "lockMode");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "EXCLUSIVE");
+                    
+                    // RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT
+                    Node renameTableNode = findNode(ddlNode, "SAMP.EMP_ACT", "derbyddl:renameTableStatement");
+                    assertNotNull(renameTableNode);
+                    verifySimpleStringProperty(renameTableNode, "ddl:newName", "EMPLOYEE_ACT");
+                    
+                    // CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;
+                    Node synonymNode = findNode(ddlNode, "SAMP.T1", "derbyddl:createSynonymStatement");
+                    assertNotNull(synonymNode);
+                    verifySimpleStringProperty(synonymNode, "derbyddl:tableName", "SAMP.TABLEWITHLONGNAME");
+                    
+                    //CREATE TRIGGER FLIGHTSDELETE3
+                    //   AFTER DELETE ON FLIGHTS
+                    //   REFERENCING OLD AS OLD
+                    //   FOR EACH ROW 
+                    //   DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
+                    Node triggerNode = findNode(ddlNode, "FLIGHTSDELETE3", "derbyddl:createTriggerStatement");
+                    assertNotNull(triggerNode);
+                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "FLIGHTS");
+                    
+                    //CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+                    //   FOR EACH ROW MODE DB2SQL
+                    //   values app.notifyEmail('Jerry', 'Table x is about to be updated');
+                    triggerNode = findNode(ddlNode, "t1", "derbyddl:createTriggerStatement");
+                    assertNotNull(triggerNode);
+                    verifySimpleStringProperty(triggerNode, "derbyddl:tableName", "x");
+                    optionNode = findNode(triggerNode, "forEach");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "FOR EACH ROW");
+                    optionNode = findNode(triggerNode, "eventType");
+                    assertNotNull(optionNode);
+                    verifySimpleStringProperty(optionNode, "ddl:value", "UPDATE");
+                    
+                    //GRANT EXECUTE ON PROCEDURE p TO george;
+                    Node grantNode = findNode(ddlNode, "p", "derbyddl:grantOnProcedureStatement");
+                    assertNotNull(grantNode);
+                    
+                    //GRANT purchases_reader_role TO george,maria;
+                    grantNode = findNode(ddlNode, "grantRoles", "derbyddl:grantRolesStatement");
+                    assertNotNull(grantNode);
+                    Node roleNode = findNode(grantNode, "george", "ddl:grantee");
+                    assertNotNull(roleNode);
+                    
+                }
+            }
+        }
+        
+        System.out.println("FINISHED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
+    }
+}


Property changes on: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,140 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.test.integration.sequencer.ddl.dialect.oracle;
+
+import static org.junit.Assert.assertEquals;
+import java.net.URL;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.jcr.JcrConfiguration;
+import org.jboss.dna.jcr.JcrTools;
+import org.jboss.dna.jcr.SecurityContextCredentials;
+import org.jboss.dna.sequencer.ddl.StandardDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon;
+import org.jboss.dna.test.integration.sequencer.ddl.DdlIntegrationTestUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author blafond
+ *
+ */
+public class OracleDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
+    private String resourceFolder = ddlTestResourceRootFolder + "/dialect/oracle/";
+    
+    @Before
+    public void beforeEach() throws Exception {
+        // Configure the DNA configuration. This could be done by loading a configuration from a file, or by
+        // using a (local or remote) configuration repository, or by setting up the configuration programmatically.
+        // This test uses the programmatic approach...
+        
+        tools = new JcrTools();
+        
+        String repositoryName = "ddlRepository";
+        String workspaceName = "default";
+        String repositorySource = "ddlRepositorySource";
+        
+        JcrConfiguration config = new JcrConfiguration();
+        // Set up the in-memory source where we'll upload the content and where the sequenced output will be stored ...
+        config.repositorySource(repositorySource)
+              .usingClass(InMemoryRepositorySource.class)
+              .setDescription("The repository for our content")
+              .setProperty("defaultWorkspaceName", workspaceName);
+        // Set up the JCR repository to use the source ...
+        config.repository(repositoryName)
+            .addNodeTypes(getUrl(ddlTestResourceRootFolder + "StandardDdl.cnd"))
+            .addNodeTypes(getUrl(resourceFolder + "OracleDdl.cnd"))
+            .registerNamespace(StandardDdlLexicon.Namespace.PREFIX, StandardDdlLexicon.Namespace.URI)
+            .registerNamespace(OracleDdlLexicon.Namespace.PREFIX, OracleDdlLexicon.Namespace.URI)
+            .setSource(repositorySource);
+        // Set up the DDL sequencer ...
+        config.sequencer("DDL Sequencer")
+            .usingClass("org.jboss.dna.sequencer.ddl.DdlSequencer")
+            .loadedFromClasspath()
+            .setDescription("Sequences DDL files to extract individual statements and accompanying statement properties and values")
+            .sequencingFrom("//(*.(ddl)[*])/jcr:content[@jcr:data]")
+            .andOutputtingTo("/ddls/$1"); 
+        config.save();
+        this.engine = config.build();
+        this.engine.start();
+
+        this.session = this.engine.getRepository(repositoryName)
+                                  .login(new SecurityContextCredentials(new MyCustomSecurityContext()), workspaceName);
+
+    }
+
+    private URL getUrl(String urlStr) {
+        return this.getClass().getClassLoader().getResource(urlStr);
+    }
+
+    @After
+    public void afterEach() throws Exception {
+        if (this.session != null) {
+            this.session.logout();
+        }
+        if (this.engine != null) {
+            this.engine.shutdown();
+        }
+    }
+    
+    
+    @Test
+    public void shouldSequenceOracleDdlFile() throws Exception {
+        System.out.println("STARTED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
+        URL url = getUrl(resourceFolder + "oracle_test_statements.ddl");
+        uploadFile(url);
+        
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 50);
+                    
+                    //printNodeProperties(ddlNode);
+                    
+                    verifyNode(ddlNode, "address", "ddl:startLineNumber");
+                    verifyNode(ddlNode, "cust_orders", "ddl:expression");
+                    verifyMixin(ddlNode, "cust_orders", "oracleddl:createIndexStatement");
+                    verifyNodeType(ddlNode, "cust_orders", "oracleddl:createIndexStatement");
+                    verifyNodeType(ddlNode, "cust_orders", "ddl:creatable");
+                    verifyNode(ddlNode, "cust_orders", "ddl:startCharIndex", 1698);
+                    verifyNode(ddlNode, "customers_dim", "ddl:startColumnNumber");
+                }
+            }
+        }
+        
+        System.out.println("FINISHED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
+    }
+}


Property changes on: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,161 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.test.integration.sequencer.ddl.dialect.postgres;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.net.URL;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.jcr.JcrConfiguration;
+import org.jboss.dna.jcr.JcrTools;
+import org.jboss.dna.jcr.SecurityContextCredentials;
+import org.jboss.dna.sequencer.ddl.StandardDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
+import org.jboss.dna.test.integration.sequencer.ddl.DdlIntegrationTestUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class PostgresDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
+    private String resourceFolder = ddlTestResourceRootFolder + "/dialect/postgres/";
+    
+    @Before
+    public void beforeEach() throws Exception {
+        // Configure the DNA configuration. This could be done by loading a configuration from a file, or by
+        // using a (local or remote) configuration repository, or by setting up the configuration programmatically.
+        // This test uses the programmatic approach...
+        
+        tools = new JcrTools();
+        
+        String repositoryName = "ddlRepository";
+        String workspaceName = "default";
+        String repositorySource = "ddlRepositorySource";
+        
+        JcrConfiguration config = new JcrConfiguration();
+        // Set up the in-memory source where we'll upload the content and where the sequenced output will be stored ...
+        config.repositorySource(repositorySource)
+              .usingClass(InMemoryRepositorySource.class)
+              .setDescription("The repository for our content")
+              .setProperty("defaultWorkspaceName", workspaceName);
+        // Set up the JCR repository to use the source ...
+        config.repository(repositoryName)
+            .addNodeTypes(getUrl(ddlTestResourceRootFolder + "StandardDdl.cnd"))
+            .addNodeTypes(getUrl(resourceFolder + "PostgresDdl.cnd"))
+            .registerNamespace(StandardDdlLexicon.Namespace.PREFIX, StandardDdlLexicon.Namespace.URI)
+            .registerNamespace(PostgresDdlLexicon.Namespace.PREFIX, PostgresDdlLexicon.Namespace.URI)
+            .setSource(repositorySource);
+        // Set up the DDL sequencer ...
+        config.sequencer("DDL Sequencer")
+            .usingClass("org.jboss.dna.sequencer.ddl.DdlSequencer")
+            .loadedFromClasspath()
+            .setDescription("Sequences DDL files to extract individual statements and accompanying statement properties and values")
+            .sequencingFrom("//(*.(ddl)[*])/jcr:content[@jcr:data]")
+            .andOutputtingTo("/ddls/$1"); 
+        config.save();
+        this.engine = config.build();
+        this.engine.start();
+
+        this.session = this.engine.getRepository(repositoryName)
+                                  .login(new SecurityContextCredentials(new MyCustomSecurityContext()), workspaceName);
+
+    }
+
+    private URL getUrl(String urlStr) {
+        return this.getClass().getClassLoader().getResource(urlStr);
+    }
+
+    @After
+    public void afterEach() throws Exception {
+        if (this.session != null) {
+            this.session.logout();
+        }
+        if (this.engine != null) {
+            this.engine.shutdown();
+        }
+    }
+    
+    @Test
+    public void shouldSequencePostgresDdlFile() throws Exception {
+        System.out.println("STARTED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
+        URL url = getUrl(resourceFolder + "postgres_test_statements.ddl");
+        uploadFile(url);
+        
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 106);
+                    
+                    //printNodeProperties(ddlNode);
+                    
+                    verifyNodeType(ddlNode, "increment", "postgresddl:createFunctionStatement");
+                    verifyNode(ddlNode, "increment", "ddl:expression");
+                    verifyNodeType(ddlNode, "increment", "ddl:creatable");
+                    verifyNodeType(ddlNode, "increment", "postgresddl:functionOperand");
+                    verifyNode(ddlNode, "increment", "ddl:startLineNumber", 214);
+                    verifyNode(ddlNode, "increment", "ddl:startCharIndex", 7604);
+                    
+                    
+                    //COMMENT ON FUNCTION my_function (timestamp) IS ?Returns Roman Numeral?;
+                    verifyNodeType(ddlNode, "my_function", "postgresddl:commentOnStatement");
+                    verifyNode(ddlNode, "my_function", "ddl:expression");
+                    verifyNodeType(ddlNode, "my_function", "postgresddl:commentOperand");
+                    verifyNode(ddlNode, "my_function", "ddl:startLineNumber", 44);
+                    verifyNode(ddlNode, "my_function", "ddl:startCharIndex", 1573);
+                    verifyNode(ddlNode, "my_function", "postgresddl:comment", "'Returns Roman Numeral'");
+                    
+                    //ALTER TABLE foreign_companies RENAME COLUMN address TO city;
+                    Node alterTableNode = findNode(ddlNode, "foreign_companies", "postgresddl:alterTableStatement");
+                    assertNotNull(alterTableNode);
+                    Node renameColNode = findNode(alterTableNode, "address","postgresddl:renamedColumn");
+                    assertNotNull(renameColNode);
+                    verifySingleValueProperty(renameColNode, "ddl:newName", "city");
+                    
+                    //GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
+                    Node grantNode = findNode(ddlNode, "divideByTwo", "postgresddl:grantOnFunctionStatement");
+                    assertNotNull(grantNode);
+                    Node parameter_1 = findNode(grantNode, "numerator","postgresddl:functionParameter");
+                    assertNotNull(parameter_1);
+                    verifySingleValueProperty(parameter_1, "ddl:datatypeName", "int");
+                }
+            }
+        }
+        
+        System.out.println("FINISHED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
+    }
+}


Property changes on: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,102 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[derbyddl:functionOperand]  > ddl:operand abstract
-[derbyddl:indexOperand]     > ddl:operand abstract
-[derbyddl:procedureOperand] > ddl:operand abstract
-[derbyddl:roleOperand]      > ddl:operand abstract
-[derbyddl:synonymOperand]   > ddl:operand abstract
-[derbyddl:triggerOperand]   > ddl:operand abstract
-
-[derbyddl:roleName]         > derbyddl:roleOperand mixin
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[derbyddl:columnDefinition] > ddl:columnDefinition mixin
-  - derbyddl:dropDefault (boolean)
-  
-[derbyddl:functionParameter] > ddl:columnDefinition mixin
-
-[derbyddl:indexColumnReference] > ddl:columnReference mixin
-  - derbyddl:order (STRING)
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:isTableType (boolean)
-  + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
-  + * (ddl:statementOption) = ddl:statementOption multiple
-[derbyddl:createIndexStatement]        > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
-  - derbyddl:tableName (string) mandatory
-  - derbyddl:unique (boolean)
-  + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
-[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
-[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
-[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
-  - derbyddl:tableName (string) mandatory
-[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
-  - derbyddl:tableName (string) mandatory
-  - ddl:sql (string) mandatory
-  + * (ddl:columnReference) = ddl:columnreference multiple
-[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
-[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
-[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
-[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
-[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
-[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-[derbyddl:lockTableStatement]       > ddl:statement, ddl:tableOperand mixin
-[derbyddl:renameTableStatement]     > ddl:statement, ddl:renamable, ddl:tableOperand mixin
-
-[derbyddl:grantOnFunctionStatement]     > ddl:grantStatement, derbyddl:functionOperand mixin
-[derbyddl:grantOnProcedureStatement]    > ddl:grantStatement, derbyddl:procedureOperand mixin
-
-[derbyddl:grantRolesStatement]          > ddl:grantStatement mixin
-  + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/OracleDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/OracleDdl.cnd	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/OracleDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,202 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[oracleddl:clusterOperand]      > ddl:operand abstract
-[oracleddl:commentOperand]      > ddl:operand abstract
-[oracleddl:contextOperand]      > ddl:operand abstract
-[oracleddl:controlfileOperand]  > ddl:operand abstract
-[oracleddl:databaseOperand]     > ddl:operand abstract
-[oracleddl:dimensionOperand]    > ddl:operand abstract
-[oracleddl:directoryOperand]    > ddl:operand abstract
-[oracleddl:diskgroupOperand]    > ddl:operand abstract
-[oracleddl:functionOperand]     > ddl:operand abstract
-[oracleddl:indexOperand]        > ddl:operand abstract
-[oracleddl:indextypeOperand]    > ddl:operand abstract
-[oracleddl:javaOperand]         > ddl:operand abstract
-[oracleddl:libraryOperand]      > ddl:operand abstract
-[oracleddl:materializedOperand] > ddl:operand abstract
-[oracleddl:operatorOperand]     > ddl:operand abstract
-[oracleddl:outlineOperand]      > ddl:operand abstract
-[oracleddl:packageOperand]      > ddl:operand abstract
-[oracleddl:pfileOperand]        > ddl:operand abstract
-[oracleddl:procedureOperand]    > ddl:operand abstract
-[oracleddl:profileOperand]      > ddl:operand abstract
-[oracleddl:resourceOperand]     > ddl:operand abstract
-[oracleddl:roleOperand]         > ddl:operand abstract
-[oracleddl:rollbackOperand]     > ddl:operand abstract
-[oracleddl:sequenceOperand]     > ddl:operand abstract
-[oracleddl:sessionOperand]      > ddl:operand abstract
-[oracleddl:spfileOperand]       > ddl:operand abstract
-[oracleddl:systemOperand]       > ddl:operand abstract
-[oracleddl:synonymOperand]      > ddl:operand abstract
-[oracleddl:tablespaceOperand]   > ddl:operand abstract
-[oracleddl:triggerOperand]      > ddl:operand abstract
-[oracleddl:typeOperand]         > ddl:operand abstract
-[oracleddl:userOperand]         > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[oracleddl:columnDefinition] > ddl:columnDefinition
-  - oracleddl:dropDefault (boolean)
-  
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
-[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
-[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
-[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
-[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
-
-[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - oracleddl:newTableName (STRING)
-  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
-[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
-  - oracleddl:tableName (string) mandatory
-  - oracleddl:unique (boolean)
-  - oracleddl:bitmap (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
-[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
-[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[oracleddl:analyzeStatement]         > ddl:statement mixin
-[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:auditStatement]           > ddl:statement mixin
-[oracleddl:commitStatement]          > ddl:statement mixin
-[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
-  - oracleddl:targetObjectType (STRING) mandatory
-  - oracleddl:targetObjectName (STRING)
-  - oracleddl:comment (STRING) mandatory
-[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:explainPlanStatement]     > ddl:statement mixin
-[oracleddl:flashbackStatement]       > ddl:statement mixin
-[oracleddl:lockTableStatement]       > ddl:statement mixin
-[oracleddl:mergeStatement]           > ddl:statement mixin
-[oracleddl:nestedTableStatement]     > ddl:statement mixin
-[oracleddl:noauditStatement]         > ddl:statement mixin
-[oracleddl:purgeStatement]           > ddl:statement mixin
-[oracleddl:renameStatement]          > ddl:statement mixin
-[oracleddl:revokeStatement]          > ddl:statement mixin
-[oracleddl:rollbackStatement]        > ddl:statement mixin
-[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
-[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:truncateStatement]        > ddl:statement mixin

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,205 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[postgresddl:aggregateOperand]      > ddl:operand abstract
-[postgresddl:castOperand]           > ddl:operand abstract
-[postgresddl:commentOperand]      > ddl:operand abstract
-[postgresddl:constraintTriggerOperand] > ddl:operand abstract
-[postgresddl:conversionOperand]     > ddl:operand abstract
-[postgresddl:databaseOperand]       > ddl:operand abstract
-[postgresddl:foreignDataOperand]    > ddl:operand abstract
-[postgresddl:groupOperand]          > ddl:operand abstract
-[postgresddl:functionOperand]       > ddl:operand abstract
-[postgresddl:indexOperand]          > ddl:operand abstract
-[postgresddl:languageOperand]       > ddl:operand abstract
-[postgresddl:operatorOperand]       > ddl:operand abstract
-[postgresddl:ownedByOperand]        > ddl:operand abstract
-[postgresddl:roleOperand]           > ddl:operand abstract
-[postgresddl:ruleOperand]           > ddl:operand abstract
-[postgresddl:sequenceOperand]       > ddl:operand abstract
-[postgresddl:serverOperand]         > ddl:operand abstract
-[postgresddl:tablespaceOperand]     > ddl:operand abstract
-[postgresddl:textSearchOperand]     > ddl:operand abstract
-[postgresddl:triggerOperand]        > ddl:operand abstract
-[postgresddl:typeOperand]           > ddl:operand abstract
-[postgresddl:userOperand]           > ddl:operand abstract
-[postgresddl:userMappingOperand]    > ddl:operand abstract
-[postgresddl:parameterOperand]      > ddl:operand abstract
-
-[postgresddl:functionParameter]     > postgresddl:parameterOperand mixin
-  - ddl:datatypeName (STRING) mandatory
-  - ddl:datatypeLength (LONG)
-  - ddl:datatypePrecision (LONG)
-  - ddl:datatypeScale (LONG)
-  - ddl:nullable (STRING)
-  - ddl:defaultOption (STRING)
-  - postgresddl:mode (STRING)
-
-[postgresddl:role]                  > postgresddl:roleOperand mixin
-
-[postgresddl:renamedColumn]         > ddl:renamable mixin
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
-[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
-[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
-
-[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - postgresddl:newTableName (STRING)
-  - postgresddl:schemaName (STRING)
-  + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn multiple
-
-  
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
-[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
-[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
-[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
-[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
-[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
-[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
-[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
-[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
-[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
-[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
-[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
-[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
-[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
-[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
-[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
-[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
-[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
-[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
-[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
-[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
-[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[postgresddl:abortStatement]            > ddl:statement mixin
-[postgresddl:analyzeStatement]          > ddl:statement mixin
-[postgresddl:clusterStatement]          > ddl:statement mixin
-[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
-  - postgresddl:targetObjectType (STRING) mandatory
-  - postgresddl:targetObjectName (STRING)
-  - postgresddl:comment (STRING) mandatory
-[postgresddl:copyStatement]             > ddl:statement mixin
-[postgresddl:deallocateStatement]       > ddl:statement mixin
-[postgresddl:declareStatement]          > ddl:statement mixin
-[postgresddl:discardStatement]          > ddl:statement mixin
-[postgresddl:explainStatement]          > ddl:statement mixin
-[postgresddl:fetchStatement]            > ddl:statement mixin
-[postgresddl:listenStatement]           > ddl:statement mixin
-[postgresddl:loadStatement]             > ddl:statement mixin
-[postgresddl:lockTableStatement]        > ddl:statement mixin
-[postgresddl:moveStatement]             > ddl:statement mixin
-[postgresddl:notifyStatement]           > ddl:statement mixin
-[postgresddl:prepareStatement]          > ddl:statement mixin
-[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
-[postgresddl:reindexStatement]          > ddl:statement mixin
-[postgresddl:releaseSavepointStatement] > ddl:statement mixin
-[postgresddl:rollbackStatement]         > ddl:statement mixin
-[postgresddl:selectIntoStatement]       > ddl:statement mixin
-[postgresddl:showStatement]             > ddl:statement mixin
-[postgresddl:truncateStatement]         > ddl:statement mixin
-[postgresddl:unlistenStatement]         > ddl:statement mixin
-[postgresddl:vacuumStatement]           > ddl:statement mixin
-
-// =============================================================================
-// GRANT STATEMENTS
-// =============================================================================
-[postgresddl:grantOnTableStatement]            > ddl:grantStatement, ddl:tableOperand mixin
-[postgresddl:grantOnSequenceStatement]         > ddl:grantStatement, postgresddl:sequenceOperand mixin
-[postgresddl:grantOnDatabaseStatement]         > ddl:grantStatement, postgresddl:databaseOperand mixin
-[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement, postgresddl:foreignDataOperand mixin
-[postgresddl:grantOnForeignServerStatement]    > ddl:grantStatement, postgresddl:serverOperand mixin
-[postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
-  + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter multiple
-[postgresddl:grantOnLanguageStatement]         > ddl:grantStatement, postgresddl:languageOperand mixin
-[postgresddl:grantOnSchemaStatement]           > ddl:grantStatement, ddl:schemaOperand mixin
-[postgresddl:grantOnTablespaceStatement]       > ddl:grantStatement, postgresddl:tablespaceOperand mixin
-[postgresddl:grantRolesStatement]              > ddl:grantStatement mixin
-  + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -278,3 +278,18 @@
 [ddl:grantOnCollationStatement]     > ddl:grantStatement, ddl:collationOperand mixin
 [ddl:grantOnCharacterSetStatement]  > ddl:grantStatement, ddl:characterSetOperand mixin
 [ddl:grantOnTranslationStatement]   > ddl:grantStatement, ddl:translationOperand mixin
+
+// =============================================================================
+// REVOKE STATEMENTS
+// =============================================================================
+
+[ddl:revokeStatement] > ddl:statement, ddl:revokable, ddl:droppable mixin
+  - ddl:allPrivileges (boolean)
+  + * (ddl:grantPrivilege) = ddl:grantPrivilege multiple
+  + * (ddl:grantee) = ddl:grantee multiple
+
+[ddl:revokeOnTableStatement]         > ddl:revokeStatement, ddl:tableOperand mixin
+[ddl:revokeOnDomainStatement]        > ddl:revokeStatement, ddl:domainOperand mixin
+[ddl:revokeOnCollationStatement]     > ddl:revokeStatement, ddl:collationOperand mixin
+[ddl:revokeOnCharacterSetStatement]  > ddl:revokeStatement, ddl:characterSetOperand mixin
+[ddl:revokeOnTranslationStatement]   > ddl:revokeStatement, ddl:translationOperand mixin

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/derby_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/derby_test_statements.ddl	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/derby_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,218 +0,0 @@
---
--- SAMPLE DERBY STATEMENTS
---
-
--- Add a new column with a column-level constraint
--- to an existing table
--- An exception will be thrown if the table
--- contains any rows
--- since the newcol will be initialized to NULL
--- in all existing rows in the table
-ALTER TABLE CITIES ADD COLUMN REGION VARCHAR(26)
-    CONSTRAINT NEW_CONSTRAINT CHECK (REGION IS NOT NULL);
-
--- Add a new unique constraint to an existing table
--- An exception will be thrown if duplicate keys are found
-ALTER TABLE SAMP.DEPARTMENT
-    ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
-
--- add a new foreign key constraint to the
--- Cities table. Each row in Cities is checked
--- to make sure it satisfied the constraints.
--- if any rows don't satisfy the constraint, the
--- constraint is not added
-ALTER TABLE CITIES ADD CONSTRAINT COUNTRY_FK
-    Foreign Key (COUNTRY) REFERENCES COUNTRIES (COUNTRY);
-
--- Add a primary key constraint to a table
--- First, create a new table
-CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL,
-    SEASON CHAR(2), ACTIVITY VARCHAR(32) NOT NULL);
--- You will not be able to add this constraint if the
--- columns you are including in the primary key have
--- null data or duplicate values.
-ALTER TABLE Activities ADD PRIMARY KEY (city_id, activity);
-
--- Drop the city_id column if there are no dependent objects:
-ALTER TABLE Cities DROP COLUMN city_id RESTRICT;
--- Drop the city_id column, also dropping all dependent objects:
-ALTER TABLE Cities DROP COLUMN city_id CASCADE;
-
--- Drop a primary key constraint from the CITIES table
-
-ALTER TABLE Cities DROP CONSTRAINT Cities_PK;
--- Drop a foreign key constraint from the CITIES table
-ALTER TABLE Cities DROP CONSTRAINT COUNTRIES_FK;
--- add a DEPTNO column with a default value of 1
-ALTER TABLE SAMP.EMP_ACT ADD COLUMN DEPTNO INT DEFAULT 1;
--- increase the width of a VARCHAR column
-ALTER TABLE SAMP.EMP_PHOTO ALTER PHOTO_FORMAT SET DATA TYPE VARCHAR(30);
--- change the lock granularity of a table
-ALTER TABLE SAMP.SALES LOCKSIZE TABLE;
-
--- Remove the NOT NULL constraint from the MANAGER column
-ALTER TABLE Employees ALTER COLUMN Manager NULL;
--- Add the NOT NULL constraint to the SSN column
-ALTER TABLE Employees ALTER COLUMN ssn NOT NULL;
-
--- Change the default value for the SALARY column
-ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0;
-ALTER TABLE Employees ALTER COLUMN Salary DROP DEFAULT;
-
-
-CREATE FUNCTION TO_DEGREES
-	( RADIANS DOUBLE )
-	RETURNS DOUBLE
-	PARAMETER STYLE JAVA
-	NO SQL LANGUAGE JAVA
-	EXTERNAL NAME 'java.lang.Math.toDegrees';
-
-
-CREATE FUNCTION PROPERTY_FILE_READER
-	( FILENAME VARCHAR( 32672 ) )
-	RETURNS TABLE
-	  (
-	     KEY_COL     VARCHAR( 10 ),
-	     VALUE_COL VARCHAR( 1000 )
-	  )
-	LANGUAGE JAVA
-	PARAMETER STYLE DERBY_JDBC_RESULT_SET
-	NO SQL
-	EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI';
-
-CREATE INDEX OrigIndex ON Flights(orig_airport);
-
-CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY);
-
-CREATE INDEX IXSALE ON SAMP.SALES (SALES);
-
-CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER,
-    IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2))
-    PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 
-    'com.acme.sales.calculateRevenueByMonth';
-
-CREATE ROLE purchases_reader;
-
-CREATE ROLE purchases_reader_role;
-
-CREATE SCHEMA FLIGHTS AUTHORIZATION anita;
-
-CREATE SCHEMA EMP;
-
-CREATE SCHEMA AUTHORIZATION takumi; 
-
-CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;
-
-CREATE TABLE HOTELAVAILABILITY
-     (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
-    ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
-
-CREATE TABLE PEOPLE
-    (PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY
-    CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
-    
-CREATE TABLE greetings
-  (i int generated by default as identity (START WITH 2, INCREMENT BY 1), ch char(50));
-
-CREATE TABLE GROUPS
-    (GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY 
-    (START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15));
-
-CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
-  FOR EACH ROW MODE DB2SQL
-  values app.notifyEmail('Jerry', 'Table x is about to be updated'); 
-
-
-CREATE TRIGGER FLIGHTSDELETE
-  AFTER DELETE ON FLIGHTS
-  REFERENCING OLD_TABLE AS DELETEDFLIGHTS
-  FOR EACH STATEMENT 
-  DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN
-  (SELECT FLIGHT_ID FROM DELETEDFLIGHTS);
-
-CREATE TRIGGER FLIGHTSDELETE3
-  AFTER DELETE ON FLIGHTS
-  REFERENCING OLD AS OLD
-  FOR EACH ROW 
-  DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
-
-
-
-CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
-    AS SELECT COMM + BONUS, COMM - BONUS
-    FROM SAMP.EMPLOYEE;
-
-CREATE VIEW SAMP.VEMP_RES (RESUME)
-    AS VALUES 'Delores M. Quintana', 'Heather A. Nicholls', 'Bruce Adamson';
-
-CREATE VIEW SAMP.PROJ_COMBO 
-    (PROJNO, PRENDATE, PRSTAFF, MAJPROJ) 
-		    AS SELECT PROJNO, PRENDATE, PRSTAFF, MAJPROJ
-		    FROM SAMP.PROJECT UNION ALL 
-		SELECT PROJNO, EMSTDATE, EMPTIME, EMPNO 
-		    FROM SAMP.EMP_ACT 
-		    WHERE EMPNO IS NOT NULL;
-
-CREATE VIEW V1 (C1) AS SELECT SIN(C1) FROM T1;
-
-declare global temporary table SESSION.t1(c11 int) not logged;
--- The SESSION qualification is redundant here because temporary 
--- tables can only exist in the SESSION schema. 
-
-declare global temporary table t2(c21 int) not logged; 
--- The temporary table is not qualified here with SESSION because temporary 
--- tables can only exist in the SESSION schema.
-
-DROP FUNCTION some_function_name;
-
-DROP INDEX OrigIndex;
-
-DROP INDEX DestIndex;
-
-DROP PROCEDURE some_procedure_name;
-
-DROP ROLE reader;
-
--- The RESTRICT keyword is required
-DROP SCHEMA SAMP RESTRICT;
-
-DROP SYNONYM some_synonym_name;
-
-DROP TABLE some_table_name;
-
-DROP TRIGGER TRIG1;
-
-DROP VIEW AnIdentifier;
-
-GRANT SELECT ON TABLE t TO maria,harry; 
-
-GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi;
-
-GRANT SELECT ON TABLE s.v to PUBLIC;
-
-GRANT EXECUTE ON PROCEDURE p TO george;
-
-GRANT purchases_reader_role TO george,maria;
-
-GRANT SELECT ON TABLE t TO purchases_reader_role;
-
-INSERT INTO COUNTRIES
-      VALUES ('Taiwan', 'TW', 'Asia');
-
-INSERT INTO MA_EMP_ACT
-    SELECT * FROM EMP_ACT
-    WHERE SUBSTR(PROJNO, 1, 2) = 'MA';
-    
--- Insert the DEFAULT value for the LOCATION column
-INSERT INTO DEPARTMENT
-      VALUES ('E31', 'ARCHITECTURE', '00390', 'E01', DEFAULT);
-    
-LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
-
-LOCK TABLE Maps IN EXCLUSIVE MODE;
-
-RENAME INDEX DESTINDEX TO ARRIVALINDEX;
-
-RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
-
-

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdl.cnd (from rev 1528, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/DerbyDdl.cnd)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdl.cnd	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,102 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<derbyddl='http://www.jboss.org/dna/ddl/derby/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[derbyddl:functionOperand]  > ddl:operand abstract
+[derbyddl:indexOperand]     > ddl:operand abstract
+[derbyddl:procedureOperand] > ddl:operand abstract
+[derbyddl:roleOperand]      > ddl:operand abstract
+[derbyddl:synonymOperand]   > ddl:operand abstract
+[derbyddl:triggerOperand]   > ddl:operand abstract
+
+[derbyddl:roleName]         > derbyddl:roleOperand mixin
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[derbyddl:columnDefinition] > ddl:columnDefinition mixin
+  - derbyddl:dropDefault (boolean)
+  
+[derbyddl:functionParameter] > ddl:columnDefinition mixin
+
+[derbyddl:indexColumnReference] > ddl:columnReference mixin
+  - derbyddl:order (STRING)
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+[derbyddl:createFunctionStatement]     > ddl:creatable, ddl:statement, derbyddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:isTableType (boolean)
+  + * (derbyddl:functionParameter) = derbyddl:functionParameter multiple
+  + * (ddl:statementOption) = ddl:statementOption multiple
+[derbyddl:createIndexStatement]        > ddl:statement, ddl:creatable, derbyddl:indexOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - derbyddl:unique (boolean)
+  + * (derbyddl:indexColumnReference) = derbyddl:indexColumnReference multiple
+[derbyddl:createProcedureStatement]    > ddl:creatable, ddl:statement, derbyddl:procedureOperand mixin
+[derbyddl:createRoleStatement]         > ddl:creatable, ddl:statement, derbyddl:roleOperand mixin
+[derbyddl:createSynonymStatement]      > ddl:creatable, ddl:statement, derbyddl:synonymOperand mixin
+  - derbyddl:tableName (string) mandatory
+[derbyddl:createTriggerStatement]      > ddl:creatable, ddl:statement, derbyddl:triggerOperand mixin
+  - derbyddl:tableName (string) mandatory
+  - ddl:sql (string) mandatory
+  + * (ddl:columnReference) = ddl:columnreference multiple
+[derbyddl:declareGlobalTemporaryTableStatement] > ddl:createTableStatement mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+[derbyddl:dropFunctionStatement]    > ddl:droppable, derbyddl:functionOperand mixin
+[derbyddl:dropIndexStatement]       > ddl:droppable, derbyddl:indexOperand mixin
+[derbyddl:dropProcedureStatement]   > ddl:droppable, derbyddl:procedureOperand mixin
+[derbyddl:dropRoleStatement]        > ddl:droppable, derbyddl:roleOperand mixin
+[derbyddl:dropSynonymStatement]     > ddl:droppable, derbyddl:synonymOperand mixin
+[derbyddl:dropTriggerStatement]     > ddl:droppable, derbyddl:triggerOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+[derbyddl:lockTableStatement]       > ddl:statement, ddl:tableOperand mixin
+[derbyddl:renameTableStatement]     > ddl:statement, ddl:renamable, ddl:tableOperand mixin
+
+[derbyddl:grantOnFunctionStatement]     > ddl:grantStatement, derbyddl:functionOperand mixin
+[derbyddl:grantOnProcedureStatement]    > ddl:grantStatement, derbyddl:procedureOperand mixin
+
+[derbyddl:grantRolesStatement]          > ddl:grantStatement mixin
+  + ddl:name (derbyddl:roleName) = derbyddl:roleName multiple
\ No newline at end of file


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/derby_test_statements.ddl (from rev 1494, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/derby_test_statements.ddl)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/derby_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/derby_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,218 @@
+--
+-- SAMPLE DERBY STATEMENTS
+--
+
+-- Add a new column with a column-level constraint
+-- to an existing table
+-- An exception will be thrown if the table
+-- contains any rows
+-- since the newcol will be initialized to NULL
+-- in all existing rows in the table
+ALTER TABLE CITIES ADD COLUMN REGION VARCHAR(26)
+    CONSTRAINT NEW_CONSTRAINT CHECK (REGION IS NOT NULL);
+
+-- Add a new unique constraint to an existing table
+-- An exception will be thrown if duplicate keys are found
+ALTER TABLE SAMP.DEPARTMENT
+    ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
+
+-- add a new foreign key constraint to the
+-- Cities table. Each row in Cities is checked
+-- to make sure it satisfied the constraints.
+-- if any rows don't satisfy the constraint, the
+-- constraint is not added
+ALTER TABLE CITIES ADD CONSTRAINT COUNTRY_FK
+    Foreign Key (COUNTRY) REFERENCES COUNTRIES (COUNTRY);
+
+-- Add a primary key constraint to a table
+-- First, create a new table
+CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL,
+    SEASON CHAR(2), ACTIVITY VARCHAR(32) NOT NULL);
+-- You will not be able to add this constraint if the
+-- columns you are including in the primary key have
+-- null data or duplicate values.
+ALTER TABLE Activities ADD PRIMARY KEY (city_id, activity);
+
+-- Drop the city_id column if there are no dependent objects:
+ALTER TABLE Cities DROP COLUMN city_id RESTRICT;
+-- Drop the city_id column, also dropping all dependent objects:
+ALTER TABLE Cities DROP COLUMN city_id CASCADE;
+
+-- Drop a primary key constraint from the CITIES table
+
+ALTER TABLE Cities DROP CONSTRAINT Cities_PK;
+-- Drop a foreign key constraint from the CITIES table
+ALTER TABLE Cities DROP CONSTRAINT COUNTRIES_FK;
+-- add a DEPTNO column with a default value of 1
+ALTER TABLE SAMP.EMP_ACT ADD COLUMN DEPTNO INT DEFAULT 1;
+-- increase the width of a VARCHAR column
+ALTER TABLE SAMP.EMP_PHOTO ALTER PHOTO_FORMAT SET DATA TYPE VARCHAR(30);
+-- change the lock granularity of a table
+ALTER TABLE SAMP.SALES LOCKSIZE TABLE;
+
+-- Remove the NOT NULL constraint from the MANAGER column
+ALTER TABLE Employees ALTER COLUMN Manager NULL;
+-- Add the NOT NULL constraint to the SSN column
+ALTER TABLE Employees ALTER COLUMN ssn NOT NULL;
+
+-- Change the default value for the SALARY column
+ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0;
+ALTER TABLE Employees ALTER COLUMN Salary DROP DEFAULT;
+
+
+CREATE FUNCTION TO_DEGREES
+	( RADIANS DOUBLE )
+	RETURNS DOUBLE
+	PARAMETER STYLE JAVA
+	NO SQL LANGUAGE JAVA
+	EXTERNAL NAME 'java.lang.Math.toDegrees';
+
+
+CREATE FUNCTION PROPERTY_FILE_READER
+	( FILENAME VARCHAR( 32672 ) )
+	RETURNS TABLE
+	  (
+	     KEY_COL     VARCHAR( 10 ),
+	     VALUE_COL VARCHAR( 1000 )
+	  )
+	LANGUAGE JAVA
+	PARAMETER STYLE DERBY_JDBC_RESULT_SET
+	NO SQL
+	EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI';
+
+CREATE INDEX OrigIndex ON Flights(orig_airport);
+
+CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY);
+
+CREATE INDEX IXSALE ON SAMP.SALES (SALES);
+
+CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER,
+    IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2))
+    PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 
+    'com.acme.sales.calculateRevenueByMonth';
+
+CREATE ROLE purchases_reader;
+
+CREATE ROLE purchases_reader_role;
+
+CREATE SCHEMA FLIGHTS AUTHORIZATION anita;
+
+CREATE SCHEMA EMP;
+
+CREATE SCHEMA AUTHORIZATION takumi; 
+
+CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;
+
+CREATE TABLE HOTELAVAILABILITY
+     (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
+    ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+
+CREATE TABLE PEOPLE
+    (PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY
+    CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
+    
+CREATE TABLE greetings
+  (i int generated by default as identity (START WITH 2, INCREMENT BY 1), ch char(50));
+
+CREATE TABLE GROUPS
+    (GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY 
+    (START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15));
+
+CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
+  FOR EACH ROW MODE DB2SQL
+  values app.notifyEmail('Jerry', 'Table x is about to be updated'); 
+
+
+CREATE TRIGGER FLIGHTSDELETE
+  AFTER DELETE ON FLIGHTS
+  REFERENCING OLD_TABLE AS DELETEDFLIGHTS
+  FOR EACH STATEMENT 
+  DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN
+  (SELECT FLIGHT_ID FROM DELETEDFLIGHTS);
+
+CREATE TRIGGER FLIGHTSDELETE3
+  AFTER DELETE ON FLIGHTS
+  REFERENCING OLD AS OLD
+  FOR EACH ROW 
+  DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
+
+
+
+CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
+    AS SELECT COMM + BONUS, COMM - BONUS
+    FROM SAMP.EMPLOYEE;
+
+CREATE VIEW SAMP.VEMP_RES (RESUME)
+    AS VALUES 'Delores M. Quintana', 'Heather A. Nicholls', 'Bruce Adamson';
+
+CREATE VIEW SAMP.PROJ_COMBO 
+    (PROJNO, PRENDATE, PRSTAFF, MAJPROJ) 
+		    AS SELECT PROJNO, PRENDATE, PRSTAFF, MAJPROJ
+		    FROM SAMP.PROJECT UNION ALL 
+		SELECT PROJNO, EMSTDATE, EMPTIME, EMPNO 
+		    FROM SAMP.EMP_ACT 
+		    WHERE EMPNO IS NOT NULL;
+
+CREATE VIEW V1 (C1) AS SELECT SIN(C1) FROM T1;
+
+declare global temporary table SESSION.t1(c11 int) not logged;
+-- The SESSION qualification is redundant here because temporary 
+-- tables can only exist in the SESSION schema. 
+
+declare global temporary table t2(c21 int) not logged; 
+-- The temporary table is not qualified here with SESSION because temporary 
+-- tables can only exist in the SESSION schema.
+
+DROP FUNCTION some_function_name;
+
+DROP INDEX OrigIndex;
+
+DROP INDEX DestIndex;
+
+DROP PROCEDURE some_procedure_name;
+
+DROP ROLE reader;
+
+-- The RESTRICT keyword is required
+DROP SCHEMA SAMP RESTRICT;
+
+DROP SYNONYM some_synonym_name;
+
+DROP TABLE some_table_name;
+
+DROP TRIGGER TRIG1;
+
+DROP VIEW AnIdentifier;
+
+GRANT SELECT ON TABLE t TO maria,harry; 
+
+GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi;
+
+GRANT SELECT ON TABLE s.v to PUBLIC;
+
+GRANT EXECUTE ON PROCEDURE p TO george;
+
+GRANT purchases_reader_role TO george,maria;
+
+GRANT SELECT ON TABLE t TO purchases_reader_role;
+
+INSERT INTO COUNTRIES
+      VALUES ('Taiwan', 'TW', 'Asia');
+
+INSERT INTO MA_EMP_ACT
+    SELECT * FROM EMP_ACT
+    WHERE SUBSTR(PROJNO, 1, 2) = 'MA';
+    
+-- Insert the DEFAULT value for the LOCATION column
+INSERT INTO DEPARTMENT
+      VALUES ('E31', 'ARCHITECTURE', '00390', 'E01', DEFAULT);
+    
+LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
+
+LOCK TABLE Maps IN EXCLUSIVE MODE;
+
+RENAME INDEX DESTINDEX TO ARRIVALINDEX;
+
+RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;
+
+


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/derby_test_statements.ddl
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd (from rev 1494, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/OracleDdl.cnd)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,202 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[oracleddl:clusterOperand]      > ddl:operand abstract
+[oracleddl:commentOperand]      > ddl:operand abstract
+[oracleddl:contextOperand]      > ddl:operand abstract
+[oracleddl:controlfileOperand]  > ddl:operand abstract
+[oracleddl:databaseOperand]     > ddl:operand abstract
+[oracleddl:dimensionOperand]    > ddl:operand abstract
+[oracleddl:directoryOperand]    > ddl:operand abstract
+[oracleddl:diskgroupOperand]    > ddl:operand abstract
+[oracleddl:functionOperand]     > ddl:operand abstract
+[oracleddl:indexOperand]        > ddl:operand abstract
+[oracleddl:indextypeOperand]    > ddl:operand abstract
+[oracleddl:javaOperand]         > ddl:operand abstract
+[oracleddl:libraryOperand]      > ddl:operand abstract
+[oracleddl:materializedOperand] > ddl:operand abstract
+[oracleddl:operatorOperand]     > ddl:operand abstract
+[oracleddl:outlineOperand]      > ddl:operand abstract
+[oracleddl:packageOperand]      > ddl:operand abstract
+[oracleddl:pfileOperand]        > ddl:operand abstract
+[oracleddl:procedureOperand]    > ddl:operand abstract
+[oracleddl:profileOperand]      > ddl:operand abstract
+[oracleddl:resourceOperand]     > ddl:operand abstract
+[oracleddl:roleOperand]         > ddl:operand abstract
+[oracleddl:rollbackOperand]     > ddl:operand abstract
+[oracleddl:sequenceOperand]     > ddl:operand abstract
+[oracleddl:sessionOperand]      > ddl:operand abstract
+[oracleddl:spfileOperand]       > ddl:operand abstract
+[oracleddl:systemOperand]       > ddl:operand abstract
+[oracleddl:synonymOperand]      > ddl:operand abstract
+[oracleddl:tablespaceOperand]   > ddl:operand abstract
+[oracleddl:triggerOperand]      > ddl:operand abstract
+[oracleddl:typeOperand]         > ddl:operand abstract
+[oracleddl:userOperand]         > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[oracleddl:columnDefinition] > ddl:columnDefinition
+  - oracleddl:dropDefault (boolean)
+  
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
+[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
+[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
+[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
+[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
+
+[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - oracleddl:newTableName (STRING)
+  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
+  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
+[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
+  - oracleddl:tableName (string) mandatory
+  - oracleddl:unique (boolean)
+  - oracleddl:bitmap (boolean)
+  + * (ddl:columnReference) = ddl:columnReference multiple
+[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
+[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
+[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[oracleddl:analyzeStatement]         > ddl:statement mixin
+[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:auditStatement]           > ddl:statement mixin
+[oracleddl:commitStatement]          > ddl:statement mixin
+[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
+  - oracleddl:targetObjectType (STRING) mandatory
+  - oracleddl:targetObjectName (STRING)
+  - oracleddl:comment (STRING) mandatory
+[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:explainPlanStatement]     > ddl:statement mixin
+[oracleddl:flashbackStatement]       > ddl:statement mixin
+[oracleddl:lockTableStatement]       > ddl:statement mixin
+[oracleddl:mergeStatement]           > ddl:statement mixin
+[oracleddl:nestedTableStatement]     > ddl:statement mixin
+[oracleddl:noauditStatement]         > ddl:statement mixin
+[oracleddl:purgeStatement]           > ddl:statement mixin
+[oracleddl:renameStatement]          > ddl:statement mixin
+[oracleddl:revokeStatement]          > ddl:statement mixin
+[oracleddl:rollbackStatement]        > ddl:statement mixin
+[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
+[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:truncateStatement]        > ddl:statement mixin


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/oracle_test_statements.ddl (from rev 1494, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/oracle_test_statements.ddl)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/oracle_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/oracle_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,234 @@
+--
+-- SAMPLE ORACLE STATEMENTS
+--
+
+ALTER TABLE employees 
+   PCTFREE 30
+   PCTUSED 60; 
+
+ALTER TABLE countries 
+   ADD (duty_pct     NUMBER(2,2)  CHECK (duty_pct < 10.5),
+        visa_needed  VARCHAR2(3)); 
+
+ALTER TABLESPACE tbs_01 
+    BEGIN BACKUP; 
+
+ALTER TABLESPACE omf_ts1 ADD DATAFILE; 
+
+ALTER TABLESPACE undots1
+  RETENTION NOGUARANTEE;
+
+ALTER TRIGGER update_job_history DISABLE;
+
+ALTER TYPE data_typ 
+   ADD MEMBER FUNCTION qtr(der_qtr DATE) 
+   RETURN CHAR CASCADE;
+
+ALTER TYPE cust_address_typ
+   ADD ATTRIBUTE (phone phone_list_typ) CASCADE;
+
+ALTER TYPE phone_list_typ
+  MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;
+
+ALTER USER app_user1 
+   GRANT CONNECT THROUGH sh
+   WITH ROLE warehouse_user;
+
+-- 10 Statements
+
+ALTER USER app_user1 IDENTIFIED GLOBALLY AS 'CN=tom,O=oracle,C=US';
+
+ALTER USER sidney 
+    IDENTIFIED BY second_2nd_pwd
+    DEFAULT TABLESPACE example; 
+
+ALTER VIEW customer_ro
+    COMPILE; 
+
+ANALYZE TABLE customers VALIDATE STRUCTURE ONLINE;
+
+ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE; 
+
+ANALYZE TABLE orders DELETE STATISTICS; 
+
+ASSOCIATE STATISTICS WITH PACKAGES emp_mgmt DEFAULT SELECTIVITY 10;
+
+AUDIT SELECT 
+    ON hr.employees
+    WHENEVER SUCCESSFUL; 
+
+AUDIT INSERT, UPDATE
+    ON oe.customers; 
+
+AUDIT DELETE ANY TABLE; 
+
+-- 20 Statements
+
+AUDIT ROLE
+    WHENEVER SUCCESSFUL; 
+
+COMMENT ON COLUMN employees.job_id 
+   IS 'abbreviated job title';
+
+COMMIT WORK; 
+
+COMMIT  COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
+
+CREATE CLUSTER personnel
+   (department NUMBER(4))
+SIZE 512 
+STORAGE (initial 100K next 50K);
+
+CREATE CLUSTER address
+   (postal_code NUMBER, country_id CHAR(2))
+   HASHKEYS 20
+   HASH IS MOD(postal_code + country_id, 101);
+
+CREATE CLUSTER cust_orders (customer_id NUMBER(6))
+   SIZE 512 SINGLE TABLE HASHKEYS 100;
+
+CREATE CONTEXT hr_context USING emp_mgmt;
+
+CREATE CONTROLFILE REUSE DATABASE "demo" NORESETLOGS NOARCHIVELOG
+	    MAXLOGFILES 32
+	    MAXLOGMEMBERS 2
+	    MAXDATAFILES 32
+	    MAXINSTANCES 1
+	    MAXLOGHISTORY 449
+	LOGFILE
+	  GROUP 1 '/path/oracle/dbs/t_log1.f'  SIZE 500K,
+	  GROUP 2 '/path/oracle/dbs/t_log2.f'  SIZE 500K
+	# STANDBY LOGFILE
+	DATAFILE
+	  '/path/oracle/dbs/t_db1.f',
+	  '/path/oracle/dbs/dbu19i.dbf',
+	  '/path/oracle/dbs/tbs_11.f',
+	  '/path/oracle/dbs/smundo.dbf',
+	  '/path/oracle/dbs/demo.dbf'
+	CHARACTER SET WE8DEC
+	;
+
+CREATE DATABASE sample
+   CONTROLFILE REUSE 
+   LOGFILE
+      GROUP 1 ('diskx:log1.log', 'disky:log1.log') SIZE 50K, 
+      GROUP 2 ('diskx:log2.log', 'disky:log2.log') SIZE 50K 
+   MAXLOGFILES 5 
+   MAXLOGHISTORY 100 
+   MAXDATAFILES 10 
+   MAXINSTANCES 2 
+   ARCHIVELOG 
+   CHARACTER SET AL32UTF8
+   NATIONAL CHARACTER SET AL16UTF16
+   DATAFILE  
+      'disk1:df1.dbf' AUTOEXTEND ON,
+      'disk2:df2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
+   DEFAULT TEMPORARY TABLESPACE temp_ts
+   UNDO TABLESPACE undo_ts 
+   SET TIME_ZONE = '+02:00';
+
+-- 30 Statements
+
+CREATE PUBLIC DATABASE LINK remote 
+   USING 'remote'; 
+
+CREATE DATABASE LINK local 
+   CONNECT TO hr IDENTIFIED BY hr
+   USING 'local';
+
+CREATE DIMENSION customers_dim 
+   LEVEL customer   IS (customers.cust_id)
+   LEVEL city       IS (customers.cust_city) 
+   LEVEL state      IS (customers.cust_state_province) 
+   LEVEL country    IS (countries.country_id) 
+   LEVEL subregion  IS (countries.country_subregion) 
+   LEVEL region     IS (countries.country_region) 
+   HIERARCHY geog_rollup (
+      customer      CHILD OF
+      city          CHILD OF 
+      state         CHILD OF 
+      country       CHILD OF 
+      subregion     CHILD OF 
+      region 
+   JOIN KEY (customers.country_id) REFERENCES country
+   )
+   ATTRIBUTE customer DETERMINES
+   (cust_first_name, cust_last_name, cust_gender, 
+    cust_marital_status, cust_year_of_birth, 
+    cust_income_level, cust_credit_limit) 
+   ATTRIBUTE country DETERMINES (countries.country_name)
+;
+
+CREATE DIRECTORY admin AS 'oracle/admin';
+
+CREATE OR REPLACE DIRECTORY bfile_dir AS '/private1/LOB/files';
+
+CREATE DISKGROUP dgroup_01
+  EXTERNAL REDUNDANCY
+  DISK '$ORACLE_HOME/disks/c*';
+  
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+   RETURN NUMBER DETERMINISTIC IS
+	BEGIN 
+	  RETURN DBMS_LOB.GETLENGTH(a);
+	END;
+/
+
+CREATE INDEXTYPE position_indextype
+   FOR position_between(NUMBER, NUMBER, NUMBER)
+   USING position_im;
+
+CREATE JAVA SOURCE NAMED "Hello" AS
+   public class Hello {
+      public static String hello() {
+         return \"Hello World\";   } };
+
+-- 40 Statements
+
+CREATE JAVA RESOURCE NAMED "appText" 
+   USING BFILE (bfile_dir, 'textBundle.dat');
+
+CREATE LIBRARY ext_lib AS '/OR/lib/ext_lib.so';
+/
+
+CREATE OR REPLACE LIBRARY ext_lib IS '/OR/newlib/ext_lib.so';
+/
+
+CREATE LIBRARY app_lib as '${ORACLE_HOME}/lib/app_lib.so'
+   AGENT 'sales.hq.acme.com';
+/
+   
+CREATE MATERIALIZED VIEW LOG ON employees
+   WITH PRIMARY KEY
+   INCLUDING NEW VALUES;
+
+CREATE MATERIALIZED VIEW all_customers
+   PCTFREE 5 PCTUSED 60 
+   TABLESPACE example 
+   STORAGE (INITIAL 50K NEXT 50K) 
+   USING INDEX STORAGE (INITIAL 25K NEXT 25K)
+   REFRESH START WITH ROUND(SYSDATE + 1) + 11/24 
+   NEXT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15/24 
+   AS SELECT * FROM sh.customers at remote 
+         UNION
+      SELECT * FROM sh.customers at local; 
+
+CREATE MATERIALIZED VIEW LOG ON product_information 
+   WITH ROWID, SEQUENCE (list_price, min_price, category_id) 
+   INCLUDING NEW VALUES;
+
+CREATE OPERATOR eq_op
+   BINDING (VARCHAR2, VARCHAR2) 
+   RETURN NUMBER 
+   USING eq_f; 
+
+CREATE OUTLINE salaries FOR CATEGORY special
+   ON SELECT last_name, salary FROM employees;
+
+CREATE OR REPLACE OUTLINE public_salaries 
+   FROM PRIVATE my_salaries;
+
+-- 50 Statements so far


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/oracle_test_statements.ddl
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdl.cnd (from rev 1528, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/PostgresDdl.cnd)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdl.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,205 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<postgresddl='http://www.jboss.org/dna/ddl/postgres/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[postgresddl:aggregateOperand]      > ddl:operand abstract
+[postgresddl:castOperand]           > ddl:operand abstract
+[postgresddl:commentOperand]      > ddl:operand abstract
+[postgresddl:constraintTriggerOperand] > ddl:operand abstract
+[postgresddl:conversionOperand]     > ddl:operand abstract
+[postgresddl:databaseOperand]       > ddl:operand abstract
+[postgresddl:foreignDataOperand]    > ddl:operand abstract
+[postgresddl:groupOperand]          > ddl:operand abstract
+[postgresddl:functionOperand]       > ddl:operand abstract
+[postgresddl:indexOperand]          > ddl:operand abstract
+[postgresddl:languageOperand]       > ddl:operand abstract
+[postgresddl:operatorOperand]       > ddl:operand abstract
+[postgresddl:ownedByOperand]        > ddl:operand abstract
+[postgresddl:roleOperand]           > ddl:operand abstract
+[postgresddl:ruleOperand]           > ddl:operand abstract
+[postgresddl:sequenceOperand]       > ddl:operand abstract
+[postgresddl:serverOperand]         > ddl:operand abstract
+[postgresddl:tablespaceOperand]     > ddl:operand abstract
+[postgresddl:textSearchOperand]     > ddl:operand abstract
+[postgresddl:triggerOperand]        > ddl:operand abstract
+[postgresddl:typeOperand]           > ddl:operand abstract
+[postgresddl:userOperand]           > ddl:operand abstract
+[postgresddl:userMappingOperand]    > ddl:operand abstract
+[postgresddl:parameterOperand]      > ddl:operand abstract
+
+[postgresddl:functionParameter]     > postgresddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - ddl:nullable (STRING)
+  - ddl:defaultOption (STRING)
+  - postgresddl:mode (STRING)
+
+[postgresddl:role]                  > postgresddl:roleOperand mixin
+
+[postgresddl:renamedColumn]         > ddl:renamable mixin
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[postgresddl:alterAggregateStatement]           > ddl:alterable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:alterConversionStatement]          > ddl:alterable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:alterDatabaseStatement]            > ddl:alterable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:alterForeignDataWrapperStatement]  > ddl:alterable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:alterFunctionStatement]            > ddl:alterable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:alterGroupStatement]               > ddl:alterable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:alterIndexStatement]               > ddl:alterable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:alterLanguageStatement]            > ddl:alterable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:alterOperatorStatement]            > ddl:alterable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:alterRoleStatement]                > ddl:alterable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:alterSchemaStatement]              > ddl:alterable, ddl:statement,         ddl:schemaOperand mixin
+[postgresddl:alterSequenceStatement]            > ddl:alterable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:alterServerStatement]              > ddl:alterable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:alterTablespaceStatement]          > ddl:alterable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:alterTextSearchStatement]          > ddl:alterable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:alterTriggerStatement]             > ddl:alterable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:alterTypeStatement]                > ddl:alterable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:alterUserStatement]                > ddl:alterable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:alterUserMappingStatement]         > ddl:alterable, ddl:statement, postgresddl:userMappingOperand mixin
+[postgresddl:alterViewStatement]                > ddl:alterable, ddl:statement,         ddl:viewOperand mixin
+
+[postgresddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - postgresddl:newTableName (STRING)
+  - postgresddl:schemaName (STRING)
+  + postgresddl:renameColumn (postgresddl:renamedColumn) = postgresddl:renamedColumn multiple
+
+  
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[postgresddl:createAggregateStatement]          > ddl:creatable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:createCastStatement]               > ddl:creatable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:createConstraintTriggerStatement]  > ddl:creatable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:createConversionStatement]         > ddl:creatable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:createDatabaseStatement]           > ddl:creatable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:createForeignDataWrapperStatement] > ddl:creatable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:createFunctionStatement]           > ddl:creatable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:createGroupStatement]              > ddl:creatable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:createIndexStatement]              > ddl:creatable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:createLanguageStatement]           > ddl:creatable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:createOperatorStatement]           > ddl:creatable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:createRoleStatement]               > ddl:creatable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:createRuleStatement]               > ddl:creatable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:createSequenceStatement]           > ddl:creatable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:createServerStatement]             > ddl:creatable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:createTablespaceStatement]         > ddl:creatable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:createTextSearchStatement]         > ddl:creatable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:createTriggerStatement]            > ddl:creatable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:createTypeStatement]               > ddl:creatable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:createUserStatement]               > ddl:creatable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:createUserMappingStatement]        > ddl:creatable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[postgresddl:dropAggregateStatement]            > ddl:droppable, ddl:statement, postgresddl:aggregateOperand mixin
+[postgresddl:dropCastStatement]                 > ddl:droppable, ddl:statement, postgresddl:castOperand mixin
+[postgresddl:dropConstraintTriggerStatement]    > ddl:droppable, ddl:statement, postgresddl:constraintTriggerOperand mixin
+[postgresddl:dropConversionStatement]           > ddl:droppable, ddl:statement, postgresddl:conversionOperand mixin
+[postgresddl:dropDatabaseStatement]             > ddl:droppable, ddl:statement, postgresddl:databaseOperand mixin
+[postgresddl:dropForeignDataWrapperStatement]   > ddl:droppable, ddl:statement, postgresddl:foreignDataOperand mixin
+[postgresddl:dropFunctionStatement]             > ddl:droppable, ddl:statement, postgresddl:functionOperand mixin
+[postgresddl:dropGroupStatement]                > ddl:droppable, ddl:statement, postgresddl:groupOperand mixin
+[postgresddl:dropIndexStatement]                > ddl:droppable, ddl:statement, postgresddl:indexOperand mixin
+[postgresddl:dropLanguageStatement]             > ddl:droppable, ddl:statement, postgresddl:languageOperand mixin
+[postgresddl:dropOperatorStatement]             > ddl:droppable, ddl:statement, postgresddl:operatorOperand mixin
+[postgresddl:dropOwnedByStatement]              > ddl:droppable, ddl:statement, postgresddl:ownedByOperand mixin
+[postgresddl:dropRoleStatement]                 > ddl:droppable, ddl:statement, postgresddl:roleOperand mixin
+[postgresddl:dropRuleStatement]                 > ddl:droppable, ddl:statement, postgresddl:ruleOperand mixin
+[postgresddl:dropSequenceStatement]             > ddl:droppable, ddl:statement, postgresddl:sequenceOperand mixin
+[postgresddl:dropServerStatement]               > ddl:droppable, ddl:statement, postgresddl:serverOperand mixin
+[postgresddl:dropTablespaceStatement]           > ddl:droppable, ddl:statement, postgresddl:tablespaceOperand mixin
+[postgresddl:dropTextSearchStatement]           > ddl:droppable, ddl:statement, postgresddl:textSearchOperand mixin
+[postgresddl:dropTriggerStatement]              > ddl:droppable, ddl:statement, postgresddl:triggerOperand mixin
+[postgresddl:dropTypeStatement]                 > ddl:droppable, ddl:statement, postgresddl:typeOperand mixin
+[postgresddl:dropUserStatement]                 > ddl:droppable, ddl:statement, postgresddl:userOperand mixin
+[postgresddl:dropUserMappingStatement]          > ddl:droppable, ddl:statement, postgresddl:userMappingOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[postgresddl:abortStatement]            > ddl:statement mixin
+[postgresddl:analyzeStatement]          > ddl:statement mixin
+[postgresddl:clusterStatement]          > ddl:statement mixin
+[postgresddl:commentOnStatement]        > ddl:statement, postgresddl:commentOperand mixin
+  - postgresddl:targetObjectType (STRING) mandatory
+  - postgresddl:targetObjectName (STRING)
+  - postgresddl:comment (STRING) mandatory
+[postgresddl:copyStatement]             > ddl:statement mixin
+[postgresddl:deallocateStatement]       > ddl:statement mixin
+[postgresddl:declareStatement]          > ddl:statement mixin
+[postgresddl:discardStatement]          > ddl:statement mixin
+[postgresddl:explainStatement]          > ddl:statement mixin
+[postgresddl:fetchStatement]            > ddl:statement mixin
+[postgresddl:listenStatement]           > ddl:statement mixin
+[postgresddl:loadStatement]             > ddl:statement mixin
+[postgresddl:lockTableStatement]        > ddl:statement mixin
+[postgresddl:moveStatement]             > ddl:statement mixin
+[postgresddl:notifyStatement]           > ddl:statement mixin
+[postgresddl:prepareStatement]          > ddl:statement mixin
+[postgresddl:reassignOwnedStatement]    > ddl:statement mixin
+[postgresddl:reindexStatement]          > ddl:statement mixin
+[postgresddl:releaseSavepointStatement] > ddl:statement mixin
+[postgresddl:rollbackStatement]         > ddl:statement mixin
+[postgresddl:selectIntoStatement]       > ddl:statement mixin
+[postgresddl:showStatement]             > ddl:statement mixin
+[postgresddl:truncateStatement]         > ddl:statement mixin
+[postgresddl:unlistenStatement]         > ddl:statement mixin
+[postgresddl:vacuumStatement]           > ddl:statement mixin
+
+// =============================================================================
+// GRANT STATEMENTS
+// =============================================================================
+[postgresddl:grantOnTableStatement]            > ddl:grantStatement, ddl:tableOperand mixin
+[postgresddl:grantOnSequenceStatement]         > ddl:grantStatement, postgresddl:sequenceOperand mixin
+[postgresddl:grantOnDatabaseStatement]         > ddl:grantStatement, postgresddl:databaseOperand mixin
+[postgresddl:grantOnForeignDataWrapperStatement] > ddl:grantStatement, postgresddl:foreignDataOperand mixin
+[postgresddl:grantOnForeignServerStatement]    > ddl:grantStatement, postgresddl:serverOperand mixin
+[postgresddl:grantOnFunctionStatement]         > ddl:grantStatement, postgresddl:functionOperand mixin
+  + postgresddl:parameter (postgresddl:functionParameter) = postgresddl:functionParameter multiple
+[postgresddl:grantOnLanguageStatement]         > ddl:grantStatement, postgresddl:languageOperand mixin
+[postgresddl:grantOnSchemaStatement]           > ddl:grantStatement, ddl:schemaOperand mixin
+[postgresddl:grantOnTablespaceStatement]       > ddl:grantStatement, postgresddl:tablespaceOperand mixin
+[postgresddl:grantRolesStatement]              > ddl:grantStatement mixin
+  + postgresddl:grantRole (postgresddl:role) = postgresddl:role multiple


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Copied: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/postgres_test_statements.ddl (from rev 1528, trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl)
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/postgres_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/postgres_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,609 @@
+-- Postgres SQL Statements from postgressql-8.4.1-US.pdf
+--
+-- Extracted 10/5/2009
+
+--COMMENT ON
+--{
+--  TABLE object_name |
+--  COLUMN table_name.column_name |
+--  AGGREGATE agg_name (agg_type [, ...] ) |
+--  CAST (sourcetype AS targettype) |
+--  CONSTRAINT constraint_name ON table_name |
+--  CONVERSION object_name |
+--  DATABASE object_name |
+--  DOMAIN object_name |
+--  FUNCTION func_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |
+--  INDEX object_name |
+--  LARGE OBJECT large_object_oid |
+--  OPERATOR op (leftoperand_type, rightoperand_type) |
+--  OPERATOR CLASS object_name USING index_method |
+--  OPERATOR FAMILY object_name USING index_method |
+--  [ PROCEDURAL ] LANGUAGE object_name |
+--  ROLE object_name |
+--  RULE rule_name ON table_name |
+--  SCHEMA object_name |
+--  SEQUENCE object_name |
+--  TABLESPACE object_name |
+--  TEXT SEARCH CONFIGURATION object_name |
+--  TEXT SEARCH DICTIONARY object_name |
+--  TEXT SEARCH PARSER object_name |
+--  TEXT SEARCH TEMPLATE object_name |
+--  TRIGGER trigger_name ON table_name |
+--  TYPE object_name |
+--  VIEW object_name
+--} IS 'text'
+
+COMMENT ON TABLE mytable IS 'This is my table.';
+COMMENT ON TABLE mytable IS NULL;
+COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Computes sample variance';
+COMMENT ON CAST (text AS int4) IS 'Allow casts from text to int4';
+COMMENT ON COLUMN my_table.my_column IS 'Employee ID number';
+COMMENT ON CONVERSION my_conv IS 'Conversion to UTF8';
+COMMENT ON DATABASE my_database IS 'Development Database';
+COMMENT ON DOMAIN my_domain IS 'Email Address Domain';
+COMMENT ON FUNCTION my_function (timestamp) IS 'Returns Roman Numeral';
+COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee ID';
+-- 10 STATEMENTS *******************************************************
+COMMENT ON LANGUAGE plpython IS 'Python support for stored procedures';
+COMMENT ON LARGE OBJECT 346344 IS 'Planning document';
+COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of two texts';
+COMMENT ON OPERATOR - (NONE, text) IS 'This is a prefix operator on text';
+COMMENT ON OPERATOR CLASS int4ops USING btree IS '4 byte integer operators for btrees';
+COMMENT ON OPERATOR FAMILY integer_ops USING btree IS 'all integer operators for btrees';
+COMMENT ON ROLE my_role IS 'Administration group for finance tables';
+COMMENT ON RULE my_rule ON my_table IS 'Logs updates of employee records';
+COMMENT ON SCHEMA my_schema IS 'Departmental data';
+COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys';
+-- 20 STATEMENTS *******************************************************
+COMMENT ON TABLE my_schema.my_table IS 'Employee Information';
+COMMENT ON TABLESPACE my_tablespace IS 'Tablespace for indexes';
+COMMENT ON TEXT SEARCH CONFIGURATION my_config IS 'Special word filtering';
+COMMENT ON TEXT SEARCH DICTIONARY swedish IS 'Snowball stemmer for swedish language';
+COMMENT ON TEXT SEARCH PARSER my_parser IS 'Splits text into words';
+COMMENT ON TEXT SEARCH TEMPLATE snowball IS 'Snowball stemmer';
+COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for RI';
+COMMENT ON TYPE complex IS 'Complex number data type';
+COMMENT ON VIEW my_view IS 'View of departmental costs';
+--COMMIT [ WORK | TRANSACTION ]
+
+COMMIT WORK;
+-- 30 STATEMENTS *******************************************************
+COMMIT TRANSACTION;
+
+COMMIT;
+
+--COMMIT PREPARED transaction_id;
+
+COMMIT PREPARED 'foobar';
+
+--COPY tablename [ ( column [, ...] ) ]
+--    FROM { 'filename' | STDIN }
+--    [ [ WITH ]
+--           [ BINARY ]
+--           [ OIDS ]
+--           [ DELIMITER [ AS ] 'delimiter ' ]
+--           [ NULL [ AS ] 'null string ' ]
+--           [ CSV [ HEADER ]
+--                 [ QUOTE [ AS ] 'quote' ]
+--                 [ ESCAPE [ AS ] 'escape' ]
+--                 [ FORCE NOT NULL column [, ...] ]
+--COPY { tablename [ ( column [, ...] ) ] | ( query ) }
+--    TO { 'filename' | STDOUT }
+--    [ [ WITH ]
+--           [ BINARY ]
+--           [ OIDS ]
+--           [ DELIMITER [ AS ] 'delimiter ' ]
+--           [ NULL [ AS ] 'null string ' ]
+--           [ CSV [ HEADER ]
+--                 [ QUOTE [ AS ] 'quote' ]
+--                 [ ESCAPE [ AS ] 'escape' ]
+--                 [ FORCE QUOTE column [, ...] ]
+
+COPY country TO STDOUT WITH DELIMITER '|';
+
+COPY country FROM '/usr1/proj/bray/sql/country_data';
+
+COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_co';
+
+--CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
+--    SFUNC = sfunc,
+--    STYPE = state_data_type
+--    [ , FINALFUNC = ffunc ]
+--    [ , INITCOND = initial_condition ]
+--    [ , SORTOP = sort_operator ]
+--)
+--or the old syntax
+--CREATE AGGREGATE name (
+--    BASETYPE = base_type,
+--    SFUNC = sfunc,
+--    STYPE = state_data_type
+--    [ , FINALFUNC = ffunc ]
+--    [ , INITCOND = initial_condition ]
+--    [ , SORTOP = sort_operator ]
+--)
+
+
+--CREATE CAST (sourcetype AS targettype)
+--    WITH FUNCTION funcname (argtypes)
+--    [ AS ASSIGNMENT | AS IMPLICIT ]
+--CREATE CAST (sourcetype AS targettype)
+--    WITHOUT FUNCTION
+--    [ AS ASSIGNMENT | AS IMPLICIT ]
+--CREATE CAST (sourcetype AS targettype)
+--    WITH INOUT
+--    [ AS ASSIGNMENT | AS IMPLICIT ]
+
+CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;
+
+--CREATE CONSTRAINT TRIGGER name
+--    AFTER event [ OR ... ]
+--    ON table_name
+--    [ FROM referenced_table_name ]
+--    { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
+--    FOR EACH ROW
+--    EXECUTE PROCEDURE funcname ( arguments )
+
+--CREATE [ DEFAULT ] CONVERSION name
+--    FOR source_encoding TO dest_encoding FROM funcname
+
+CREATE CONVERSION myconv FOR 'UTF8' TO 'LATIN1' FROM myfunc;
+
+--CREATE DATABASE name
+--    [ [ WITH ] [ OWNER [=] dbowner ]
+--           [ TEMPLATE [=] template ]
+--           [ ENCODING [=] encoding ]
+--           [ LC_COLLATE [=] lc_collate ]
+--           [ LC_CTYPE [=] lc_ctype ]
+--           [ TABLESPACE [=] tablespace ]
+--           [ CONNECTION LIMIT [=] connlimit ] ]
+
+CREATE DATABASE lusiadas;
+
+CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
+-- 40 STATEMENTS *******************************************************
+CREATE DATABASE music ENCODING 'LATIN1' TEMPLATE template0;
+
+
+--CREATE DOMAIN name [ AS ] data_type
+--    [ DEFAULT expression ]
+--    [ constraint [ ... ] ]
+--where constraint is:
+--[ CONSTRAINT constraint_name ]
+--{ NOT NULL | NULL | CHECK (expression) }
+
+CREATE DOMAIN us_postal_code AS TEXT
+	CHECK(
+	   VALUE ~ '^\\d{5}$'
+	OR VALUE ~ '^\\d{5}-\\d{4}$'
+	);
+
+--CREATE FOREIGN DATA WRAPPER name
+--    [ VALIDATOR valfunction | NO VALIDATOR ]
+--    [ OPTIONS ( option 'value' [, ... ] ) ]
+
+CREATE FOREIGN DATA WRAPPER dummy;
+
+CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
+
+CREATE FOREIGN DATA WRAPPER mywrapper
+    OPTIONS (debug 'true');
+
+--CREATE [ OR REPLACE ] FUNCTION
+--    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } defexpr ] [, ...] ] )
+--    [ RETURNS rettype
+--      | RETURNS TABLE ( colname coltype [, ...] ) ]
+--  { LANGUAGE langname
+--    | WINDOW
+--    | IMMUTABLE | STABLE | VOLATILE
+--    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
+--    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
+--    | COST execution_cost
+--    | ROWS result_rows
+--    | SET configuration_parameter { TO value | = value | FROM CURRENT }
+--    | AS 'definition'
+--    | AS 'obj_file', 'link_symbol'
+--  } ...
+--    [ WITH ( attribute [, ...] ) ]
+
+CREATE FUNCTION add(integer, integer) RETURNS integer
+    AS 'select $1 + $2;'
+    LANGUAGE SQL
+    IMMUTABLE
+    RETURNS NULL ON NULL INPUT;
+
+CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
+        BEGIN
+                RETURN i + 1;
+        END;
+
+CREATE FUNCTION dup(in int, out f1 int, out f2 text)
+    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
+    LANGUAGE SQL;
+
+CREATE FUNCTION dup(int) RETURNS dup_result
+    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
+    LANGUAGE SQL;
+
+CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
+    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
+    LANGUAGE SQL;
+-- 50 STATEMENTS *******************************************************
+--CREATE GROUP name [ [ WITH ] option [ ... ] ]
+--where option can be:
+--      SUPERUSER | NOSUPERUSER
+--    | CREATEDB | NOCREATEDB
+--    | CREATEROLE | NOCREATEROLE
+--    | CREATEUSER | NOCREATEUSER
+--    | INHERIT | NOINHERIT
+--    | LOGIN | NOLOGIN
+--    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password '
+--    | VALID UNTIL 'timestamp'
+--    | IN ROLE rolename [, ...]
+--    | IN GROUP rolename [, ...]
+--    | ROLE rolename [, ...]
+--    | ADMIN rolename [, ...]
+--    | USER rolename [, ...]
+--    | SYSID uid
+
+--CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]
+--    ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ..
+--    [ WITH ( storage_parameter = value [, ... ] ) ]
+--    [ TABLESPACE tablespace ]
+--    [ WHERE predicate ]
+
+CREATE UNIQUE INDEX title_idx ON films (title);
+
+CREATE INDEX lower_title_idx ON films ((lower(title)));
+
+CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);
+
+CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);
+
+CREATE INDEX gin_idx ON documents_table (locations) WITH (fastupdate = off);
+
+CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;
+
+CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);
+
+--CREATE [ PROCEDURAL ] LANGUAGE name
+--CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
+--    HANDLER call_handler [ VALIDATOR valfunction ]
+
+CREATE LANGUAGE plpgsql;
+
+CREATE PROCEDURAL LANGUAGE plpgsql;
+
+CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql;
+-- 60 STATEMENTS *******************************************************
+CREATE LANGUAGE plsample
+    HANDLER plsample_call_handler;
+
+--CREATE OPERATOR name (
+--    PROCEDURE = funcname
+--    [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]
+--    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
+--    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
+--    [, HASHES ] [, MERGES ]
+--)
+
+CREATE OPERATOR === (
+    LEFTARG = box,
+    RIGHTARG = box,
+    PROCEDURE = area_equal_procedure,
+    COMMUTATOR = ===,
+    NEGATOR = !==,
+    RESTRICT = area_restriction_procedure,
+    JOIN = area_join_procedure,
+    HASHES, MERGES
+);
+
+--CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
+--  USING index_method [ FAMILY family_name ] AS
+--  { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ]
+--   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )
+--   | STORAGE storage_type
+--  } [, ... ]
+
+CREATE OPERATOR CLASS gist__int_ops
+    DEFAULT FOR TYPE _int4 USING gist AS
+        OPERATOR        3       &&,
+        OPERATOR        6       = (anyarray, anyarray),
+        OPERATOR        7       @>,
+                                <@,
+        OPERATOR        8
+        OPERATOR        20      @@ (_int4, query_int),
+        FUNCTION        1       g_int_consistent (internal, _int4, int, oid, internal),
+        FUNCTION        2       g_int_union (internal, internal),
+        FUNCTION        3       g_int_compress (internal),
+        FUNCTION        4       g_int_decompress (internal),
+        FUNCTION        5       g_int_penalty (internal, internal, internal),
+        FUNCTION        6       g_int_picksplit (internal, internal),
+        FUNCTION        7       g_int_same (_int4, _int4, internal);
+
+--CREATE OPERATOR FAMILY name USING index_method
+
+CREATE OPERATOR FAMILY name USING index_method;
+
+--CREATE ROLE name [ [ WITH ] option [ ... ] ]
+--where option can be:
+--      SUPERUSER | NOSUPERUSER
+--    | CREATEDB | NOCREATEDB
+--    | CREATEROLE | NOCREATEROLE
+--    | CREATEUSER | NOCREATEUSER
+--    | INHERIT | NOINHERIT
+--    | LOGIN | NOLOGIN
+--    | CONNECTION LIMIT connlimit
+--    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password '
+--    | VALID UNTIL 'timestamp'
+--    | IN ROLE rolename [, ...]
+--    | IN GROUP rolename [, ...]
+--    | ROLE rolename [, ...]
+--    | ADMIN rolename [, ...]
+--    | USER rolename [, ...]
+--    | SYSID uid
+
+CREATE ROLE jonathan LOGIN;
+
+CREATE USER davide WITH PASSWORD 'jw8s0F4';
+
+CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
+
+CREATE ROLE admin WITH CREATEDB CREATEROLE;
+
+--CREATE [ OR REPLACE ] RULE name AS ON event
+--    TO table [ WHERE condition ]
+--    DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }
+
+CREATE RULE "_RETURN" AS
+    ON SELECT TO t1
+    DO INSTEAD
+        SELECT * FROM t2;
+    
+CREATE RULE "_RETURN" AS
+    ON SELECT TO t2
+    DO INSTEAD
+        SELECT * FROM t1;
+-- 70 STATEMENTS *******************************************************
+CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable;
+
+--CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]
+--CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]
+
+CREATE SCHEMA myschema;
+
+CREATE SCHEMA AUTHORIZATION joe;
+
+CREATE SCHEMA hollywood
+    CREATE TABLE films (title text, release date, awards text[])
+    CREATE VIEW winners AS
+        SELECT title, release FROM films WHERE awards IS NOT NULL;
+
+--CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
+--    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
+--    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
+--    [ OWNED BY { table.column | NONE } ]
+
+CREATE SEQUENCE serial START 101;
+
+--CREATE SERVER servername [ TYPE 'servertype' ] [ VERSION 'serverversion' ]
+--    FOREIGN DATA WRAPPER fdwname
+--    [ OPTIONS ( option 'value' [, ... ] ) ]
+
+CREATE SERVER foo FOREIGN DATA WRAPPER "default";
+
+CREATE SERVER myserver FOREIGN DATA WRAPPER pgsql OPTIONS (host 'foo', dbname 'foodb', port);
+       
+--CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name 
+--  ( [
+--      { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ] 
+--          | table_constraint 
+--          | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] .
+--      [, ... ] 
+--  ] )
+--[ INHERITS ( parent_table [, ... ] ) ]
+--[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
+--[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
+--[ TABLESPACE tablespace ]
+--where column_constraint is:
+--[ CONSTRAINT constraint_name ]
+--{ NOT NULL |
+--  NULL |
+--  UNIQUE index_parameters |
+--  PRIMARY KEY index_parameters |
+--  CHECK ( expression ) |
+--  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
+--    [ ON DELETE action ] [ ON UPDATE action ] }
+--[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
+--and table_constraint is:
+--[ CONSTRAINT constraint_name ]
+--{ UNIQUE ( column_name [, ... ] ) index_parameters |
+--  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
+--  CHECK ( expression ) |
+--  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
+--    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] 
+--[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
+--index_parameters in UNIQUE and PRIMARY KEY constraints are:
+--[ WITH ( storage_parameter [= value] [, ... ] ) ]
+--[ USING INDEX TABLESPACE tablespace ]
+
+CREATE TABLE films (
+    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
+    title       varchar(40) NOT NULL,
+    did         integer NOT NULL,
+    date_prod   date,
+    kind        varchar(10),
+    len         interval hour to minute
+);
+
+CREATE TABLE distributors (
+     did    integer PRIMARY KEY DEFAULT nextval('serial'),
+     name   varchar(40) NOT NULL CHECK (name <> ?)
+     
+);
+
+CREATE TABLE array_int (
+    vector int[][]
+);
+-- 80 STATEMENTS *******************************************************
+CREATE TABLE films (
+    code        char(5),
+    title       varchar(40),
+    did         integer,
+    date_prod   date,
+    kind        varchar(10),
+    len         interval hour to minute,
+    CONSTRAINT production UNIQUE(date_prod)
+);
+
+CREATE TABLE distributors (
+    did        integer CHECK (did > 100),
+    name    varchar(40)
+);
+
+CREATE TABLE distributors (
+    did     integer,
+    name    varchar(40)
+    CONSTRAINT con1 CHECK (did > 100 AND name <> ?)
+);
+
+CREATE TABLE films (
+    code        char(5),
+    title       varchar(40),
+    did         integer,
+    date_prod   date,
+    kind        varchar(10),
+    len         interval hour to minute,
+    CONSTRAINT code_title PRIMARY KEY(code,title)
+);
+
+CREATE TABLE films (
+    code        char(5),
+    title       varchar(40),
+    did         integer,
+    date_prod   date,
+    kind        varchar(10),
+    len         interval hour to minute,
+    CONSTRAINT code_title PRIMARY KEY(code,title)
+);
+
+CREATE TABLE distributors (
+    name      varchar(40) DEFAULT 'Luso Films',
+    did       integer DEFAULT nextval('distributors_serial'),
+    modtime   timestamp DEFAULT current_timestamp
+);
+
+CREATE TABLE distributors (
+    did     integer CONSTRAINT no_null NOT NULL,
+    name    varchar(40) NOT NULL
+);
+
+CREATE TABLE distributors (
+    did     integer,
+    name    varchar(40) UNIQUE
+);
+
+CREATE TABLE distributors (
+    did     integer,
+    name    varchar(40),
+    UNIQUE(name)
+);
+
+CREATE TABLE distributors (
+    did     integer,
+    name    varchar(40),
+    UNIQUE(name) WITH (fillfactor=70)
+)
+WITH (fillfactor=70);
+-- 90 STATEMENTS *******************************************************
+CREATE TABLE cinemas (
+        id serial,
+        name text,
+        location text
+) TABLESPACE diskvol1;
+
+--CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
+--    [ (column_name [, ...] ) ]
+--    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
+--    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
+--    [ TABLESPACE tablespace ]
+--    AS query
+--          [ WITH [ NO ] DATA ]
+
+CREATE TABLE films_recent AS
+  SELECT * FROM films WHERE date_prod >= '2002-01-01';
+
+CREATE TABLE films2 AS
+  TABLE films;
+
+CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS
+  EXECUTE recentfilms('2002-01-01');
+
+--CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory '
+
+CREATE TABLESPACE dbspace LOCATION '/data/dbs';
+
+CREATE TABLESPACE indexspace OWNER genevieve LOCATION '/data/indexes';
+
+--CREATE TEXT SEARCH CONFIGURATION name (
+--    PARSER = parser_name |
+--    COPY = source_config
+--)
+
+CREATE TEXT SEARCH CONFIGURATION my_search_config (
+    PARSER = my_parser
+);
+
+--CREATE TEXT SEARCH DICTIONARY name (
+--    TEMPLATE = template
+--    [, option = value [, ... ]]
+--)
+
+CREATE TEXT SEARCH DICTIONARY my_russian (
+    template = snowball,
+    language = russian,
+    stopwords = myrussian
+);
+
+--CREATE TEXT SEARCH PARSER name (
+--    START = start_function ,
+--    GETTOKEN = gettoken_function ,
+--    END = end_function ,
+--    LEXTYPES = lextypes_function
+--    [, HEADLINE = headline_function ]
+--)
+
+CREATE TEXT SEARCH PARSER my_search_parser (
+    START = startNow(),
+    GETTOKEN = getToken(),
+    END = end(),
+    LEXTYPES = getLexTypes()
+);
+
+--CREATE TEXT SEARCH TEMPLATE name (
+--    [ INIT = init_function , ]
+--    LEXIZE = lexize_function
+--)
+
+CREATE TEXT SEARCH TEMPLATE my_search_template (
+    LEXIZE = lexizeNow()
+);
+
+--CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
+--    ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
+--    EXECUTE PROCEDURE funcname ( arguments )
+-- 100 STATEMENTS *******************************************************
+CREATE TRIGGER trigger_name BEFORE dawn
+    ON table
+    EXECUTE PROCEDURE funcname ( 'arg1', 'arg2' );
+
+ALTER TABLE foreign_companies RENAME COLUMN address TO city;
+
+ALTER TABLE us_companies RENAME TO suppliers;
+
+ALTER TABLE old_addresses ALTER COLUMN street SET NOT NULL;
+
+ALTER TABLE new_addresses ALTER COLUMN street DROP NOT NULL;
+
+GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
+
+-- 106 STATEMENTS *******************************************************


Property changes on: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/postgres_test_statements.ddl
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/grant_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/grant_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/grant_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,7 @@
+GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
+
+GRANT UPDATE, USAGE ON TABLE billedOrders TO anita,zhi;
+
+GRANT SELECT ON TABLE orders.bills to PUBLIC;
+
+GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
\ No newline at end of file

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/oracle_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/oracle_test_statements.ddl	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/oracle_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,234 +0,0 @@
---
--- SAMPLE ORACLE STATEMENTS
---
-
-ALTER TABLE employees 
-   PCTFREE 30
-   PCTUSED 60; 
-
-ALTER TABLE countries 
-   ADD (duty_pct     NUMBER(2,2)  CHECK (duty_pct < 10.5),
-        visa_needed  VARCHAR2(3)); 
-
-ALTER TABLESPACE tbs_01 
-    BEGIN BACKUP; 
-
-ALTER TABLESPACE omf_ts1 ADD DATAFILE; 
-
-ALTER TABLESPACE undots1
-  RETENTION NOGUARANTEE;
-
-ALTER TRIGGER update_job_history DISABLE;
-
-ALTER TYPE data_typ 
-   ADD MEMBER FUNCTION qtr(der_qtr DATE) 
-   RETURN CHAR CASCADE;
-
-ALTER TYPE cust_address_typ
-   ADD ATTRIBUTE (phone phone_list_typ) CASCADE;
-
-ALTER TYPE phone_list_typ
-  MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;
-
-ALTER USER app_user1 
-   GRANT CONNECT THROUGH sh
-   WITH ROLE warehouse_user;
-
--- 10 Statements
-
-ALTER USER app_user1 IDENTIFIED GLOBALLY AS 'CN=tom,O=oracle,C=US';
-
-ALTER USER sidney 
-    IDENTIFIED BY second_2nd_pwd
-    DEFAULT TABLESPACE example; 
-
-ALTER VIEW customer_ro
-    COMPILE; 
-
-ANALYZE TABLE customers VALIDATE STRUCTURE ONLINE;
-
-ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE; 
-
-ANALYZE TABLE orders DELETE STATISTICS; 
-
-ASSOCIATE STATISTICS WITH PACKAGES emp_mgmt DEFAULT SELECTIVITY 10;
-
-AUDIT SELECT 
-    ON hr.employees
-    WHENEVER SUCCESSFUL; 
-
-AUDIT INSERT, UPDATE
-    ON oe.customers; 
-
-AUDIT DELETE ANY TABLE; 
-
--- 20 Statements
-
-AUDIT ROLE
-    WHENEVER SUCCESSFUL; 
-
-COMMENT ON COLUMN employees.job_id 
-   IS 'abbreviated job title';
-
-COMMIT WORK; 
-
-COMMIT  COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
-
-CREATE CLUSTER personnel
-   (department NUMBER(4))
-SIZE 512 
-STORAGE (initial 100K next 50K);
-
-CREATE CLUSTER address
-   (postal_code NUMBER, country_id CHAR(2))
-   HASHKEYS 20
-   HASH IS MOD(postal_code + country_id, 101);
-
-CREATE CLUSTER cust_orders (customer_id NUMBER(6))
-   SIZE 512 SINGLE TABLE HASHKEYS 100;
-
-CREATE CONTEXT hr_context USING emp_mgmt;
-
-CREATE CONTROLFILE REUSE DATABASE "demo" NORESETLOGS NOARCHIVELOG
-	    MAXLOGFILES 32
-	    MAXLOGMEMBERS 2
-	    MAXDATAFILES 32
-	    MAXINSTANCES 1
-	    MAXLOGHISTORY 449
-	LOGFILE
-	  GROUP 1 '/path/oracle/dbs/t_log1.f'  SIZE 500K,
-	  GROUP 2 '/path/oracle/dbs/t_log2.f'  SIZE 500K
-	# STANDBY LOGFILE
-	DATAFILE
-	  '/path/oracle/dbs/t_db1.f',
-	  '/path/oracle/dbs/dbu19i.dbf',
-	  '/path/oracle/dbs/tbs_11.f',
-	  '/path/oracle/dbs/smundo.dbf',
-	  '/path/oracle/dbs/demo.dbf'
-	CHARACTER SET WE8DEC
-	;
-
-CREATE DATABASE sample
-   CONTROLFILE REUSE 
-   LOGFILE
-      GROUP 1 ('diskx:log1.log', 'disky:log1.log') SIZE 50K, 
-      GROUP 2 ('diskx:log2.log', 'disky:log2.log') SIZE 50K 
-   MAXLOGFILES 5 
-   MAXLOGHISTORY 100 
-   MAXDATAFILES 10 
-   MAXINSTANCES 2 
-   ARCHIVELOG 
-   CHARACTER SET AL32UTF8
-   NATIONAL CHARACTER SET AL16UTF16
-   DATAFILE  
-      'disk1:df1.dbf' AUTOEXTEND ON,
-      'disk2:df2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
-   DEFAULT TEMPORARY TABLESPACE temp_ts
-   UNDO TABLESPACE undo_ts 
-   SET TIME_ZONE = '+02:00';
-
--- 30 Statements
-
-CREATE PUBLIC DATABASE LINK remote 
-   USING 'remote'; 
-
-CREATE DATABASE LINK local 
-   CONNECT TO hr IDENTIFIED BY hr
-   USING 'local';
-
-CREATE DIMENSION customers_dim 
-   LEVEL customer   IS (customers.cust_id)
-   LEVEL city       IS (customers.cust_city) 
-   LEVEL state      IS (customers.cust_state_province) 
-   LEVEL country    IS (countries.country_id) 
-   LEVEL subregion  IS (countries.country_subregion) 
-   LEVEL region     IS (countries.country_region) 
-   HIERARCHY geog_rollup (
-      customer      CHILD OF
-      city          CHILD OF 
-      state         CHILD OF 
-      country       CHILD OF 
-      subregion     CHILD OF 
-      region 
-   JOIN KEY (customers.country_id) REFERENCES country
-   )
-   ATTRIBUTE customer DETERMINES
-   (cust_first_name, cust_last_name, cust_gender, 
-    cust_marital_status, cust_year_of_birth, 
-    cust_income_level, cust_credit_limit) 
-   ATTRIBUTE country DETERMINES (countries.country_name)
-;
-
-CREATE DIRECTORY admin AS 'oracle/admin';
-
-CREATE OR REPLACE DIRECTORY bfile_dir AS '/private1/LOB/files';
-
-CREATE DISKGROUP dgroup_01
-  EXTERNAL REDUNDANCY
-  DISK '$ORACLE_HOME/disks/c*';
-  
-CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
-    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
-
-CREATE OR REPLACE FUNCTION text_length(a CLOB) 
-   RETURN NUMBER DETERMINISTIC IS
-	BEGIN 
-	  RETURN DBMS_LOB.GETLENGTH(a);
-	END;
-/
-
-CREATE INDEXTYPE position_indextype
-   FOR position_between(NUMBER, NUMBER, NUMBER)
-   USING position_im;
-
-CREATE JAVA SOURCE NAMED "Hello" AS
-   public class Hello {
-      public static String hello() {
-         return \"Hello World\";   } };
-
--- 40 Statements
-
-CREATE JAVA RESOURCE NAMED "appText" 
-   USING BFILE (bfile_dir, 'textBundle.dat');
-
-CREATE LIBRARY ext_lib AS '/OR/lib/ext_lib.so';
-/
-
-CREATE OR REPLACE LIBRARY ext_lib IS '/OR/newlib/ext_lib.so';
-/
-
-CREATE LIBRARY app_lib as '${ORACLE_HOME}/lib/app_lib.so'
-   AGENT 'sales.hq.acme.com';
-/
-   
-CREATE MATERIALIZED VIEW LOG ON employees
-   WITH PRIMARY KEY
-   INCLUDING NEW VALUES;
-
-CREATE MATERIALIZED VIEW all_customers
-   PCTFREE 5 PCTUSED 60 
-   TABLESPACE example 
-   STORAGE (INITIAL 50K NEXT 50K) 
-   USING INDEX STORAGE (INITIAL 25K NEXT 25K)
-   REFRESH START WITH ROUND(SYSDATE + 1) + 11/24 
-   NEXT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15/24 
-   AS SELECT * FROM sh.customers at remote 
-         UNION
-      SELECT * FROM sh.customers at local; 
-
-CREATE MATERIALIZED VIEW LOG ON product_information 
-   WITH ROWID, SEQUENCE (list_price, min_price, category_id) 
-   INCLUDING NEW VALUES;
-
-CREATE OPERATOR eq_op
-   BINDING (VARCHAR2, VARCHAR2) 
-   RETURN NUMBER 
-   USING eq_f; 
-
-CREATE OUTLINE salaries FOR CATEGORY special
-   ON SELECT last_name, salary FROM employees;
-
-CREATE OR REPLACE OUTLINE public_salaries 
-   FROM PRIVATE my_salaries;
-
--- 50 Statements so far

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/postgres_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,609 +0,0 @@
--- Postgres SQL Statements from postgressql-8.4.1-US.pdf
---
--- Extracted 10/5/2009
-
---COMMENT ON
---{
---  TABLE object_name |
---  COLUMN table_name.column_name |
---  AGGREGATE agg_name (agg_type [, ...] ) |
---  CAST (sourcetype AS targettype) |
---  CONSTRAINT constraint_name ON table_name |
---  CONVERSION object_name |
---  DATABASE object_name |
---  DOMAIN object_name |
---  FUNCTION func_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |
---  INDEX object_name |
---  LARGE OBJECT large_object_oid |
---  OPERATOR op (leftoperand_type, rightoperand_type) |
---  OPERATOR CLASS object_name USING index_method |
---  OPERATOR FAMILY object_name USING index_method |
---  [ PROCEDURAL ] LANGUAGE object_name |
---  ROLE object_name |
---  RULE rule_name ON table_name |
---  SCHEMA object_name |
---  SEQUENCE object_name |
---  TABLESPACE object_name |
---  TEXT SEARCH CONFIGURATION object_name |
---  TEXT SEARCH DICTIONARY object_name |
---  TEXT SEARCH PARSER object_name |
---  TEXT SEARCH TEMPLATE object_name |
---  TRIGGER trigger_name ON table_name |
---  TYPE object_name |
---  VIEW object_name
---} IS 'text'
-
-COMMENT ON TABLE mytable IS 'This is my table.';
-COMMENT ON TABLE mytable IS NULL;
-COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Computes sample variance';
-COMMENT ON CAST (text AS int4) IS 'Allow casts from text to int4';
-COMMENT ON COLUMN my_table.my_column IS 'Employee ID number';
-COMMENT ON CONVERSION my_conv IS 'Conversion to UTF8';
-COMMENT ON DATABASE my_database IS 'Development Database';
-COMMENT ON DOMAIN my_domain IS 'Email Address Domain';
-COMMENT ON FUNCTION my_function (timestamp) IS 'Returns Roman Numeral';
-COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee ID';
--- 10 STATEMENTS *******************************************************
-COMMENT ON LANGUAGE plpython IS 'Python support for stored procedures';
-COMMENT ON LARGE OBJECT 346344 IS 'Planning document';
-COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of two texts';
-COMMENT ON OPERATOR - (NONE, text) IS 'This is a prefix operator on text';
-COMMENT ON OPERATOR CLASS int4ops USING btree IS '4 byte integer operators for btrees';
-COMMENT ON OPERATOR FAMILY integer_ops USING btree IS 'all integer operators for btrees';
-COMMENT ON ROLE my_role IS 'Administration group for finance tables';
-COMMENT ON RULE my_rule ON my_table IS 'Logs updates of employee records';
-COMMENT ON SCHEMA my_schema IS 'Departmental data';
-COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys';
--- 20 STATEMENTS *******************************************************
-COMMENT ON TABLE my_schema.my_table IS 'Employee Information';
-COMMENT ON TABLESPACE my_tablespace IS 'Tablespace for indexes';
-COMMENT ON TEXT SEARCH CONFIGURATION my_config IS 'Special word filtering';
-COMMENT ON TEXT SEARCH DICTIONARY swedish IS 'Snowball stemmer for swedish language';
-COMMENT ON TEXT SEARCH PARSER my_parser IS 'Splits text into words';
-COMMENT ON TEXT SEARCH TEMPLATE snowball IS 'Snowball stemmer';
-COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for RI';
-COMMENT ON TYPE complex IS 'Complex number data type';
-COMMENT ON VIEW my_view IS 'View of departmental costs';
---COMMIT [ WORK | TRANSACTION ]
-
-COMMIT WORK;
--- 30 STATEMENTS *******************************************************
-COMMIT TRANSACTION;
-
-COMMIT;
-
---COMMIT PREPARED transaction_id;
-
-COMMIT PREPARED 'foobar';
-
---COPY tablename [ ( column [, ...] ) ]
---    FROM { 'filename' | STDIN }
---    [ [ WITH ]
---           [ BINARY ]
---           [ OIDS ]
---           [ DELIMITER [ AS ] 'delimiter ' ]
---           [ NULL [ AS ] 'null string ' ]
---           [ CSV [ HEADER ]
---                 [ QUOTE [ AS ] 'quote' ]
---                 [ ESCAPE [ AS ] 'escape' ]
---                 [ FORCE NOT NULL column [, ...] ]
---COPY { tablename [ ( column [, ...] ) ] | ( query ) }
---    TO { 'filename' | STDOUT }
---    [ [ WITH ]
---           [ BINARY ]
---           [ OIDS ]
---           [ DELIMITER [ AS ] 'delimiter ' ]
---           [ NULL [ AS ] 'null string ' ]
---           [ CSV [ HEADER ]
---                 [ QUOTE [ AS ] 'quote' ]
---                 [ ESCAPE [ AS ] 'escape' ]
---                 [ FORCE QUOTE column [, ...] ]
-
-COPY country TO STDOUT WITH DELIMITER '|';
-
-COPY country FROM '/usr1/proj/bray/sql/country_data';
-
-COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_co';
-
---CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
---    SFUNC = sfunc,
---    STYPE = state_data_type
---    [ , FINALFUNC = ffunc ]
---    [ , INITCOND = initial_condition ]
---    [ , SORTOP = sort_operator ]
---)
---or the old syntax
---CREATE AGGREGATE name (
---    BASETYPE = base_type,
---    SFUNC = sfunc,
---    STYPE = state_data_type
---    [ , FINALFUNC = ffunc ]
---    [ , INITCOND = initial_condition ]
---    [ , SORTOP = sort_operator ]
---)
-
-
---CREATE CAST (sourcetype AS targettype)
---    WITH FUNCTION funcname (argtypes)
---    [ AS ASSIGNMENT | AS IMPLICIT ]
---CREATE CAST (sourcetype AS targettype)
---    WITHOUT FUNCTION
---    [ AS ASSIGNMENT | AS IMPLICIT ]
---CREATE CAST (sourcetype AS targettype)
---    WITH INOUT
---    [ AS ASSIGNMENT | AS IMPLICIT ]
-
-CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;
-
---CREATE CONSTRAINT TRIGGER name
---    AFTER event [ OR ... ]
---    ON table_name
---    [ FROM referenced_table_name ]
---    { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
---    FOR EACH ROW
---    EXECUTE PROCEDURE funcname ( arguments )
-
---CREATE [ DEFAULT ] CONVERSION name
---    FOR source_encoding TO dest_encoding FROM funcname
-
-CREATE CONVERSION myconv FOR 'UTF8' TO 'LATIN1' FROM myfunc;
-
---CREATE DATABASE name
---    [ [ WITH ] [ OWNER [=] dbowner ]
---           [ TEMPLATE [=] template ]
---           [ ENCODING [=] encoding ]
---           [ LC_COLLATE [=] lc_collate ]
---           [ LC_CTYPE [=] lc_ctype ]
---           [ TABLESPACE [=] tablespace ]
---           [ CONNECTION LIMIT [=] connlimit ] ]
-
-CREATE DATABASE lusiadas;
-
-CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
--- 40 STATEMENTS *******************************************************
-CREATE DATABASE music ENCODING 'LATIN1' TEMPLATE template0;
-
-
---CREATE DOMAIN name [ AS ] data_type
---    [ DEFAULT expression ]
---    [ constraint [ ... ] ]
---where constraint is:
---[ CONSTRAINT constraint_name ]
---{ NOT NULL | NULL | CHECK (expression) }
-
-CREATE DOMAIN us_postal_code AS TEXT
-	CHECK(
-	   VALUE ~ '^\\d{5}$'
-	OR VALUE ~ '^\\d{5}-\\d{4}$'
-	);
-
---CREATE FOREIGN DATA WRAPPER name
---    [ VALIDATOR valfunction | NO VALIDATOR ]
---    [ OPTIONS ( option 'value' [, ... ] ) ]
-
-CREATE FOREIGN DATA WRAPPER dummy;
-
-CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
-
-CREATE FOREIGN DATA WRAPPER mywrapper
-    OPTIONS (debug 'true');
-
---CREATE [ OR REPLACE ] FUNCTION
---    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } defexpr ] [, ...] ] )
---    [ RETURNS rettype
---      | RETURNS TABLE ( colname coltype [, ...] ) ]
---  { LANGUAGE langname
---    | WINDOW
---    | IMMUTABLE | STABLE | VOLATILE
---    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
---    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
---    | COST execution_cost
---    | ROWS result_rows
---    | SET configuration_parameter { TO value | = value | FROM CURRENT }
---    | AS 'definition'
---    | AS 'obj_file', 'link_symbol'
---  } ...
---    [ WITH ( attribute [, ...] ) ]
-
-CREATE FUNCTION add(integer, integer) RETURNS integer
-    AS 'select $1 + $2;'
-    LANGUAGE SQL
-    IMMUTABLE
-    RETURNS NULL ON NULL INPUT;
-
-CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
-        BEGIN
-                RETURN i + 1;
-        END;
-
-CREATE FUNCTION dup(in int, out f1 int, out f2 text)
-    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
-    LANGUAGE SQL;
-
-CREATE FUNCTION dup(int) RETURNS dup_result
-    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
-    LANGUAGE SQL;
-
-CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
-    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
-    LANGUAGE SQL;
--- 50 STATEMENTS *******************************************************
---CREATE GROUP name [ [ WITH ] option [ ... ] ]
---where option can be:
---      SUPERUSER | NOSUPERUSER
---    | CREATEDB | NOCREATEDB
---    | CREATEROLE | NOCREATEROLE
---    | CREATEUSER | NOCREATEUSER
---    | INHERIT | NOINHERIT
---    | LOGIN | NOLOGIN
---    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password '
---    | VALID UNTIL 'timestamp'
---    | IN ROLE rolename [, ...]
---    | IN GROUP rolename [, ...]
---    | ROLE rolename [, ...]
---    | ADMIN rolename [, ...]
---    | USER rolename [, ...]
---    | SYSID uid
-
---CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]
---    ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ..
---    [ WITH ( storage_parameter = value [, ... ] ) ]
---    [ TABLESPACE tablespace ]
---    [ WHERE predicate ]
-
-CREATE UNIQUE INDEX title_idx ON films (title);
-
-CREATE INDEX lower_title_idx ON films ((lower(title)));
-
-CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);
-
-CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);
-
-CREATE INDEX gin_idx ON documents_table (locations) WITH (fastupdate = off);
-
-CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;
-
-CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);
-
---CREATE [ PROCEDURAL ] LANGUAGE name
---CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
---    HANDLER call_handler [ VALIDATOR valfunction ]
-
-CREATE LANGUAGE plpgsql;
-
-CREATE PROCEDURAL LANGUAGE plpgsql;
-
-CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql;
--- 60 STATEMENTS *******************************************************
-CREATE LANGUAGE plsample
-    HANDLER plsample_call_handler;
-
---CREATE OPERATOR name (
---    PROCEDURE = funcname
---    [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]
---    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
---    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
---    [, HASHES ] [, MERGES ]
---)
-
-CREATE OPERATOR === (
-    LEFTARG = box,
-    RIGHTARG = box,
-    PROCEDURE = area_equal_procedure,
-    COMMUTATOR = ===,
-    NEGATOR = !==,
-    RESTRICT = area_restriction_procedure,
-    JOIN = area_join_procedure,
-    HASHES, MERGES
-);
-
---CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
---  USING index_method [ FAMILY family_name ] AS
---  { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ]
---   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )
---   | STORAGE storage_type
---  } [, ... ]
-
-CREATE OPERATOR CLASS gist__int_ops
-    DEFAULT FOR TYPE _int4 USING gist AS
-        OPERATOR        3       &&,
-        OPERATOR        6       = (anyarray, anyarray),
-        OPERATOR        7       @>,
-                                <@,
-        OPERATOR        8
-        OPERATOR        20      @@ (_int4, query_int),
-        FUNCTION        1       g_int_consistent (internal, _int4, int, oid, internal),
-        FUNCTION        2       g_int_union (internal, internal),
-        FUNCTION        3       g_int_compress (internal),
-        FUNCTION        4       g_int_decompress (internal),
-        FUNCTION        5       g_int_penalty (internal, internal, internal),
-        FUNCTION        6       g_int_picksplit (internal, internal),
-        FUNCTION        7       g_int_same (_int4, _int4, internal);
-
---CREATE OPERATOR FAMILY name USING index_method
-
-CREATE OPERATOR FAMILY name USING index_method;
-
---CREATE ROLE name [ [ WITH ] option [ ... ] ]
---where option can be:
---      SUPERUSER | NOSUPERUSER
---    | CREATEDB | NOCREATEDB
---    | CREATEROLE | NOCREATEROLE
---    | CREATEUSER | NOCREATEUSER
---    | INHERIT | NOINHERIT
---    | LOGIN | NOLOGIN
---    | CONNECTION LIMIT connlimit
---    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password '
---    | VALID UNTIL 'timestamp'
---    | IN ROLE rolename [, ...]
---    | IN GROUP rolename [, ...]
---    | ROLE rolename [, ...]
---    | ADMIN rolename [, ...]
---    | USER rolename [, ...]
---    | SYSID uid
-
-CREATE ROLE jonathan LOGIN;
-
-CREATE USER davide WITH PASSWORD 'jw8s0F4';
-
-CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
-
-CREATE ROLE admin WITH CREATEDB CREATEROLE;
-
---CREATE [ OR REPLACE ] RULE name AS ON event
---    TO table [ WHERE condition ]
---    DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }
-
-CREATE RULE "_RETURN" AS
-    ON SELECT TO t1
-    DO INSTEAD
-        SELECT * FROM t2;
-    
-CREATE RULE "_RETURN" AS
-    ON SELECT TO t2
-    DO INSTEAD
-        SELECT * FROM t1;
--- 70 STATEMENTS *******************************************************
-CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable;
-
---CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]
---CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]
-
-CREATE SCHEMA myschema;
-
-CREATE SCHEMA AUTHORIZATION joe;
-
-CREATE SCHEMA hollywood
-    CREATE TABLE films (title text, release date, awards text[])
-    CREATE VIEW winners AS
-        SELECT title, release FROM films WHERE awards IS NOT NULL;
-
---CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
---    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
---    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
---    [ OWNED BY { table.column | NONE } ]
-
-CREATE SEQUENCE serial START 101;
-
---CREATE SERVER servername [ TYPE 'servertype' ] [ VERSION 'serverversion' ]
---    FOREIGN DATA WRAPPER fdwname
---    [ OPTIONS ( option 'value' [, ... ] ) ]
-
-CREATE SERVER foo FOREIGN DATA WRAPPER "default";
-
-CREATE SERVER myserver FOREIGN DATA WRAPPER pgsql OPTIONS (host 'foo', dbname 'foodb', port);
-       
---CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name 
---  ( [
---      { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ] 
---          | table_constraint 
---          | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] .
---      [, ... ] 
---  ] )
---[ INHERITS ( parent_table [, ... ] ) ]
---[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
---[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
---[ TABLESPACE tablespace ]
---where column_constraint is:
---[ CONSTRAINT constraint_name ]
---{ NOT NULL |
---  NULL |
---  UNIQUE index_parameters |
---  PRIMARY KEY index_parameters |
---  CHECK ( expression ) |
---  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
---    [ ON DELETE action ] [ ON UPDATE action ] }
---[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
---and table_constraint is:
---[ CONSTRAINT constraint_name ]
---{ UNIQUE ( column_name [, ... ] ) index_parameters |
---  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
---  CHECK ( expression ) |
---  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
---    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] 
---[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
---index_parameters in UNIQUE and PRIMARY KEY constraints are:
---[ WITH ( storage_parameter [= value] [, ... ] ) ]
---[ USING INDEX TABLESPACE tablespace ]
-
-CREATE TABLE films (
-    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
-    title       varchar(40) NOT NULL,
-    did         integer NOT NULL,
-    date_prod   date,
-    kind        varchar(10),
-    len         interval hour to minute
-);
-
-CREATE TABLE distributors (
-     did    integer PRIMARY KEY DEFAULT nextval('serial'),
-     name   varchar(40) NOT NULL CHECK (name <> ?)
-     
-);
-
-CREATE TABLE array_int (
-    vector int[][]
-);
--- 80 STATEMENTS *******************************************************
-CREATE TABLE films (
-    code        char(5),
-    title       varchar(40),
-    did         integer,
-    date_prod   date,
-    kind        varchar(10),
-    len         interval hour to minute,
-    CONSTRAINT production UNIQUE(date_prod)
-);
-
-CREATE TABLE distributors (
-    did        integer CHECK (did > 100),
-    name    varchar(40)
-);
-
-CREATE TABLE distributors (
-    did     integer,
-    name    varchar(40)
-    CONSTRAINT con1 CHECK (did > 100 AND name <> ?)
-);
-
-CREATE TABLE films (
-    code        char(5),
-    title       varchar(40),
-    did         integer,
-    date_prod   date,
-    kind        varchar(10),
-    len         interval hour to minute,
-    CONSTRAINT code_title PRIMARY KEY(code,title)
-);
-
-CREATE TABLE films (
-    code        char(5),
-    title       varchar(40),
-    did         integer,
-    date_prod   date,
-    kind        varchar(10),
-    len         interval hour to minute,
-    CONSTRAINT code_title PRIMARY KEY(code,title)
-);
-
-CREATE TABLE distributors (
-    name      varchar(40) DEFAULT 'Luso Films',
-    did       integer DEFAULT nextval('distributors_serial'),
-    modtime   timestamp DEFAULT current_timestamp
-);
-
-CREATE TABLE distributors (
-    did     integer CONSTRAINT no_null NOT NULL,
-    name    varchar(40) NOT NULL
-);
-
-CREATE TABLE distributors (
-    did     integer,
-    name    varchar(40) UNIQUE
-);
-
-CREATE TABLE distributors (
-    did     integer,
-    name    varchar(40),
-    UNIQUE(name)
-);
-
-CREATE TABLE distributors (
-    did     integer,
-    name    varchar(40),
-    UNIQUE(name) WITH (fillfactor=70)
-)
-WITH (fillfactor=70);
--- 90 STATEMENTS *******************************************************
-CREATE TABLE cinemas (
-        id serial,
-        name text,
-        location text
-) TABLESPACE diskvol1;
-
---CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
---    [ (column_name [, ...] ) ]
---    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
---    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
---    [ TABLESPACE tablespace ]
---    AS query
---          [ WITH [ NO ] DATA ]
-
-CREATE TABLE films_recent AS
-  SELECT * FROM films WHERE date_prod >= '2002-01-01';
-
-CREATE TABLE films2 AS
-  TABLE films;
-
-CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS
-  EXECUTE recentfilms('2002-01-01');
-
---CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory '
-
-CREATE TABLESPACE dbspace LOCATION '/data/dbs';
-
-CREATE TABLESPACE indexspace OWNER genevieve LOCATION '/data/indexes';
-
---CREATE TEXT SEARCH CONFIGURATION name (
---    PARSER = parser_name |
---    COPY = source_config
---)
-
-CREATE TEXT SEARCH CONFIGURATION my_search_config (
-    PARSER = my_parser
-);
-
---CREATE TEXT SEARCH DICTIONARY name (
---    TEMPLATE = template
---    [, option = value [, ... ]]
---)
-
-CREATE TEXT SEARCH DICTIONARY my_russian (
-    template = snowball,
-    language = russian,
-    stopwords = myrussian
-);
-
---CREATE TEXT SEARCH PARSER name (
---    START = start_function ,
---    GETTOKEN = gettoken_function ,
---    END = end_function ,
---    LEXTYPES = lextypes_function
---    [, HEADLINE = headline_function ]
---)
-
-CREATE TEXT SEARCH PARSER my_search_parser (
-    START = startNow(),
-    GETTOKEN = getToken(),
-    END = end(),
-    LEXTYPES = getLexTypes()
-);
-
---CREATE TEXT SEARCH TEMPLATE name (
---    [ INIT = init_function , ]
---    LEXIZE = lexize_function
---)
-
-CREATE TEXT SEARCH TEMPLATE my_search_template (
-    LEXIZE = lexizeNow()
-);
-
---CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
---    ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
---    EXECUTE PROCEDURE funcname ( arguments )
--- 100 STATEMENTS *******************************************************
-CREATE TRIGGER trigger_name BEFORE dawn
-    ON table
-    EXECUTE PROCEDURE funcname ( 'arg1', 'arg2' );
-
-ALTER TABLE foreign_companies RENAME COLUMN address TO city;
-
-ALTER TABLE us_companies RENAME TO suppliers;
-
-ALTER TABLE old_addresses ALTER COLUMN street SET NOT NULL;
-
-ALTER TABLE new_addresses ALTER COLUMN street DROP NOT NULL;
-
-GRANT EXECUTE ON FUNCTION divideByTwo(numerator int, IN demoninator int) TO george;
-
--- 106 STATEMENTS *******************************************************

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/revoke_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/revoke_test_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/revoke_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -0,0 +1,7 @@
+REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;
+
+REVOKE UPDATE, USAGE ON TABLE orderDetails FROM anita,zhi CASCADE;
+
+REVOKE SELECT ON TABLE orders.bills FROM PUBLIC RESTRICT;
+
+REVOKE INSERT(a, b, c) ON TABLE orderSummaries FROM purchases_reader_role;
\ No newline at end of file

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-05 20:33:13 UTC (rev 1530)
@@ -36,14 +36,3 @@
 CREATE TABLE HOTELAVAILABILITY
      (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
     ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
-
-GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
-
-GRANT UPDATE, USAGE ON TABLE billedOrders TO anita,zhi;
-
-GRANT SELECT ON TABLE orders.bills to PUBLIC;
-
-GRANT INSERT(a, b, c) ON TABLE purchaseOrders TO purchases_reader_role;
-
-
-

Deleted: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/test_cnd.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/test_cnd.cnd	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/test_cnd.cnd	2010-01-05 20:33:13 UTC (rev 1530)
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-  
-// =============================================================================
-// STATEMENT
-// =============================================================================
-[ddl:statement] mixin abstract
-  - ddl:expression (string) mandatory
-  + * (ddl:ddlProblem) = ddl:ddlProblem multiple
-  
-// =============================================================================
-// CREATE SCHEMA
-// =============================================================================
-[ddl:schemaDefinition] > ddl:statement  mixin
-  - ddl:defaultCharacterSetName (STRING)
-  + * (ddl:statement) = ddl:statement multiple
-  
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
-  - ddl:problemLevel (LONG) mandatory
-  - ddl:message (STRING) mandatory
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -38,6 +38,7 @@
     public static final String DROP = "DROP";
     public static final String FOREIGN = "FOREIGN";
     public static final String GRANT = "GRANT";
+    public static final String REVOKE = "REVOKE";
     public static final String INDEX = "INDEX";
     public static final String INSERT = "INSERT";
     public static final String UPDATE = "UPDATE";
@@ -99,7 +100,8 @@
         public static final String[] STMT_CREATE_TRANSLATION = {CREATE, "TRANSLATION"};
         public static final String[] STMT_ALTER_TABLE = {ALTER, TABLE};
         public static final String[] STMT_ALTER_DOMAIN = {ALTER, "DOMAIN"};
-        public static final String[] STMT_GRANT = {"GRANT"};
+        public static final String[] STMT_GRANT = {GRANT};
+        public static final String[] STMT_REVOKE = {REVOKE};
         public static final String[] STMT_DROP_SCHEMA = {DROP, SCHEMA};
         public static final String[] STMT_DROP_TABLE = {DROP, TABLE};
         public static final String[] STMT_DROP_VIEW = {DROP, VIEW};
@@ -114,9 +116,9 @@
         public final static String[][] SQL_92_ALL_PHRASES = {STMT_CREATE_SCHEMA, STMT_CREATE_TABLE,
             STMT_CREATE_GLOBAL_TEMPORARY_TABLE, STMT_CREATE_LOCAL_TEMPORARY_TABLE, STMT_CREATE_VIEW, STMT_CREATE_OR_REPLACE_VIEW,
             STMT_CREATE_ASSERTION, STMT_CREATE_CHARACTER_SET, STMT_CREATE_COLLATION, STMT_CREATE_TRANSLATION, STMT_CREATE_DOMAIN,
-            STMT_ALTER_TABLE, STMT_ALTER_DOMAIN, STMT_GRANT, STMT_DROP_SCHEMA, STMT_DROP_TABLE, STMT_DROP_VIEW, STMT_DROP_DOMAIN,
-            STMT_DROP_CHARACTER_SET, STMT_DROP_COLLATION, STMT_DROP_TRANSLATION, STMT_DROP_ASSERTION, STMT_INSERT_INTO,
-            STMT_SET_DEFINE};
+            STMT_ALTER_TABLE, STMT_ALTER_DOMAIN, STMT_GRANT, STMT_REVOKE, STMT_DROP_SCHEMA, STMT_DROP_TABLE, STMT_DROP_VIEW,
+            STMT_DROP_DOMAIN, STMT_DROP_CHARACTER_SET, STMT_DROP_COLLATION, STMT_DROP_TRANSLATION, STMT_DROP_ASSERTION,
+            STMT_INSERT_INTO, STMT_SET_DEFINE};
 
         // <schema definition>
         // | <table definition>

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -100,6 +100,12 @@
     public static final Name TYPE_GRANT_ON_COLLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnCollationStatement");
     public static final Name TYPE_GRANT_ON_CHARACTER_SET_STATEMENT = new BasicName(Namespace.URI, "grantOnCharacterSetStatement");
     public static final Name TYPE_GRANT_ON_TRANSLATION_STATEMENT = new BasicName(Namespace.URI, "grantOnTranslationStatement");
+    public static final Name TYPE_REVOKE_STATEMENT = new BasicName(Namespace.URI, "revokeStatement");
+    public static final Name TYPE_REVOKE_ON_TABLE_STATEMENT = new BasicName(Namespace.URI, "revokeOnTableStatement");
+    public static final Name TYPE_REVOKE_ON_DOMAIN_STATEMENT = new BasicName(Namespace.URI, "revokeOnDomainStatement");
+    public static final Name TYPE_REVOKE_ON_COLLATION_STATEMENT = new BasicName(Namespace.URI, "revokeOnCollationStatement");
+    public static final Name TYPE_REVOKE_ON_CHARACTER_SET_STATEMENT = new BasicName(Namespace.URI, "revokeOnCharacterSetStatement");
+    public static final Name TYPE_REVOKE_ON_TRANSLATION_STATEMENT = new BasicName(Namespace.URI, "revokeOnTranslationStatement");
     public static final Name TYPE_SET_STATEMENT = new BasicName(Namespace.URI, "setStatement");
     public static final Name TYPE_INSERT_STATEMENT = new BasicName(Namespace.URI, "insertStatement");
 

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -276,6 +276,8 @@
             stmtNode = parseSetStatement(tokens, node);
         } else if (tokens.matches(GRANT)) {
             stmtNode = parseGrantStatement(tokens, node);
+        } else if( tokens.matches(REVOKE)) {
+            stmtNode = parseRevokeStatement(tokens, node);
         }
 
         if (stmtNode == null) {
@@ -807,39 +809,38 @@
 
         tokens.consume("GRANT");
 
-            if( tokens.canConsume("ALL", "PRIVILEGES")) {
-                allPrivileges = true;
-            } else { 
-                parseGrantPrivileges(tokens, privileges);
-            }
-            tokens.consume("ON");
+        if( tokens.canConsume("ALL", "PRIVILEGES")) {
+            allPrivileges = true;
+        } else { 
+            parseGrantPrivileges(tokens, privileges);
+        }
+        tokens.consume("ON");
 
-            if( tokens.canConsume("DOMAIN") ) {
-                String name = parseName(tokens);
-                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_DOMAIN_STATEMENT);
-            } else if( tokens.canConsume("COLLATION")) {
-                String name = parseName(tokens);
-                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_COLLATION_STATEMENT);
-            } else if( tokens.canConsume("CHARACTER", "SET")) {
-                String name = parseName(tokens);
-                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_CHARACTER_SET_STATEMENT);
-            } else if( tokens.canConsume("TRANSLATION")) {
-                String name = parseName(tokens);
-                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TRANSLATION_STATEMENT);
-            } else {
-                tokens.canConsume(TABLE); // OPTIONAL
-                String name = parseName(tokens);
-                grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
-            }
-
+        if( tokens.canConsume("DOMAIN") ) {
+            String name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_DOMAIN_STATEMENT);
+        } else if( tokens.canConsume("COLLATION")) {
+            String name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_COLLATION_STATEMENT);
+        } else if( tokens.canConsume("CHARACTER", "SET")) {
+            String name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_CHARACTER_SET_STATEMENT);
+        } else if( tokens.canConsume("TRANSLATION")) {
+            String name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TRANSLATION_STATEMENT);
+        } else {
+            tokens.canConsume(TABLE); // OPTIONAL
+            String name = parseName(tokens);
+            grantNode = nodeFactory().node(name, parentNode, TYPE_GRANT_ON_TABLE_STATEMENT);
+        }
             
-            // Attach privileges to grant node
-            for( AstNode node : privileges ) {
-                node.setParent(grantNode);
-            }
-            if( allPrivileges ) {
-                grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
-            }
+        // Attach privileges to grant node
+        for( AstNode node : privileges ) {
+            node.setParent(grantNode);
+        }
+        if( allPrivileges ) {
+            grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+        }
 
         
         tokens.consume("TO");
@@ -850,7 +851,7 @@
         } while( tokens.canConsume(COMMA));
         
         if( tokens.canConsume("WITH", "GRANT", "OPTION")) {
-            grantNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+            grantNode.setProperty(WITH_GRANT_OPTION, "WITH GRANT OPTION");
         }
         
         markEndOfStatement(tokens, grantNode);
@@ -909,6 +910,93 @@
         } while( tokens.canConsume(COMMA));
 
     }
+    
+    protected AstNode parseRevokeStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        assert tokens.matches(REVOKE);
+        
+        markStartOfStatement(tokens);
+        
+        //    <revoke statement> ::=
+        //        REVOKE [ GRANT OPTION FOR ]
+        //            <privileges>
+        //            ON <object name>
+        //            FROM <grantee> [ { <comma> <grantee> }... ] <drop behavior>
+        
+        AstNode revokeNode = null;
+        boolean allPrivileges = false;
+        boolean withGrantOption = false;
+
+        List<AstNode> privileges = new ArrayList<AstNode>();
+
+        tokens.consume("REVOKE");
+        
+        withGrantOption = tokens.canConsume("WITH", "GRANT", "OPTION");
+
+        if( tokens.canConsume("ALL", "PRIVILEGES")) {
+            allPrivileges = true;
+        } else { 
+            parseGrantPrivileges(tokens, privileges);
+        }
+        tokens.consume("ON");
+
+        if( tokens.canConsume("DOMAIN") ) {
+            String name = parseName(tokens);
+            revokeNode = nodeFactory().node(name, parentNode, TYPE_REVOKE_ON_DOMAIN_STATEMENT);
+        } else if( tokens.canConsume("COLLATION")) {
+            String name = parseName(tokens);
+            revokeNode = nodeFactory().node(name, parentNode, TYPE_REVOKE_ON_COLLATION_STATEMENT);
+        } else if( tokens.canConsume("CHARACTER", "SET")) {
+            String name = parseName(tokens);
+            revokeNode = nodeFactory().node(name, parentNode, TYPE_REVOKE_ON_CHARACTER_SET_STATEMENT);
+        } else if( tokens.canConsume("TRANSLATION")) {
+            String name = parseName(tokens);
+            revokeNode = nodeFactory().node(name, parentNode, TYPE_REVOKE_ON_TRANSLATION_STATEMENT);
+        } else {
+            tokens.canConsume(TABLE); // OPTIONAL
+            String name = parseName(tokens);
+            revokeNode = nodeFactory().node(name, parentNode, TYPE_REVOKE_ON_TABLE_STATEMENT);
+        }
+        
+        // Attach privileges to grant node
+        for( AstNode node : privileges ) {
+            node.setParent(revokeNode);
+        }
+        
+        if( allPrivileges ) {
+            revokeNode.setProperty(ALL_PRIVILEGES, allPrivileges);
+        }
+
+        tokens.consume("FROM");
+        
+        do {
+            String grantee = parseName(tokens);
+            nodeFactory().node(grantee, revokeNode, GRANTEE);
+        } while( tokens.canConsume(COMMA));
+        
+        String behavior = null;
+        
+        if (tokens.canConsume("CASCADE")) {
+            behavior = "CASCADE";
+        } else if (tokens.canConsume("RESTRICT")) {
+            behavior = "RESTRICT";
+        }
+        
+        if (behavior != null) {
+            revokeNode.setProperty(DROP_BEHAVIOR, behavior);
+        }
+        
+        if( withGrantOption ) {
+            revokeNode.setProperty(WITH_GRANT_OPTION, "WITH GRANT OPTION");
+        }
+        
+        markEndOfStatement(tokens, revokeNode);
+
+        return revokeNode;
+    }
+    
     /**
      * Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
      * 

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -199,7 +199,6 @@
 		static final String[] STMT_NOAUDIT = {"NOAUDIT"};
 		static final String[] STMT_PURGE = {"PURGE"};
 		static final String[] STMT_RENAME = {"RENAME"};
-		static final String[] STMT_REVOKE = {"REVOKE"};
 		static final String[] STMT_ROLLBACK_TO_SAVEPOINT = {"ROLLBACK", "TO", "SAVEPOINT"};
 		static final String[] STMT_ROLLBACK_WORK = {"ROLLBACK", "WORK"};
 		static final String[] STMT_ROLLBACK = {"ROLLBACK"};
@@ -217,7 +216,7 @@
 		static final String[][] MISC_PHRASES = {
 			STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT, STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
 			STMT_EXPLAIN_PLAN, STMT_FLASHBACK, STMT_LOCK_TABLE, STMT_MERGE, STMT_NOAUDIT, STMT_PURGE, 
-			STMT_RENAME, STMT_REVOKE, STMT_ROLLBACK_TO_SAVEPOINT, STMT_ROLLBACK_WORK, STMT_ROLLBACK, STMT_SAVEPOINT, STMT_TRUNCATE
+			STMT_RENAME, STMT_ROLLBACK_TO_SAVEPOINT, STMT_ROLLBACK_WORK, STMT_ROLLBACK, STMT_SAVEPOINT, STMT_TRUNCATE
 		};
 		
 	    // CREATE TABLE, CREATE VIEW, and GRANT statements.

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -267,8 +267,6 @@
             return parseStatement(tokens, STMT_PURGE, parentNode, TYPE_PURGE_STATEMENT);
         } else if (tokens.matches(STMT_RENAME)) {
             return parseStatement(tokens, STMT_RENAME, parentNode, TYPE_RENAME_STATEMENT);
-        } else if (tokens.matches(STMT_REVOKE)) {
-            return parseStatement(tokens, STMT_REVOKE, parentNode, TYPE_REVOKE_STATEMENT);
         } else if (tokens.matches(STMT_ROLLBACK)) {
             return parseStatement(tokens, STMT_ROLLBACK, parentNode, TYPE_ROLLBACK_STATEMENT);
         } else if (tokens.matches(STMT_ROLLBACK_WORK)) {
@@ -580,7 +578,19 @@
         // return super.parseGrantStatement(tokens, parentNode);
     }
 
+    
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.jboss.dna.sequencer.ddl.StandardDdlParser#parseRevokeStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream, org.jboss.dna.sequencer.ddl.node.AstNode)
+     */
     @Override
+    protected AstNode parseRevokeStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        return parseStatement(tokens, STMT_REVOKE, parentNode, TYPE_REVOKE_STATEMENT);
+    }
+
+    @Override
     protected AstNode parseAlterTableStatement( DdlTokenStream tokens,
                                                 AstNode parentNode ) throws ParsingException {
         assert tokens != null;

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 19:16:20 UTC (rev 1529)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-05 20:33:13 UTC (rev 1530)
@@ -847,4 +847,17 @@
         assertThat(true, is(success));
         assertThat(rootNode.getChildCount(), is(4));
     }
+    
+    @Test
+    public void shouldParseRevokeStatements() {
+        printTest("shouldParseRevokeStatements()");
+        String content = "REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;" + NEWLINE
+            + "REVOKE UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi CASCADE;" + NEWLINE
+            + "REVOKE SELECT ON TABLE orders.bills FROM PUBLIC RESTRICT;" + NEWLINE
+            + "REVOKE INSERT(a, b, c) ON TABLE purchaseOrders FROM purchases_reader_role;";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(4));
+    }
 }


From dna-commits at lists.jboss.org  Tue Jan  5 15:33:47 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 15:33:47 -0500
Subject: [dna-commits] DNA SVN: r1531 -
	trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/extensions.
Message-ID: <201001052033.o05KXlhT008334@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-05 15:33:47 -0500 (Tue, 05 Jan 2010)
New Revision: 1531

Removed:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/extensions/sequencer/
Log:
removing unneeded empty package


From dna-commits at lists.jboss.org  Tue Jan  5 19:36:37 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 19:36:37 -0500
Subject: [dna-commits] DNA SVN: r1532 -
	trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta.
Message-ID: <201001060036.o060abXY028711@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 19:36:37 -0500 (Tue, 05 Jan 2010)
New Revision: 1532

Modified:
   trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
Log:
DNA-623 JDBC Metadata TCK Test Failing in Nightly Integration Build

Now that the query tests are enabled, the TCK test is running XPathPosIndexTest against all of the connectors.  This test has a written prerequisite (in Javadoc) that the root node have at least 3 child nodes named the same as the value of the "nodeName1" property.  However, the test checks for a different precondition (more than three child nodes in total).

Since the JDBC Metadata connector doesn't support same-name siblings, it cannot meet the written prerequisite, but the configured root node did have more than 3 child nodes.  So the test tried to execute, but the query (which ended in [2]) couldn't possibly return values from this connector.

The applied patch moves the root for the test cases to a node that only has two children, effectively bypassing this test[1].  This is actually better for most other tests since it moves the test root closer to the actual root of the repository and exposes more nodes to TCK testing.  I tried to do this originally when I added the connector, but the performance was too slow.  

[1] - This is why the FileSystemRepositoryTCKTest didn't also break.  Although it doesn't support SNS either, the root node happened to only have two children so this test was effectively bypassed for that connector as well.

Modified: trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-05 20:33:47 UTC (rev 1531)
+++ trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-06 00:36:37 UTC (rev 1532)
@@ -5,7 +5,7 @@
 javax.jcr.tck.dnaNodeTypePath=/org/jboss/dna/connector/meta/jdbc/connector-metajdbc.cnd
 
 # The fan-out from the tables node is HUGE in HSQLDB.  This allows the tests to complete reasonably quickly.
-javax.jcr.tck.testroot=/default/INFORMATION_SCHEMA/tables/SYSTEM_ALIASES
+javax.jcr.tck.testroot=/default/INFORMATION_SCHEMA
 
 # There's only one workspace per repository for this connector right now
 javax.jcr.tck.workspacename=default


From dna-commits at lists.jboss.org  Tue Jan  5 20:14:23 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 5 Jan 2010 20:14:23 -0500
Subject: [dna-commits] DNA SVN: r1533 -
	trunk/dna-jcr/src/test/java/org/jboss/dna/jcr.
Message-ID: <201001060114.o061ENLm006399@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-05 20:14:23 -0500 (Tue, 05 Jan 2010)
New Revision: 1533

Modified:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaRepositoryStub.java
Log:
Modified this file to log all runtime exceptions, including ones coming from jcrEngine.start().

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaRepositoryStub.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaRepositoryStub.java	2010-01-06 00:36:37 UTC (rev 1532)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaRepositoryStub.java	2010-01-06 01:14:23 UTC (rev 1533)
@@ -23,7 +23,6 @@
  */
 package org.jboss.dna.jcr;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 import org.apache.jackrabbit.test.RepositoryStub;
@@ -33,7 +32,6 @@
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.security.config.IDTrustConfiguration;
-import org.xml.sax.SAXException;
 
 /**
  * Concrete implementation of {@link RepositoryStub} based on DNA-specific configuration.
@@ -42,12 +40,11 @@
 
     public static final String DNA_SKIP_IMPORT = "javax.jcr.tck.dnaSkipImport";
     public static final String DNA_NODE_TYPE_PATH = "javax.jcr.tck.dnaNodeTypePath";
-    
+
     private static final String REPOSITORY_SOURCE_NAME = "Test Repository Source";
 
     private static String currentConfigurationName = "default";
 
-
     private Properties configProps;
     private String repositoryConfigurationName;
     private JcrRepository repository;
@@ -93,30 +90,21 @@
                 configuration.repository(REPOSITORY_SOURCE_NAME).addNodeTypes(getClass().getResourceAsStream(nodeTypePath));
             }
 
-        } catch (SAXException se) {
-            se.printStackTrace();
-            throw new IllegalStateException(se);
-        } catch (IOException ioe) {
-            ioe.printStackTrace();
-            throw new IllegalStateException(ioe);
-        }
+            JcrEngine engine = configuration.build();
+            engine.start();
 
-        JcrEngine engine = configuration.build();
-        engine.start();
+            Problems problems = engine.getProblems();
+            // Print all of the problems from the engine configuration ...
+            for (Problem problem : problems) {
+                System.err.println(problem);
+            }
+            if (problems.hasErrors()) {
+                throw new IllegalStateException("Problems starting JCR repository");
+            }
 
-        Problems problems = engine.getProblems();
-        // Print all of the problems from the engine configuration ...
-        for (Problem problem : problems) {
-            System.err.println(problem);
-        }
-        if (problems.hasErrors()) {
-            throw new IllegalStateException("Problems starting JCR repository");
-        }
+            ExecutionContext executionContext = engine.getExecutionContext();
+            executionContext.getNamespaceRegistry().register(TestLexicon.Namespace.PREFIX, TestLexicon.Namespace.URI);
 
-        ExecutionContext executionContext = engine.getExecutionContext();
-        executionContext.getNamespaceRegistry().register(TestLexicon.Namespace.PREFIX, TestLexicon.Namespace.URI);
-
-        try {
             repository = engine.getRepository(REPOSITORY_SOURCE_NAME);
 
             // This needs to check configProps directly to avoid an infinite loop


From dna-commits at lists.jboss.org  Wed Jan  6 13:43:36 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 13:43:36 -0500
Subject: [dna-commits] DNA SVN: r1534 - in trunk:
	extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn
	and 1 other directories.
Message-ID: <201001061843.o06Ihaax007052@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 13:43:36 -0500 (Wed, 06 Jan 2010)
New Revision: 1534

Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java
Log:
DNA-624 Canonicalize Property Names/Behavior in SVN Connector

Applied patch that changes the name of setDirectoryOfDefaultWorkspace to setDefaultWorkspaceName and changes the behavior of the workspace names as described in the issue description.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -51,7 +51,7 @@
     @Before
     public void beforeEach() throws Exception {
         final String repositoryUrl = "http://anonsvn.jboss.org/repos/dna/";
-        final String[] predefinedWorkspaceNames = {repositoryUrl + "trunk", repositoryUrl + "tags", repositoryUrl + "branches"};
+        final String[] predefinedWorkspaceNames = {"trunk", "tags", "branches"};
         final String svnRepositorySource = "svnRepositorySource";
         final String repositoryName = "svnRepository";
         final JcrConfiguration configuration = new JcrConfiguration();
@@ -61,7 +61,8 @@
                      .setProperty("username", "anonymous")
                      .setProperty("repositoryRootUrl", repositoryUrl)
                      .setProperty("predefinedWorkspaceNames", predefinedWorkspaceNames)
-                     .setProperty("directoryForDefaultWorkspace", predefinedWorkspaceNames[0])
+.setProperty("defaultWorkspaceName",
+                                                                                                                                                                                                                                    predefinedWorkspaceNames[0])
                      .setProperty("creatingWorkspacesAllowed", false);
 
         configuration.repository(repositoryName).setSource(svnRepositorySource).setOption(Option.QUERY_EXECUTION_ENABLED, "false");

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -50,13 +50,11 @@
 import org.tmatesoft.svn.core.SVNNodeKind;
 import org.tmatesoft.svn.core.SVNProperties;
 import org.tmatesoft.svn.core.SVNProperty;
-import org.tmatesoft.svn.core.SVNURL;
 import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
 import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
 import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
 import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
 import org.tmatesoft.svn.core.io.SVNRepository;
-import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
 import org.tmatesoft.svn.core.wc.SVNWCUtil;
 
 public class SvnRepository extends WritablePathRepository {
@@ -89,7 +87,7 @@
             doCreateWorkspace(context, workspaceName);
         }
 
-        String defaultWorkspaceName = source.getDirectoryForDefaultWorkspace();
+        String defaultWorkspaceName = source.getDefaultWorkspaceName();
         if (defaultWorkspaceName != null && !workspaces.containsKey(defaultWorkspaceName)) {
             doCreateWorkspace(context, defaultWorkspaceName);
         }
@@ -161,15 +159,11 @@
                              UUID rootNodeUuid ) {
             super(name, rootNodeUuid);
 
-            try {
-                workspaceRoot = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(name));
+            workspaceRoot = getWorkspaceDirectory(name);
 
-                ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(source.getUsername(),
-                                                                                                     source.getPassword());
-                workspaceRoot.setAuthenticationManager(authManager);
-            } catch (SVNException ex) {
-                throw new IllegalStateException(ex);
-            }
+            ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(source.getUsername(),
+                                                                                                 source.getPassword());
+            workspaceRoot.setAuthenticationManager(authManager);
         }
 
         public Path getLowestExistingPath( Path path ) {
@@ -845,7 +839,10 @@
         }
 
         protected SVNRepository getWorkspaceDirectory( String workspaceName ) {
-            if (workspaceName == null) workspaceName = source.getDirectoryForDefaultWorkspace();
+            if (workspaceName == null) workspaceName = source.getDefaultWorkspaceName();
+
+            workspaceName = source.getRepositoryRootUrl() + workspaceName;
+
             SVNRepository repository = null;
             SVNRepository repos = SvnRepositoryUtil.createRepository(workspaceName, source.getUsername(), source.getPassword());
             if (SvnRepositoryUtil.isDirectory(repos, "")) {

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -168,30 +168,28 @@
     }
 
     /**
-     * Get the file system path to the existing directory that should be used for the default workspace. If the default is
-     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
-     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * Get the path to the existing directory that should be used for the default workspace. This path should be relative to the
+     * {@link #getRepositoryRootUrl() repository root URL}. If the default is specified as a null String or is not a valid and
+     * resolvable path, this source will consider the default to be the current working directory of this virtual machine, as
+     * defined by the <code>new File(".")</code>.
      * 
      * @return the file system path to the directory representing the default workspace, or null if the default should be the
      *         current working directory
      */
-    public String getDirectoryForDefaultWorkspace() {
-        return defaultWorkspace;
-    }
-
     public String getDefaultWorkspaceName() {
         return defaultWorkspace;
     }
 
     /**
-     * Set the file system path to the existing directory that should be used for the default workspace. If the default is
-     * specified as a null String or is not a valid and resolvable path, this source will consider the default to be the current
-     * working directory of this virtual machine, as defined by the <code>new File(".")</code>.
+     * Set the file system path to the existing directory that should be used for the default workspace. This path should be
+     * relative to the {@link #getRepositoryRootUrl() repository root URL}. If the default is specified as a null String or is not
+     * a valid and resolvable path, this source will consider the default to be the current working directory of this virtual
+     * machine, as defined by the <code>new File(".")</code>.
      * 
      * @param pathToDirectoryForDefaultWorkspace the valid and resolvable file system path to the directory representing the
      *        default workspace, or null if the current working directory should be used as the default workspace
      */
-    public synchronized void setDirectoryForDefaultWorkspace( String pathToDirectoryForDefaultWorkspace ) {
+    public synchronized void setDefaultWorkspaceName( String pathToDirectoryForDefaultWorkspace ) {
         this.defaultWorkspace = pathToDirectoryForDefaultWorkspace;
     }
 
@@ -315,7 +313,7 @@
         }
         ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
         ref.add(new StringRefAddr(ROOT_NODE_UUID, rootNodeUuid.toString()));
-        ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDirectoryForDefaultWorkspace()));
+        ref.add(new StringRefAddr(DEFAULT_WORKSPACE, getDefaultWorkspaceName()));
         ref.add(new StringRefAddr(ALLOW_CREATING_WORKSPACES, Boolean.toString(isCreatingWorkspacesAllowed())));
         String[] workspaceNames = getPredefinedWorkspaceNames();
         if (workspaceNames != null && workspaceNames.length != 0) {
@@ -362,7 +360,7 @@
         if (password != null) source.setPassword(password);
         if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
         if (rootNodeUuid != null) source.setRootNodeUuid(rootNodeUuid);
-        if (defaultWorkspace != null) source.setDirectoryForDefaultWorkspace(defaultWorkspace);
+        if (defaultWorkspace != null) source.setDefaultWorkspaceName(defaultWorkspace);
         if (createWorkspaces != null) source.setCreatingWorkspacesAllowed(Boolean.parseBoolean(createWorkspaces));
         if (workspaceNames != null && workspaceNames.length != 0) source.setPredefinedWorkspaceNames(workspaceNames);
         return source;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -27,7 +27,6 @@
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.util.Map;
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;
@@ -53,7 +52,7 @@
     @Before
     public void beforeEach() {
         repositoryUrl = "http://anonsvn.jboss.org/repos/dna/";
-        predefinedWorkspaceNames = new String[] {repositoryUrl + "trunk", repositoryUrl + "tags", repositoryUrl + "branches"};
+        predefinedWorkspaceNames = new String[] {"trunk", "tags", "branches"};
         context = new ExecutionContext();
         source = new SvnRepositorySource();
         source.setName("svn repository source");
@@ -62,7 +61,7 @@
         source.setPassword("");
         source.setCreatingWorkspacesAllowed(true);
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
-        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setDefaultWorkspaceName(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(false);
         source.initialize(new RepositoryContext() {
 

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNoCreateWorkspaceTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -1,6 +1,5 @@
 package org.jboss.dna.connector.svn;
 
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.WorkspaceConnectorTest;
@@ -23,14 +22,14 @@
      */
     @Override
     protected RepositorySource setUpSource() throws Exception {
-        String[] predefinedWorkspaceNames = new String[] {url + "trunk", url + "tags"};
+        String[] predefinedWorkspaceNames = new String[] {"trunk", "tags"};
         SvnRepositorySource source = new SvnRepositorySource();
         source.setName("Test Repository");
         source.setUsername("sp");
         source.setPassword("");
         source.setRepositoryRootUrl(url);
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
-        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setDefaultWorkspaceName(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(false);
 
         return source;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorNotWritableTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -1,6 +1,5 @@
 package org.jboss.dna.connector.svn;
 
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.NotWritableConnectorTest;
@@ -23,14 +22,14 @@
      */
     @Override
     protected RepositorySource setUpSource() throws Exception {
-        String[] predefinedWorkspaceNames = new String[]{url+"trunk", url+"tags"};
+        String[] predefinedWorkspaceNames = new String[] {"trunk", "tags"};
         SvnRepositorySource source = new SvnRepositorySource();
         source.setName("Test Repository");
         source.setUsername("sp");
         source.setPassword("");
         source.setRepositoryRootUrl(url);
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
-        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setDefaultWorkspaceName(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(false);
         
         return source;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositoryConnectorWritableTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -27,7 +27,6 @@
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.io.ByteArrayOutputStream;
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
@@ -63,14 +62,14 @@
     @Override
     protected RepositorySource setUpSource() throws Exception {
         url = SvnConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
-        String[] predefinedWorkspaceNames = new String[] {url + "trunk", url + "tags"};
+        String[] predefinedWorkspaceNames = new String[] {"trunk", "tags"};
         SvnRepositorySource source = new SvnRepositorySource();
         source.setName("Test Repository");
         source.setUsername("sp");
         source.setPassword("");
         source.setRepositoryRootUrl(url);
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
-        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setDefaultWorkspaceName(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(Boolean.TRUE);
         source.setUpdatesAllowed(true);
 

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -265,7 +265,7 @@
         assertThat((String)refAttributes.remove(SvnRepositorySource.ALLOW_CREATING_WORKSPACES),
                    is(Boolean.toString(source.isCreatingWorkspacesAllowed())));
         assertThat((String)refAttributes.remove(SvnRepositorySource.DEFAULT_WORKSPACE),
-                   is(source.getDirectoryForDefaultWorkspace()));
+                   is(source.getDefaultWorkspaceName()));
         refAttributes.remove(SvnRepositorySource.PREDEFINED_WORKSPACE_NAMES);
         assertThat(refAttributes.isEmpty(), is(true));
 

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java	2010-01-06 01:14:23 UTC (rev 1533)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRespositoryConnectorReadableTest.java	2010-01-06 18:43:36 UTC (rev 1534)
@@ -27,7 +27,6 @@
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import java.util.List;
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.JcrNtLexicon;
@@ -59,14 +58,14 @@
      */
     @Override
     protected RepositorySource setUpSource() throws Exception {
-        String[] predefinedWorkspaceNames = new String[]{url + "trunk", url + "tags"};
+        String[] predefinedWorkspaceNames = new String[] {"trunk", "tags"};
         SvnRepositorySource source = new SvnRepositorySource();
         source.setName("Test Repository");
         source.setUsername("sp");
         source.setPassword("");
         source.setRepositoryRootUrl(url);
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
-        source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
+        source.setDefaultWorkspaceName(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(false);
         
         return source;


From dna-commits at lists.jboss.org  Wed Jan  6 17:13:12 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 17:13:12 -0500
Subject: [dna-commits] DNA SVN: r1535 - in
	trunk/extensions/dna-connector-svn/src:
	test/java/org/jboss/dna/connector/svn and 1 other directory.
Message-ID: <201001062213.o06MDCwk022976@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 17:13:11 -0500 (Wed, 06 Jan 2010)
New Revision: 1535

Modified:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
Log:
Corrected Eclipse warnings

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 18:43:36 UTC (rev 1534)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 22:13:11 UTC (rev 1535)
@@ -59,10 +59,10 @@
 
 public class SvnRepository extends WritablePathRepository {
 
-    private static final String DEFAULT_MIME_TYPE = "application/octet-stream";
-    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+    protected static final String DEFAULT_MIME_TYPE = "application/octet-stream";
+    protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
 
-    private final SvnRepositorySource source;
+    protected final SvnRepositorySource source;
 
     static {
         // for DAV (over http and https)

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-06 18:43:36 UTC (rev 1534)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-06 22:13:11 UTC (rev 1535)
@@ -289,6 +289,11 @@
         return false;
     }
 
+    @Override
+    public int hashCode() {
+        return getName().hashCode();
+    }
+
     /**
      * {@inheritDoc}
      * 

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java	2010-01-06 18:43:36 UTC (rev 1534)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnIntegrationTest.java	2010-01-06 22:13:11 UTC (rev 1535)
@@ -69,6 +69,7 @@
                 return null;
             }
 
+            @SuppressWarnings( "synthetic-access" )
             public ExecutionContext getExecutionContext() {
                 return context;
             }

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 18:43:36 UTC (rev 1534)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 22:13:11 UTC (rev 1535)
@@ -35,14 +35,12 @@
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import javax.naming.Context;
 import javax.naming.Name;
 import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.spi.ObjectFactory;
-import org.jboss.dna.connector.svn.SvnRepositorySource;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.cache.BasicCachePolicy;
@@ -65,11 +63,9 @@
     private SvnRepositorySource source;
     private RepositoryConnection connection;
     private String validName;
-    private String validUuidPropertyName;
     private static String url;
     private String username;
     private String password;
-    private UUID validRootNodeUuid;
     private final ExecutionContext context = new ExecutionContext();
 
     @BeforeClass
@@ -93,6 +89,7 @@
                 return null;
             }
 
+            @SuppressWarnings( "synthetic-access" )
             public ExecutionContext getExecutionContext() {
                 return context;
             }
@@ -220,23 +217,21 @@
     public void shouldCreateJndiReferenceAndRecreatedObjectFromReference() throws Exception {
         BasicCachePolicy cachePolicy = new BasicCachePolicy();
         cachePolicy.setTimeToLive(1000L, TimeUnit.MILLISECONDS);
-        convertToAndFromJndiReference(validName, validRootNodeUuid, url, username, password, validUuidPropertyName, 100);
+        convertToAndFromJndiReference(validName, url, username, password, 100);
     }
 
     @Test
     public void shouldCreateJndiReferenceAndRecreatedObjectFromReferenceWithNullProperties() throws Exception {
         BasicCachePolicy cachePolicy = new BasicCachePolicy();
         cachePolicy.setTimeToLive(1000L, TimeUnit.MILLISECONDS);
-        convertToAndFromJndiReference("some source", null, "url1", null, null, null, 100);
-        convertToAndFromJndiReference(null, null, "url2", null, null, null, 100);
+        convertToAndFromJndiReference("some source", "url1", null, null, 100);
+        convertToAndFromJndiReference(null, "url2", null, null, 100);
     }
 
     private void convertToAndFromJndiReference( String sourceName,
-                                                UUID rootNodeUuid,
                                                 String url,
                                                 String username,
                                                 String password,
-                                                String uuidPropertyName,
                                                 int retryLimit ) throws Exception {
         source.setRetryLimit(retryLimit);
         source.setName(sourceName);


From dna-commits at lists.jboss.org  Wed Jan  6 18:48:33 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 18:48:33 -0500
Subject: [dna-commits] DNA SVN: r1536 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/query and 15
	other directories.
Message-ID: <201001062348.o06NmXGZ007670@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-06 18:48:32 -0500 (Wed, 06 Jan 2010)
New Revision: 1536

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperand.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperator.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryBuilder.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryResults.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/DynamicOperand.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/FullTextSearchScore.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Length.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/LowerCase.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeDepth.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeLocalName.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeName.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodePath.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/PropertyValue.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/UpperCase.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitors.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/parse/SqlQueryParser.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanHints.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/ProcessingComponent.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryResults.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/SortValuesComponent.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
   trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/QueryBuilderTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/plan/CanonicalPlannerTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/process/QueryResultColumnsTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPath.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathParser.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
   trunk/dna-jcr/src/test/resources/tck/repositoryForTckTests.xml
Log:
DNA-613 One problem was when there was an ORDER BY SCORE(selectorName) when the selector was a view that joined multiple tables. In this case, the score function would need to be resolved against the scores from multiple source tables. The existing FullTextSearchScore subclass of DynamicOperand required a single selector name, so it was not possible to represent a single DynamicOperand that represented the score from multiple tables.

One option considered was the creation of a FullTextSearchCompositeScore that would accept multiple selector names.  Unfortunately, DynamicOperand makes the assumption that it only applies to a single selector, and thus has a 'getSelectorName()' method.  This could be changed to no longer make this assumption (as well as adjust all places that use this method), but the composite score DynamicOperand seems to be a bit of a hack.

Instead, I decided that it was better to support a DynamicOperand that represented an arithmetic operation between two other DynamicOperands, and thus there is a new ArithmeticOperand class that contains a left DynamicOperand, an arithmetic operator, and a right DynamicOperand.  And of course, ArithmeticOperands can be nested inside each other to create relatively complex operations.  Because an ArithmeticOperand applies to two DynamicOperands, those DynamicOperands might apply to different selectors.  Thus, this approach also required changing DynamicOperand.getSelectorName():SelectorName to getSelectorNames():Set<SelectorName>.  Also, it was critical for this set to maintain the order of insertion of the set, so a LinkedHashSet was used.

This addition required changes to the SQL parser, the planner, and the optimizer (along with the corresponding tests).  The change to multiple selector names for DynamicOperand also required changes to all other DynamicOperand subclasses, and the code that used these methods.

Another change was made to the PlanHints so that a string representation of the query plan could be requested and placed in the results. In the JCR layer, this was leveraged by always requesting the plan and then making the string representation of the plan publicly available on the JcrQueryResult class.

Finally, there were changes made to the way the XPath-to-SQL translator works (along with the test cases).

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -143,6 +143,8 @@
     public static I18n columnDoesNotExistInQuery;
     public static I18n columnIsNotFullTextSearchable;
     public static I18n tableIsNotFullTextSearchable;
+    public static I18n columnTypeCannotBeUsedInArithmeticOperation;
+    public static I18n dynamicOperandCannotBeUsedInArithmeticOperation;
     public static I18n selectorDoesNotExistInQuery;
     public static I18n propertyOnSelectorIsNotUsedInQuery;
     public static I18n errorResolvingNodesFromLocationsUsingSourceAndWorkspace;
@@ -167,6 +169,7 @@
     public static I18n expectingLiteralAndUnableToParseAsLong;
     public static I18n expectingLiteralAndUnableToParseAsDouble;
     public static I18n expectingLiteralAndUnableToParseAsDate;
+    public static I18n unexpectedClosingParenthesis;
 
     /* Search */
     public static I18n interruptedWhileClosingChannel;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryBuilder.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryBuilder.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -41,6 +41,8 @@
 import org.jboss.dna.graph.property.PropertyType;
 import org.jboss.dna.graph.query.model.AllNodes;
 import org.jboss.dna.graph.query.model.And;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
+import org.jboss.dna.graph.query.model.ArithmeticOperator;
 import org.jboss.dna.graph.query.model.Between;
 import org.jboss.dna.graph.query.model.BindVariableName;
 import org.jboss.dna.graph.query.model.ChildNode;
@@ -69,6 +71,7 @@
 import org.jboss.dna.graph.query.model.Not;
 import org.jboss.dna.graph.query.model.Operator;
 import org.jboss.dna.graph.query.model.Or;
+import org.jboss.dna.graph.query.model.Order;
 import org.jboss.dna.graph.query.model.Ordering;
 import org.jboss.dna.graph.query.model.PropertyExistence;
 import org.jboss.dna.graph.query.model.PropertyValue;
@@ -703,6 +706,17 @@
     }
 
     /**
+     * Obtain a builder that will create the order-by clause (with one or more {@link Ordering} statements) for the query. This
+     * method need be called only once to build the order-by clause, but can be called multiple times (it merely adds additional
+     * {@link Ordering} statements).
+     * 
+     * @return the order-by builder; never null
+     */
+    public OrderByBuilder orderBy() {
+        return new OrderByBuilder();
+    }
+
+    /**
      * Return a {@link QueryCommand} representing the currently-built query.
      * 
      * @return the resulting query command; never null
@@ -726,7 +740,256 @@
         return result;
     }
 
+    public interface OrderByOperandBuilder {
+        /**
+         * Adds to the order-by clause by using the length of the value for the given table and property.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @param property the name of the property; may not be null and must refer to a valid property name
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder length( String table,
+                                      String property );
+
+        /**
+         * Adds to the order-by clause by using the value for the given table and property.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @param property the name of the property; may not be null and must refer to a valid property name
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder propertyValue( String table,
+                                             String property );
+
+        /**
+         * Adds to the order-by clause by using the full-text search score for the given table.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder fullTextSearchScore( String table );
+
+        /**
+         * Adds to the order-by clause by using the depth of the node given by the named table.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder depth( String table );
+
+        /**
+         * Adds to the order-by clause by using the path of the node given by the named table.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder path( String table );
+
+        /**
+         * Adds to the order-by clause by using the local name of the node given by the named table.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder nodeLocalName( String table );
+
+        /**
+         * Adds to the order-by clause by using the node name (including namespace) of the node given by the named table.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByBuilder nodeName( String table );
+
+        /**
+         * Adds to the order-by clause by using the uppercase form of the next operand.
+         * 
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByOperandBuilder upperCaseOf();
+
+        /**
+         * Adds to the order-by clause by using the lowercase form of the next operand.
+         * 
+         * @return the interface for completing the order-by specification; never null
+         */
+        public OrderByOperandBuilder lowerCaseOf();
+    }
+
     /**
+     * The component used to build the order-by clause. When the clause is completed, {@link #end()} should be called to return to
+     * the {@link QueryBuilder} instance.
+     */
+    public class OrderByBuilder {
+
+        protected OrderByBuilder() {
+        }
+
+        /**
+         * Begin specifying an order-by specification using {@link Order#ASCENDING ascending order}.
+         * 
+         * @return the interface for specifying the operand that is to be ordered; never null
+         */
+        public OrderByOperandBuilder ascending() {
+            return new SingleOrderByOperandBuilder(this, Order.ASCENDING);
+        }
+
+        /**
+         * Begin specifying an order-by specification using {@link Order#DESCENDING descending order}.
+         * 
+         * @return the interface for specifying the operand that is to be ordered; never null
+         */
+        public OrderByOperandBuilder descending() {
+            return new SingleOrderByOperandBuilder(this, Order.DESCENDING);
+        }
+
+        /**
+         * An optional convenience method that returns this builder, but which makes the code using this builder more readable.
+         * 
+         * @return this builder; never null
+         */
+        public OrderByBuilder then() {
+            return this;
+        }
+
+        /**
+         * Complete the order-by clause and return the QueryBuilder instance.
+         * 
+         * @return the query builder instance; never null
+         */
+        public QueryBuilder end() {
+            return QueryBuilder.this;
+        }
+    }
+
+    protected class SingleOrderByOperandBuilder implements OrderByOperandBuilder {
+        private final Order order;
+        private final OrderByBuilder builder;
+
+        protected SingleOrderByOperandBuilder( OrderByBuilder builder,
+                                               Order order ) {
+            this.order = order;
+            this.builder = builder;
+        }
+
+        protected OrderByBuilder addOrdering( DynamicOperand operand ) {
+            Ordering ordering = new Ordering(operand, order);
+            QueryBuilder.this.orderings.add(ordering);
+            return builder;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#propertyValue(java.lang.String, java.lang.String)
+         */
+        public OrderByBuilder propertyValue( String table,
+                                             String property ) {
+            return addOrdering(new PropertyValue(selector(table), property));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#length(java.lang.String, java.lang.String)
+         */
+        public OrderByBuilder length( String table,
+                                      String property ) {
+            return addOrdering(new Length(new PropertyValue(selector(table), property)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#fullTextSearchScore(java.lang.String)
+         */
+        public OrderByBuilder fullTextSearchScore( String table ) {
+            return addOrdering(new FullTextSearchScore(selector(table)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#depth(java.lang.String)
+         */
+        public OrderByBuilder depth( String table ) {
+            return addOrdering(new NodeDepth(selector(table)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#path(java.lang.String)
+         */
+        public OrderByBuilder path( String table ) {
+            return addOrdering(new NodePath(selector(table)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#nodeName(java.lang.String)
+         */
+        public OrderByBuilder nodeName( String table ) {
+            return addOrdering(new NodeName(selector(table)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#nodeLocalName(java.lang.String)
+         */
+        public OrderByBuilder nodeLocalName( String table ) {
+            return addOrdering(new NodeLocalName(selector(table)));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#lowerCaseOf()
+         */
+        public OrderByOperandBuilder lowerCaseOf() {
+            return new SingleOrderByOperandBuilder(builder, order) {
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.query.QueryBuilder.SingleOrderByOperandBuilder#addOrdering(org.jboss.dna.graph.query.model.DynamicOperand)
+                 */
+                @Override
+                protected OrderByBuilder addOrdering( DynamicOperand operand ) {
+                    return super.addOrdering(new LowerCase(operand));
+                }
+            };
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder#upperCaseOf()
+         */
+        public OrderByOperandBuilder upperCaseOf() {
+            return new SingleOrderByOperandBuilder(builder, order) {
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.query.QueryBuilder.SingleOrderByOperandBuilder#addOrdering(org.jboss.dna.graph.query.model.DynamicOperand)
+                 */
+                @Override
+                protected OrderByBuilder addOrdering( DynamicOperand operand ) {
+                    return super.addOrdering(new UpperCase(operand));
+                }
+            };
+        }
+    }
+
+    /**
      * Class used to specify a join clause of a query.
      * 
      * @see QueryBuilder#join(String)
@@ -932,7 +1195,6 @@
          * @return the interface for completing the criteria specification; never null
          */
         public DynamicOperandBuilder lowerCaseOf();
-
     }
 
     public class ConstraintBuilder implements DynamicOperandBuilder {
@@ -975,9 +1237,12 @@
          * Complete the specification of a constraint clause, and return the builder for the parent constraint clause.
          * 
          * @return the constraint builder that was used to create this parenthetical constraint clause builder; never null
+         * @throws IllegalStateException if there was not an {@link #openParen() open parenthesis} to close
          */
         public ConstraintBuilder closeParen() {
-            assert parent != null;
+            if (parent == null) {
+                throw new IllegalStateException(GraphI18n.unexpectedClosingParenthesis.text());
+            }
             buildLogicalConstraint();
             return parent.setConstraint(constraint);
         }
@@ -1125,6 +1390,10 @@
             return setConstraint(new FullTextSearch(selector(table), propertyName, searchExpression));
         }
 
+        protected ComparisonBuilder comparisonBuilder( DynamicOperand operand ) {
+            return new ComparisonBuilder(this, operand);
+        }
+
         /**
          * {@inheritDoc}
          * 
@@ -1132,7 +1401,7 @@
          */
         public ComparisonBuilder length( String table,
                                          String property ) {
-            return new ComparisonBuilder(this, new Length(new PropertyValue(selector(table), property)));
+            return comparisonBuilder(new Length(new PropertyValue(selector(table), property)));
         }
 
         /**
@@ -1142,7 +1411,7 @@
          */
         public ComparisonBuilder propertyValue( String table,
                                                 String property ) {
-            return new ComparisonBuilder(this, new PropertyValue(selector(table), property));
+            return comparisonBuilder(new PropertyValue(selector(table), property));
         }
 
         /**
@@ -1151,7 +1420,7 @@
          * @see org.jboss.dna.graph.query.QueryBuilder.DynamicOperandBuilder#fullTextSearchScore(String)
          */
         public ComparisonBuilder fullTextSearchScore( String table ) {
-            return new ComparisonBuilder(this, new FullTextSearchScore(selector(table)));
+            return comparisonBuilder(new FullTextSearchScore(selector(table)));
         }
 
         /**
@@ -1160,7 +1429,7 @@
          * @see org.jboss.dna.graph.query.QueryBuilder.DynamicOperandBuilder#depth(java.lang.String)
          */
         public ComparisonBuilder depth( String table ) {
-            return new ComparisonBuilder(this, new NodeDepth(selector(table)));
+            return comparisonBuilder(new NodeDepth(selector(table)));
         }
 
         /**
@@ -1169,7 +1438,7 @@
          * @see org.jboss.dna.graph.query.QueryBuilder.DynamicOperandBuilder#path(java.lang.String)
          */
         public ComparisonBuilder path( String table ) {
-            return new ComparisonBuilder(this, new NodePath(selector(table)));
+            return comparisonBuilder(new NodePath(selector(table)));
         }
 
         /**
@@ -1178,7 +1447,7 @@
          * @see org.jboss.dna.graph.query.QueryBuilder.DynamicOperandBuilder#nodeLocalName(String)
          */
         public ComparisonBuilder nodeLocalName( String table ) {
-            return new ComparisonBuilder(this, new NodeLocalName(selector(table)));
+            return comparisonBuilder(new NodeLocalName(selector(table)));
         }
 
         /**
@@ -1187,7 +1456,7 @@
          * @see org.jboss.dna.graph.query.QueryBuilder.DynamicOperandBuilder#nodeName(String)
          */
         public ComparisonBuilder nodeName( String table ) {
-            return new ComparisonBuilder(this, new NodeName(selector(table)));
+            return comparisonBuilder(new NodeName(selector(table)));
         }
 
         /**
@@ -1365,7 +1634,8 @@
          */
         @Override
         public ConstraintBuilder as( String type ) {
-            return upperBoundary.comparisonBuilder.isBetween(upperBoundary.lowerBound, typeSystem.getTypeFactory(type).create(value));
+            return upperBoundary.comparisonBuilder.isBetween(upperBoundary.lowerBound, typeSystem.getTypeFactory(type)
+                                                                                                 .create(value));
         }
     }
 
@@ -2172,6 +2442,124 @@
         }
     }
 
+    public class ArithmeticBuilder {
+        protected final ArithmeticBuilder parent;
+        protected final ArithmeticOperator operator;
+        protected DynamicOperand left;
+        protected final ComparisonBuilder comparisonBuilder;
+
+        protected ArithmeticBuilder( ArithmeticOperator operator,
+                                     ComparisonBuilder comparisonBuilder,
+                                     DynamicOperand left,
+                                     ArithmeticBuilder parent ) {
+            this.operator = operator;
+            this.left = left;
+            this.comparisonBuilder = comparisonBuilder;
+            this.parent = parent; // may be null
+        }
+
+        /**
+         * Constrains the nodes in the the supplied table such that they must have a property value whose length matches the
+         * criteria.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @param property the name of the property; may not be null and must refer to a valid property name
+         * @return the interface for completing the value portion of the criteria specification; never null
+         */
+        public ComparisonBuilder length( String table,
+                                         String property ) {
+            return comparisonBuilder(new Length(new PropertyValue(selector(table), property)));
+        }
+
+        /**
+         * Constrains the nodes in the the supplied table such that they must have a matching value for the named property.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @param property the name of the property; may not be null and must refer to a valid property name
+         * @return the interface for completing the value portion of the criteria specification; never null
+         */
+        public ComparisonBuilder propertyValue( String table,
+                                                String property ) {
+            return comparisonBuilder(new PropertyValue(selector(table), property));
+        }
+
+        /**
+         * Constrains the nodes in the the supplied table such that they must satisfy the supplied full-text search on the nodes'
+         * property values.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the value portion of the criteria specification; never null
+         */
+        public ComparisonBuilder fullTextSearchScore( String table ) {
+            return comparisonBuilder(new FullTextSearchScore(selector(table)));
+        }
+
+        /**
+         * Constrains the nodes in the the supplied table based upon criteria on the node's depth.
+         * 
+         * @param table the name of the table; may not be null and must refer to a valid name or alias of a table appearing in the
+         *        FROM clause
+         * @return the interface for completing the value portion of the criteria specification; never null
+         */
+        public ComparisonBuilder depth( String table ) {
+            return comparisonBuilder(new NodeDepth(selector(table)));
+        }
+
+        // /**
+        // * Simulate the use of an open parenthesis in the constraint. The resulting builder should be used to define the
+        // * constraint within the parenthesis, and should always be terminated with a {@link #closeParen()}.
+        // *
+        // * @return the constraint builder that should be used to define the portion of the constraint within the parenthesis;
+        // * never null
+        // * @see #closeParen()
+        // */
+        // public ArithmeticBuilder openParen() {
+        // return new ArithmeticBuilder(operator, comparisonBuilder, left, this);
+        // }
+        //
+        // /**
+        // * Complete the specification of a constraint clause, and return the builder for the parent constraint clause.
+        // *
+        // * @return the constraint builder that was used to create this parenthetical constraint clause builder; never null
+        // * @throws IllegalStateException if there was not an {@link #openParen() open parenthesis} to close
+        // */
+        // public ComparisonBuilder closeParen() {
+        // if (parent == null) {
+        // throw new IllegalStateException(GraphI18n.unexpectedClosingParenthesis.text());
+        // }
+        // buildLogicalConstraint();
+        // return parent.setLeft(left).comparisonBuilder;
+        // }
+        // protected ArithmeticBuilder setLeft( DynamicOperand left ) {
+        // this.left = left;
+        // return this;
+        // }
+
+        protected ComparisonBuilder comparisonBuilder( DynamicOperand right ) {
+            DynamicOperand leftOperand = null;
+            // If the left operand is an arithmetic operand, then we need to check the operator precedence ...
+            if (left instanceof ArithmeticOperand) {
+                ArithmeticOperand leftArith = (ArithmeticOperand)left;
+                ArithmeticOperator operator = leftArith.getOperator();
+                if (this.operator.precedes(operator)) {
+                    // Need to do create an operand with leftArith.right and right
+                    DynamicOperand inner = new ArithmeticOperand(leftArith.getRight(), this.operator, right);
+                    leftOperand = new ArithmeticOperand(leftArith.getLeft(), operator, inner);
+                } else {
+                    // the left preceds this, so we can add the new operand on top ...
+                    leftOperand = new ArithmeticOperand(leftArith, operator, right);
+                }
+            } else {
+                // The left isn't an arith ...
+                leftOperand = new ArithmeticOperand(left, operator, right);
+            }
+            return new ComparisonBuilder(comparisonBuilder.constraintBuilder, leftOperand);
+        }
+    }
+
     /**
      * An interface used to set the right-hand side of a constraint.
      */
@@ -2197,6 +2585,26 @@
         }
 
         /**
+         * Create a comparison object based upon the addition of the previously-constructed {@link DynamicOperand} and the next
+         * DynamicOperand to be created with the supplied builder.
+         * 
+         * @return the builder that should be used to create the right-hand-side of the operation; never null
+         */
+        public ArithmeticBuilder plus() {
+            return new ArithmeticBuilder(ArithmeticOperator.ADD, this, left, null);
+        }
+
+        /**
+         * Create a comparison object based upon the subtraction of the next {@link DynamicOperand} (created using the builder
+         * returned from this method) from the the previously-constructed DynamicOperand to be created with the supplied builder.
+         * 
+         * @return the builder that should be used to create the right-hand-side of the operation; never null
+         */
+        public ArithmeticBuilder minus() {
+            return new ArithmeticBuilder(ArithmeticOperator.SUBTRACT, this, left, null);
+        }
+
+        /**
          * Define the operator that will be used in the comparison, returning an interface that can be used to define the
          * right-hand-side of the comparison.
          * 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryResults.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryResults.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/QueryResults.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -71,6 +71,13 @@
     public int getRowCount();
 
     /**
+     * Get a description of the query plan, if requested.
+     * 
+     * @return the query plan, or null if the plan was not requested
+     */
+    public String getPlan();
+
+    /**
      * Get the problems encountered during execution.
      * 
      * @return the problems; never null but possibly empty

Copied: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperand.java (from rev 1535, trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/PropertyValue.java)
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperand.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperand.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -0,0 +1,133 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.query.model;
+
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.HashCode;
+
+/**
+ * A dynamic operand that represents a (binary) arithmetic operation upon one or more other operands, used in {@link Comparison}
+ * and {@link Ordering} components.
+ */
+ at Immutable
+public class ArithmeticOperand extends DynamicOperand {
+    private static final long serialVersionUID = 1L;
+
+    private final ArithmeticOperator operator;
+    private final DynamicOperand left;
+    private final DynamicOperand right;
+    private final int hc;
+
+    /**
+     * Create a arithmetic dynamic operand that operates upon the supplied operand(s).
+     * 
+     * @param left the left-hand-side operand
+     * @param operator the arithmetic operator; may not be null
+     * @param right the right-hand-side operand
+     * @throws IllegalArgumentException if any of the arguments is null
+     */
+    public ArithmeticOperand( DynamicOperand left,
+                              ArithmeticOperator operator,
+                              DynamicOperand right ) {
+        super(left, right);
+        CheckArg.isNotNull(operator, "operator");
+        this.operator = operator;
+        this.left = left;
+        this.right = right;
+        this.hc = HashCode.compute(left, operator, right);
+    }
+
+    /**
+     * Get the operator for this binary operand.
+     * 
+     * @return the operator; never null
+     */
+    public ArithmeticOperator getOperator() {
+        return operator;
+    }
+
+    /**
+     * Get the left-hand operand.
+     * 
+     * @return the left-hand operator; never null
+     */
+    public DynamicOperand getLeft() {
+        return left;
+    }
+
+    /**
+     * Get the right-hand operand.
+     * 
+     * @return the right-hand operator; never null
+     */
+    public DynamicOperand getRight() {
+        return right;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return Visitors.readable(this);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return hc;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (obj instanceof ArithmeticOperand) {
+            ArithmeticOperand that = (ArithmeticOperand)obj;
+            return this.getOperator() == that.getOperator() && this.getLeft().equals(that.getLeft())
+                   && this.getRight().equals(that.getRight());
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.query.model.Visitable#accept(org.jboss.dna.graph.query.model.Visitor)
+     */
+    public void accept( Visitor visitor ) {
+        visitor.visit(this);
+    }
+}

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperator.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperator.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperator.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -0,0 +1,140 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.query.model;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.jboss.dna.common.util.CheckArg;
+
+/**
+ * The arithmetic operators.
+ */
+public enum ArithmeticOperator {
+
+    ADD("+", Arity.BINARY, 20),
+    SUBTRACT("-", Arity.BINARY, 19),
+    MULTIPLY("*", Arity.BINARY, 18),
+    DIVIDE("/", Arity.BINARY, 17);
+
+    public static enum Arity {
+        UNARY,
+        BINARY;
+    }
+
+    private static final Map<String, ArithmeticOperator> OPERATORS_BY_SYMBOL;
+    static {
+        Map<String, ArithmeticOperator> opsBySymbol = new HashMap<String, ArithmeticOperator>();
+        for (ArithmeticOperator operator : ArithmeticOperator.values()) {
+            opsBySymbol.put(operator.getSymbol(), operator);
+        }
+        OPERATORS_BY_SYMBOL = Collections.unmodifiableMap(opsBySymbol);
+    }
+
+    private final String symbol;
+    private final Arity arity;
+    private final int precedence;
+
+    private ArithmeticOperator( String symbol,
+                                Arity arity,
+                                int precedence ) {
+        this.symbol = symbol;
+        this.arity = arity;
+        this.precedence = precedence;
+    }
+
+    /**
+     * Get the symbol for this operator
+     * 
+     * @return the symbolic representation; never null
+     */
+    public String getSymbol() {
+        return symbol;
+    }
+
+    /**
+     * Get the 'arity' of the operator.
+     * 
+     * @return the number of parameters required
+     * @see #isUnary()
+     * @see #isBinary()
+     */
+    public Arity getArity() {
+        return arity;
+    }
+
+    /**
+     * Return whether this is an unary operator.
+     * 
+     * @return true if this operator is unary, or false otherwise
+     * @see #getArity()
+     * @see #isBinary()
+     */
+    public boolean isUnary() {
+        return arity == Arity.UNARY;
+    }
+
+    /**
+     * Return whether this is an binary operator.
+     * 
+     * @return true if this operator is binary, or false otherwise
+     * @see #getArity()
+     * @see #isUnary()
+     */
+    public boolean isBinary() {
+        return arity == Arity.BINARY;
+    }
+
+    /**
+     * Determine whether this operator has a higher precedence than the supplied operator.
+     * 
+     * @param operator the other operator; may not be null
+     * @return true if this operator has a higher precedence, or false otherwise
+     */
+    public boolean precedes( ArithmeticOperator operator ) {
+        return this.precedence > operator.precedence;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Enum#toString()
+     */
+    @Override
+    public String toString() {
+        return symbol;
+    }
+
+    /**
+     * Attempt to find the Operator given a symbol. The matching is done independent of case.
+     * 
+     * @param symbol the symbol
+     * @return the Operator having the supplied symbol, or null if there is no Operator with the supplied symbol
+     * @throws IllegalArgumentException if the symbol is null
+     */
+    public static ArithmeticOperator forSymbol( String symbol ) {
+        CheckArg.isNotNull(symbol, "symbol");
+        return OPERATORS_BY_SYMBOL.get(symbol.toUpperCase());
+    }
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/ArithmeticOperator.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/DynamicOperand.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/DynamicOperand.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/DynamicOperand.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -23,7 +23,13 @@
  */
 package org.jboss.dna.graph.query.model;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
 import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand used in a {@link Comparison} constraint.
@@ -32,10 +38,87 @@
 public abstract class DynamicOperand implements LanguageObject {
     private static final long serialVersionUID = 1L;
 
+    private final Set<SelectorName> selectorNames;
+
     /**
-     * Get the selector symbol to which this operand applies.
+     * Create a arithmetic dynamic operand that operates upon the supplied selector name(s).
      * 
-     * @return the selector name; never null
+     * @param selectorNames the selector names
+     * @throws IllegalArgumentException if the selector names array is null or empty, or if any of the values are null
      */
-    public abstract SelectorName getSelectorName();
+    protected DynamicOperand( SelectorName... selectorNames ) {
+        CheckArg.isNotNull(selectorNames, "selectorNames");
+        if (selectorNames.length == 1) {
+            CheckArg.isNotNull(selectorNames, "selectorNames[0]");
+            this.selectorNames = Collections.singleton(selectorNames[0]);
+        } else {
+            CheckArg.isNotNull(selectorNames, "selectorNames[0]");
+            this.selectorNames = Collections.unmodifiableSet(new LinkedHashSet<SelectorName>(Arrays.asList(selectorNames)));
+            int i = 0;
+            for (SelectorName name : this.selectorNames) {
+                CheckArg.isNotNull(name, "selectorNames[" + i++ + "]");
+            }
+        }
+    }
+
+    /**
+     * Create a arithmetic dynamic operand that operates upon the supplied selector name(s).
+     * 
+     * @param selectorNames the selector names
+     * @throws IllegalArgumentException if the name list is null or empty, or if any of the values are null
+     */
+    protected DynamicOperand( Collection<SelectorName> selectorNames ) {
+        CheckArg.isNotNull(selectorNames, "selectorName");
+        this.selectorNames = Collections.unmodifiableSet(new LinkedHashSet<SelectorName>(selectorNames));
+    }
+
+    /**
+     * Create a arithmetic dynamic operand that operates upon the selector names given by the supplied dynamic operand(s).
+     * 
+     * @param operand the operand defining the selector names
+     * @throws IllegalArgumentException if the operand is null
+     */
+    protected DynamicOperand( DynamicOperand operand ) {
+        CheckArg.isNotNull(operand, "operand");
+        this.selectorNames = operand.getSelectorNames(); // immutable, so we can reference it directly
+    }
+
+    /**
+     * Create a arithmetic dynamic operand that operates upon the selector names given by the supplied dynamic operand(s).
+     * 
+     * @param operands the operands defining the selector names
+     * @throws IllegalArgumentException if the operand is null
+     */
+    protected DynamicOperand( Iterable<? extends DynamicOperand> operands ) {
+        CheckArg.isNotNull(operands, "operands");
+        Set<SelectorName> names = new LinkedHashSet<SelectorName>();
+        for (DynamicOperand operand : operands) {
+            names.addAll(operand.getSelectorNames());
+        }
+        this.selectorNames = Collections.unmodifiableSet(names);
+    }
+
+    /**
+     * Create a arithmetic dynamic operand that operates upon the selector names given by the supplied dynamic operand(s).
+     * 
+     * @param operands the operands defining the selector names
+     * @throws IllegalArgumentException if the operand is null
+     */
+    protected DynamicOperand( DynamicOperand... operands ) {
+        CheckArg.isNotNull(operands, "operands");
+        Set<SelectorName> names = new LinkedHashSet<SelectorName>();
+        for (DynamicOperand operand : operands) {
+            names.addAll(operand.getSelectorNames());
+        }
+        this.selectorNames = Collections.unmodifiableSet(names);
+    }
+
+    /**
+     * Get the selector symbols to which this operand applies.
+     * 
+     * @return the immutable ordered set of non-null selector names used by this operand; never null and never empty
+     */
+    public Set<SelectorName> getSelectorNames() {
+        return selectorNames;
+    }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/FullTextSearchScore.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/FullTextSearchScore.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/FullTextSearchScore.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,36 +24,31 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the full-text search score of a node given by a selector, used in a {@link Comparison}
- * constraint.
+ * constraint and {@link Ordering}s.
  */
 @Immutable
 public class FullTextSearchScore extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
-
     /**
      * Create a dynamic operand that evaluates to the full-text search score of the node identified by the selector.
      * 
      * @param selectorName the name of the selector
      */
     public FullTextSearchScore( SelectorName selectorName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
-        this.selectorName = selectorName;
+        super(selectorName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
     public SelectorName getSelectorName() {
-        return selectorName;
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -73,7 +68,7 @@
      */
     @Override
     public int hashCode() {
-        return getSelectorName().hashCode();
+        return getSelectorNames().hashCode();
     }
 
     /**
@@ -86,7 +81,7 @@
         if (obj == this) return true;
         if (obj instanceof FullTextSearchScore) {
             FullTextSearchScore that = (FullTextSearchScore)obj;
-            if (!this.selectorName.equals(that.selectorName)) return false;
+            if (!this.getSelectorNames().equals(that.getSelectorNames())) return false;
             return true;
         }
         return false;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Length.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Length.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Length.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the length of the supplied propety values, used in a {@link Comparison} constraint.
@@ -41,27 +40,26 @@
      * @param propertyValue the property value operand
      */
     public Length( PropertyValue propertyValue ) {
-        CheckArg.isNotNull(propertyValue, "propertyValue");
+        super(propertyValue);
         this.propertyValue = propertyValue;
     }
 
     /**
-     * {@inheritDoc}
+     * Get the property value whose length is being constrained.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the property value being constrained; never null
      */
-    @Override
-    public SelectorName getSelectorName() {
-        return propertyValue.getSelectorName();
+    public final PropertyValue getPropertyValue() {
+        return propertyValue;
     }
 
     /**
-     * Get the property value whose length is being constrained.
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @return the property value being constrained; never null
+     * @return the one selector names used by this operand; never null
      */
-    public final PropertyValue getPropertyValue() {
-        return propertyValue;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/LowerCase.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/LowerCase.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/LowerCase.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the lower-case representation of the supplied operand, used in a {@link Comparison}
@@ -42,7 +41,7 @@
      * @param operand the operand that is to be lower-cased
      */
     public LowerCase( DynamicOperand operand ) {
-        CheckArg.isNotNull(operand, "operand");
+        super(operand);
         this.operand = operand;
     }
 
@@ -56,13 +55,12 @@
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
     public SelectorName getSelectorName() {
-        return operand.getSelectorName();
+        return getSelectorNames().iterator().next();
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeDepth.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeDepth.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeDepth.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the depth of a node given by a selector, used in a {@link Comparison} constraint.
@@ -33,8 +32,6 @@
 public class NodeDepth extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
-
     /**
      * Create a dynamic operand that evaluates to the depth of the node identified by the selector.
      * 
@@ -42,18 +39,16 @@
      * @throws IllegalArgumentException if the selector name or property name are null
      */
     public NodeDepth( SelectorName selectorName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
-        this.selectorName = selectorName;
+        super(selectorName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
-    public final SelectorName getSelectorName() {
-        return selectorName;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -73,7 +68,7 @@
      */
     @Override
     public int hashCode() {
-        return getSelectorName().hashCode();
+        return getSelectorNames().hashCode();
     }
 
     /**
@@ -86,7 +81,7 @@
         if (obj == this) return true;
         if (obj instanceof NodeDepth) {
             NodeDepth that = (NodeDepth)obj;
-            return this.selectorName.equals(that.selectorName);
+            return this.getSelectorNames().equals(that.getSelectorNames());
         }
         return false;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeLocalName.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeLocalName.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeLocalName.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the local name of a node given by a selector, used in a {@link Comparison} constraint.
@@ -33,26 +32,22 @@
 public class NodeLocalName extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
-
     /**
      * Create a dynamic operand that evaluates to the local name of the node identified by the selector.
      * 
      * @param selectorName the name of the selector
      */
     public NodeLocalName( SelectorName selectorName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
-        this.selectorName = selectorName;
+        super(selectorName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
-    public final SelectorName getSelectorName() {
-        return selectorName;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -72,7 +67,7 @@
      */
     @Override
     public int hashCode() {
-        return getSelectorName().hashCode();
+        return getSelectorNames().hashCode();
     }
 
     /**
@@ -85,7 +80,7 @@
         if (obj == this) return true;
         if (obj instanceof NodeLocalName) {
             NodeLocalName that = (NodeLocalName)obj;
-            return this.selectorName.equals(that.selectorName);
+            return this.getSelectorNames().equals(that.getSelectorNames());
         }
         return false;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeName.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeName.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodeName.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the qualified name of a node given by a selector, used in a {@link Comparison} constraint.
@@ -33,26 +32,22 @@
 public class NodeName extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
-
     /**
      * Create a dynamic operand that evaluates to the qualified name of the node identified by the selector.
      * 
      * @param selectorName the name of the selector
      */
     public NodeName( SelectorName selectorName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
-        this.selectorName = selectorName;
+        super(selectorName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
-    public final SelectorName getSelectorName() {
-        return selectorName;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -72,7 +67,7 @@
      */
     @Override
     public int hashCode() {
-        return getSelectorName().hashCode();
+        return getSelectorNames().hashCode();
     }
 
     /**
@@ -85,7 +80,7 @@
         if (obj == this) return true;
         if (obj instanceof NodeName) {
             NodeName that = (NodeName)obj;
-            return this.selectorName.equals(that.selectorName);
+            return this.getSelectorNames().equals(that.getSelectorNames());
         }
         return false;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodePath.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodePath.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/NodePath.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the path of a node given by a selector, used in a {@link Comparison} constraint.
@@ -33,8 +32,6 @@
 public class NodePath extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
-
     /**
      * Create a dynamic operand that evaluates to the path of the node identified by the selector.
      * 
@@ -42,18 +39,16 @@
      * @throws IllegalArgumentException if the selector name or property name are null
      */
     public NodePath( SelectorName selectorName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
-        this.selectorName = selectorName;
+        super(selectorName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
-    public final SelectorName getSelectorName() {
-        return selectorName;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -73,7 +68,7 @@
      */
     @Override
     public int hashCode() {
-        return getSelectorName().hashCode();
+        return getSelectorNames().hashCode();
     }
 
     /**
@@ -86,7 +81,7 @@
         if (obj == this) return true;
         if (obj instanceof NodePath) {
             NodePath that = (NodePath)obj;
-            return this.selectorName.equals(that.selectorName);
+            return this.getSelectorNames().equals(that.getSelectorNames());
         }
         return false;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/PropertyValue.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/PropertyValue.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/PropertyValue.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -34,7 +34,6 @@
 public class PropertyValue extends DynamicOperand {
     private static final long serialVersionUID = 1L;
 
-    private final SelectorName selectorName;
     private final String propertyName;
     private final int hc;
 
@@ -47,21 +46,19 @@
      */
     public PropertyValue( SelectorName selectorName,
                           String propertyName ) {
-        CheckArg.isNotNull(selectorName, "selectorName");
+        super(selectorName);
         CheckArg.isNotNull(propertyName, "propertyName");
-        this.selectorName = selectorName;
         this.propertyName = propertyName;
-        this.hc = HashCode.compute(this.selectorName, this.propertyName);
+        this.hc = HashCode.compute(selectorName, this.propertyName);
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
-    public final SelectorName getSelectorName() {
-        return selectorName;
+    public SelectorName getSelectorName() {
+        return getSelectorNames().iterator().next();
     }
 
     /**
@@ -104,7 +101,7 @@
         if (obj instanceof PropertyValue) {
             PropertyValue that = (PropertyValue)obj;
             if (this.hc != that.hc) return false;
-            return this.selectorName.equals(that.selectorName) && this.propertyName.equals(that.propertyName);
+            return this.getSelectorNames().equals(that.getSelectorNames()) && this.propertyName.equals(that.propertyName);
         }
         return false;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/UpperCase.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/UpperCase.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/UpperCase.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -24,7 +24,6 @@
 package org.jboss.dna.graph.query.model;
 
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
 
 /**
  * A dynamic operand that evaluates to the upper-case representation of the supplied operand, used in a {@link Comparison}
@@ -42,18 +41,17 @@
      * @param operand the operand that is to be lower-cased
      */
     public UpperCase( DynamicOperand operand ) {
-        CheckArg.isNotNull(operand, "operand");
+        super(operand);
         this.operand = operand;
     }
 
     /**
-     * {@inheritDoc}
+     * Get the selector symbol upon which this operand applies.
      * 
-     * @see org.jboss.dna.graph.query.model.DynamicOperand#getSelectorName()
+     * @return the one selector names used by this operand; never null
      */
-    @Override
     public SelectorName getSelectorName() {
-        return operand.getSelectorName();
+        return getSelectorNames().iterator().next();
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitor.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitor.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -94,6 +94,8 @@
 
     void visit( SetQuery obj );
 
+    void visit( ArithmeticOperand obj );
+
     void visit( UpperCase obj );
 
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitors.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitors.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Visitors.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -138,6 +138,11 @@
             }
 
             @Override
+            public void visit( FullTextSearchScore fullTextSearchScore ) {
+                symbols.add(fullTextSearchScore.getSelectorName());
+            }
+
+            @Override
             public void visit( Length length ) {
                 symbols.add(length.getSelectorName());
             }
@@ -227,6 +232,14 @@
         /**
          * {@inheritDoc}
          * 
+         * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.ArithmeticOperand)
+         */
+        public void visit( ArithmeticOperand obj ) {
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
          * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.Between)
          */
         public void visit( Between obj ) {
@@ -569,6 +582,18 @@
         /**
          * {@inheritDoc}
          * 
+         * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.ArithmeticOperand)
+         */
+        public void visit( ArithmeticOperand arithmeticOperation ) {
+            strategy.visit(arithmeticOperation);
+            enqueue(arithmeticOperation.getLeft());
+            enqueue(arithmeticOperation.getRight());
+            visitNext();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
          * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.Between)
          */
         public void visit( Between between ) {
@@ -1013,6 +1038,21 @@
         /**
          * {@inheritDoc}
          * 
+         * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.ArithmeticOperand)
+         */
+        public void visit( ArithmeticOperand arithmeticOperand ) {
+            append('(');
+            arithmeticOperand.getLeft().accept(this);
+            append(' ');
+            append(arithmeticOperand.getOperator().getSymbol());
+            append(' ');
+            arithmeticOperand.getRight().accept(this);
+            append(')');
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
          * @see org.jboss.dna.graph.query.model.Visitor#visit(org.jboss.dna.graph.query.model.Between)
          */
         public void visit( Between between ) {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/parse/SqlQueryParser.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/parse/SqlQueryParser.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/parse/SqlQueryParser.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -40,6 +40,8 @@
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.property.ValueFormatException;
 import org.jboss.dna.graph.query.model.And;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
+import org.jboss.dna.graph.query.model.ArithmeticOperator;
 import org.jboss.dna.graph.query.model.Between;
 import org.jboss.dna.graph.query.model.BindVariableName;
 import org.jboss.dna.graph.query.model.ChildNode;
@@ -106,6 +108,9 @@
  * <code>&lt;dynamicOperand> [NOT] IN (&lt;staticOperand> {, &lt;staticOperand>})</code>"</li>
  * <li>Support for the BETWEEN clause: "<code>&lt;dynamicOperand> [NOT] BETWEEN &lt;lowerBoundStaticOperand> [EXCLUSIVE] AND
  * &lt;upperBoundStaticOperand> [EXCLUSIVE]</code>"</i>
+ * <li>Support for arithmetic operations ('+', '-', '*', '/') between dynamic operands used in <code>WHERE</code> criteria and <code>ORDER BY</code>
+ * clauses: "<code>WHERE &lt;dynamicOperand> + &lt;dynamicOperand> ...</code>" or "<code>ORDER BY (&lt;dynamicOperand> + &lt;dynamicOperand>) [ASC]</code>".
+ * Note that standard operator precedence is used, but grouping by (potentially nested) parentheses is also supported.</i>
  * </ul>
  * </p>
  * <h3>SQL grammar</h3>
@@ -346,7 +351,8 @@
  * 
  * <pre>
  * DynamicOperand ::= PropertyValue | Length | NodeName | NodeLocalName | NodePath | NodeDepth | 
- *                    FullTextSearchScore | LowerCase | UpperCase
+ *                    FullTextSearchScore | LowerCase | UpperCase | Arithmetic | 
+ *                    '(' DynamicOperand ')'
  * </pre>
  * <h5>Property value</h5>
  * <pre>
@@ -396,6 +402,10 @@
  * <pre>
  * UpperCase ::= 'UPPER(' DynamicOperand ')'
  * </pre>
+ * <h5>Arithmetic</h5>
+ * <pre>
+ * Arithmetic ::= DynamicOperand ('+'|'-'|'*'|'/') DynamicOperand
+ * </pre>
  * 
  * <h4>Ordering</h4>
  * 
@@ -1036,7 +1046,10 @@
                                                   Source source ) {
         DynamicOperand result = null;
         Position pos = tokens.nextPosition();
-        if (tokens.canConsume("LENGTH", "(")) {
+        if (tokens.canConsume('(')) {
+            result = parseDynamicOperand(tokens, typeSystem, source);
+            tokens.consume(")");
+        } else if (tokens.canConsume("LENGTH", "(")) {
             result = new Length(parsePropertyValue(tokens, typeSystem, source));
             tokens.consume(")");
         } else if (tokens.canConsume("LOWER", "(")) {
@@ -1098,6 +1111,44 @@
         } else {
             result = parsePropertyValue(tokens, typeSystem, source);
         }
+
+        // Is this operand followed by an arithmetic operation ...
+        ArithmeticOperator arithmeticOperator = null;
+        if (tokens.canConsume('+')) {
+            arithmeticOperator = ArithmeticOperator.ADD;
+        } else if (tokens.canConsume('-')) {
+            arithmeticOperator = ArithmeticOperator.SUBTRACT;
+        } else if (tokens.canConsume('*')) {
+            arithmeticOperator = ArithmeticOperator.MULTIPLY;
+        } else if (tokens.canConsume('/')) {
+            arithmeticOperator = ArithmeticOperator.DIVIDE;
+        }
+        if (arithmeticOperator != null) {
+            if (tokens.matches('(')) {
+                // Don't use precendence, but instead use the next DynamicOperand as the RHS ...
+                DynamicOperand right = parseDynamicOperand(tokens, typeSystem, source);
+                result = new ArithmeticOperand(result, arithmeticOperator, right);
+            } else {
+                // There is no parenthesis, so use operator precedence ...
+                DynamicOperand right = parseDynamicOperand(tokens, typeSystem, source);
+                if (right instanceof ArithmeticOperand) {
+                    // But the RHS is an arithmetic operand, so we need to use operator precedence ...
+                    ArithmeticOperand arithRhs = (ArithmeticOperand)right;
+                    ArithmeticOperator rhsOperator = arithRhs.getOperator();
+                    if (arithmeticOperator.precedes(rhsOperator)) {
+                        // This operand's operator does take precedence, so this must be computed before working with the RHS ...
+                        DynamicOperand newRhs = arithRhs.getRight();
+                        DynamicOperand newLhs = new ArithmeticOperand(result, arithmeticOperator, arithRhs.getLeft());
+                        result = new ArithmeticOperand(newLhs, rhsOperator, newRhs);
+                    } else {
+                        result = new ArithmeticOperand(result, arithmeticOperator, right);
+                    }
+                } else {
+                    // The RHS is just another DynamicOperand ...
+                    result = new ArithmeticOperand(result, arithmeticOperator, right);
+                }
+            }
+        }
         return result;
     }
 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -336,6 +336,9 @@
 
         context.getHints().hasSort = true;
         sortNode.setProperty(Property.SORT_ORDER_BY, orderings);
+        for (Ordering ordering : orderings) {
+            sortNode.addSelectors(Visitors.getSelectorsReferencedBy(ordering));
+        }
 
         sortNode.addLastChild(plan);
         return sortNode;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanHints.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanHints.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanHints.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -25,6 +25,7 @@
 
 import java.io.Serializable;
 import net.jcip.annotations.NotThreadSafe;
+import org.jboss.dna.graph.query.QueryResults;
 
 @NotThreadSafe
 public final class PlanHints implements Serializable {
@@ -61,6 +62,9 @@
     /** Flag indicates that the plan has at least one view somewhere */
     public boolean hasView = false;
 
+    /** Flag indicates whether the query plan should be included in the {@link QueryResults} */
+    public boolean showPlan = false;
+
     public PlanHints() {
     }
 
@@ -75,6 +79,7 @@
         sb.append(", hasLimit=").append(hasLimit);
         sb.append(", hasOptionalJoin=").append(hasOptionalJoin);
         sb.append(", hasFullTextSearch=").append(hasFullTextSearch);
+        sb.append(", showPlan=").append(showPlan);
         sb.append('}');
         return sb.toString();
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -27,12 +27,15 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.jboss.dna.graph.query.QueryContext;
 import org.jboss.dna.graph.query.model.And;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
+import org.jboss.dna.graph.query.model.ArithmeticOperator;
 import org.jboss.dna.graph.query.model.Between;
 import org.jboss.dna.graph.query.model.ChildNode;
 import org.jboss.dna.graph.query.model.ChildNodeJoinCondition;
@@ -558,6 +561,20 @@
                         // Nothing to do here, as the selector names are fixed elsewhere
                         break;
                     case SORT:
+                        // The selector names and Ordering objects needs to be changed ...
+                        List<Ordering> orderings = node.getPropertyAsList(Property.SORT_ORDER_BY, Ordering.class);
+                        List<Ordering> newOrderings = new ArrayList<Ordering>(orderings.size());
+                        node.getSelectors().clear();
+                        for (Ordering ordering : orderings) {
+                            DynamicOperand operand = ordering.getOperand();
+                            DynamicOperand newOperand = replaceViewReferences(context, operand, mappings, node);
+                            if (newOperand != operand) {
+                                ordering = new Ordering(newOperand, ordering.getOrder());
+                            }
+                            node.addSelectors(Visitors.getSelectorsReferencedBy(ordering));
+                            newOrderings.add(ordering);
+                        }
+                        node.setProperty(Property.SORT_ORDER_BY, newOrderings);
                         break;
                     case GROUP:
                         // Don't yet use GROUP BY
@@ -678,11 +695,29 @@
                                                         DynamicOperand operand,
                                                         ColumnMapping mapping,
                                                         PlanNode node ) {
+        if (operand instanceof ArithmeticOperand) {
+            ArithmeticOperand arith = (ArithmeticOperand)operand;
+            DynamicOperand newLeft = replaceViewReferences(context, arith.getLeft(), mapping, node);
+            DynamicOperand newRight = replaceViewReferences(context, arith.getRight(), mapping, node);
+            return new ArithmeticOperand(newLeft, arith.getOperator(), newRight);
+        }
         if (operand instanceof FullTextSearchScore) {
             FullTextSearchScore score = (FullTextSearchScore)operand;
             if (!mapping.getOriginalName().equals(score.getSelectorName())) return score;
-            if (!mapping.isMappedToSingleSelector()) return score;
-            return new FullTextSearchScore(mapping.getSingleMappedSelectorName());
+            if (mapping.isMappedToSingleSelector()) {
+                return new FullTextSearchScore(mapping.getSingleMappedSelectorName());
+            }
+            // There are multiple mappings, so we have to create a composite score ...
+            DynamicOperand composite = null;
+            for (SelectorName name : mapping.getMappedSelectorNames()) {
+                FullTextSearchScore mappedScore = new FullTextSearchScore(name);
+                if (composite == null) {
+                    composite = mappedScore;
+                } else {
+                    composite = new ArithmeticOperand(composite, ArithmeticOperator.ADD, mappedScore);
+                }
+            }
+            return composite;
         }
         if (operand instanceof Length) {
             Length operation = (Length)operand;
@@ -857,7 +892,7 @@
     public static class ColumnMapping {
         private final SelectorName originalName;
         private final Map<String, Column> mappedColumnsByOriginalColumnName = new HashMap<String, Column>();
-        private final Set<SelectorName> mappedSelectorNames = new HashSet<SelectorName>();
+        private final Set<SelectorName> mappedSelectorNames = new LinkedHashSet<SelectorName>(); // maintains insertion order
 
         public ColumnMapping( SelectorName originalName ) {
             this.originalName = originalName;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/ProcessingComponent.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/ProcessingComponent.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/ProcessingComponent.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -32,6 +32,7 @@
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.query.QueryContext;
 import org.jboss.dna.graph.query.QueryResults.Columns;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
 import org.jboss.dna.graph.query.model.DynamicOperand;
 import org.jboss.dna.graph.query.model.FullTextSearchScore;
 import org.jboss.dna.graph.query.model.Length;
@@ -318,6 +319,132 @@
                 }
             };
         }
+        if (operand instanceof ArithmeticOperand) {
+            ArithmeticOperand arith = (ArithmeticOperand)operand;
+            final DynamicOperation leftOp = createDynamicOperation(typeSystem, schemata, columns, arith.getLeft());
+            final DynamicOperation rightOp = createDynamicOperation(typeSystem, schemata, columns, arith.getRight());
+            // compute the expected (common) type ...
+            String leftType = leftOp.getExpectedType();
+            String rightType = rightOp.getExpectedType();
+            final String commonType = typeSystem.getCompatibleType(leftType, rightType);
+            if (typeSystem.getDoubleFactory().getTypeName().equals(commonType)) {
+                final TypeFactory<Double> commonTypeFactory = typeSystem.getDoubleFactory();
+                switch (arith.getOperator()) {
+                    case ADD:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Double right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Double left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null) return left;
+                                if (left == null) return right;
+                                return left.doubleValue() / right.doubleValue();
+                            }
+                        };
+                    case SUBTRACT:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Double right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Double left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null) return left;
+                                if (left == null) left = 0.0d;
+                                return left.doubleValue() * right.doubleValue();
+                            }
+                        };
+                    case MULTIPLY:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Double right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Double left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null || left == null) return null;
+                                return left.doubleValue() * right.doubleValue();
+                            }
+                        };
+                    case DIVIDE:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Double right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Double left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null || left == null) return null;
+                                return left.doubleValue() / right.doubleValue();
+                            }
+                        };
+                }
+            } else if (typeSystem.getLongFactory().getTypeName().equals(commonType)) {
+                final TypeFactory<Long> commonTypeFactory = typeSystem.getLongFactory();
+                switch (arith.getOperator()) {
+                    case ADD:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Long right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Long left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null) return left;
+                                if (left == null) return right;
+                                return left.longValue() / right.longValue();
+                            }
+                        };
+                    case SUBTRACT:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Long right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Long left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null) return left;
+                                if (left == null) left = 0L;
+                                return left.longValue() * right.longValue();
+                            }
+                        };
+                    case MULTIPLY:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Long right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Long left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null || left == null) return null;
+                                return left.longValue() * right.longValue();
+                            }
+                        };
+                    case DIVIDE:
+                        return new DynamicOperation() {
+                            public String getExpectedType() {
+                                return commonType;
+                            }
+
+                            public Object evaluate( Object[] tuple ) {
+                                Long right = commonTypeFactory.create(rightOp.evaluate(tuple));
+                                Long left = commonTypeFactory.create(leftOp.evaluate(tuple));
+                                if (right == null || left == null) return null;
+                                return left.longValue() / right.longValue();
+                            }
+                        };
+                }
+            }
+        }
         assert false;
         return null;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryProcessor.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryProcessor.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -104,7 +104,8 @@
             statistics = statistics.withExecutionTime(System.nanoTime() - nanos);
         }
         assert tuples != null;
-        return new org.jboss.dna.graph.query.process.QueryResults(columns, statistics, tuples, context.getProblems());
+        final String planDesc = context.getHints().showPlan ? plan.getString() : null;
+        return new org.jboss.dna.graph.query.process.QueryResults(columns, statistics, tuples, context.getProblems(), planDesc);
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryResults.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryResults.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/QueryResults.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -49,6 +49,7 @@
     private final Columns columns;
     private final List<Object[]> tuples;
     private final Statistics statistics;
+    private final String plan;
 
     /**
      * Create a results object for the supplied context, command, and result columns and with the supplied tuples.
@@ -57,17 +58,20 @@
      * @param statistics the statistics for this query; may not be null
      * @param tuples the tuples
      * @param problems the problems; may be null if there are no problems
+     * @param plan the text representation of the query plan, if the hints asked for it
      */
     public QueryResults( Columns columns,
                          Statistics statistics,
                          List<Object[]> tuples,
-                         Problems problems ) {
+                         Problems problems,
+                         String plan ) {
         assert columns != null;
         assert statistics != null;
         this.problems = problems != null ? problems : NO_PROBLEMS;
         this.columns = columns;
         this.tuples = tuples;
         this.statistics = statistics;
+        this.plan = plan;
     }
 
     /**
@@ -80,7 +84,7 @@
     public QueryResults( Columns columns,
                          Statistics statistics,
                          List<Object[]> tuples ) {
-        this(columns, statistics, tuples, NO_PROBLEMS);
+        this(columns, statistics, tuples, NO_PROBLEMS, null);
     }
 
     /**
@@ -93,7 +97,7 @@
     public QueryResults( Columns columns,
                          Statistics statistics,
                          Problems problems ) {
-        this(columns, statistics, Collections.<Object[]>emptyList(), problems);
+        this(columns, statistics, Collections.<Object[]>emptyList(), problems, null);
     }
 
     /**
@@ -104,7 +108,7 @@
      */
     public QueryResults( Columns columns,
                          Statistics statistics ) {
-        this(columns, statistics, Collections.<Object[]>emptyList(), null);
+        this(columns, statistics, Collections.<Object[]>emptyList(), null, null);
     }
 
     /**
@@ -146,6 +150,15 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.query.QueryResults#getPlan()
+     */
+    public String getPlan() {
+        return plan;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.query.QueryResults#getProblems()
      */
     public Problems getProblems() {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/SortValuesComponent.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/SortValuesComponent.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/process/SortValuesComponent.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -119,8 +119,8 @@
             return new Comparator<Object[]>() {
                 public int compare( Object[] tuple1,
                                     Object[] tuple2 ) {
-                    Object value1 = operation.evaluate(tuple1);
-                    Object value2 = operation.evaluate(tuple2);
+                    Object value1 = typeFactory.create(operation.evaluate(tuple1));
+                    Object value2 = typeFactory.create(operation.evaluate(tuple2));
                     return 0 - typeComparator.compare(value1, value2);
                 }
             };
@@ -128,8 +128,8 @@
         return new Comparator<Object[]>() {
             public int compare( Object[] tuple1,
                                 Object[] tuple2 ) {
-                Object value1 = operation.evaluate(tuple1);
-                Object value2 = operation.evaluate(tuple2);
+                Object value1 = typeFactory.create(operation.evaluate(tuple1));
+                Object value2 = typeFactory.create(operation.evaluate(tuple2));
                 return typeComparator.compare(value1, value2);
             }
         };

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -26,14 +26,17 @@
 import java.util.HashMap;
 import java.util.Map;
 import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.query.QueryContext;
 import org.jboss.dna.graph.query.model.AllNodes;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
 import org.jboss.dna.graph.query.model.ChildNode;
 import org.jboss.dna.graph.query.model.ChildNodeJoinCondition;
 import org.jboss.dna.graph.query.model.Column;
 import org.jboss.dna.graph.query.model.DescendantNode;
 import org.jboss.dna.graph.query.model.DescendantNodeJoinCondition;
+import org.jboss.dna.graph.query.model.DynamicOperand;
 import org.jboss.dna.graph.query.model.EquiJoinCondition;
 import org.jboss.dna.graph.query.model.FullTextSearch;
 import org.jboss.dna.graph.query.model.FullTextSearchScore;
@@ -49,6 +52,7 @@
 import org.jboss.dna.graph.query.model.SameNode;
 import org.jboss.dna.graph.query.model.SameNodeJoinCondition;
 import org.jboss.dna.graph.query.model.SelectorName;
+import org.jboss.dna.graph.query.model.TypeSystem;
 import org.jboss.dna.graph.query.model.Visitor;
 import org.jboss.dna.graph.query.model.Visitors.AbstractVisitor;
 import org.jboss.dna.graph.query.validate.Schemata.Table;
@@ -92,6 +96,53 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.ArithmeticOperand)
+     */
+    @Override
+    public void visit( ArithmeticOperand obj ) {
+        verifyArithmeticOperand(obj.getLeft());
+        verifyArithmeticOperand(obj.getRight());
+    }
+
+    protected void verifyArithmeticOperand( DynamicOperand operand ) {
+        // The left and right operands must have LONG or DOUBLE types ...
+        if (operand instanceof NodeDepth) {
+            // good to go
+        } else if (operand instanceof Length) {
+            // good to go
+        } else if (operand instanceof ArithmeticOperand) {
+            // good to go
+        } else if (operand instanceof FullTextSearchScore) {
+            // good to go
+        } else if (operand instanceof PropertyValue) {
+            PropertyValue value = (PropertyValue)operand;
+            SelectorName selector = value.getSelectorName();
+            String propertyName = value.getPropertyName();
+            Schemata.Column column = verify(selector, propertyName);
+            if (column != null) {
+                // Check the type ...
+                String columnType = column.getPropertyType();
+                TypeSystem types = context.getTypeSystem();
+                String longType = types.getLongFactory().getTypeName();
+                String doubleType = types.getDoubleFactory().getTypeName();
+                if (longType.equals(types.getCompatibleType(columnType, longType))) {
+                    // Then the column type is long or can be converted to long ...
+                } else if (doubleType.equals(types.getCompatibleType(columnType, doubleType))) {
+                    // Then the column type is double or can be converted to double ...
+                } else {
+                    I18n msg = GraphI18n.columnTypeCannotBeUsedInArithmeticOperation;
+                    problems.addError(msg, selector, propertyName, columnType);
+                }
+            }
+        } else {
+            I18n msg = GraphI18n.dynamicOperandCannotBeUsedInArithmeticOperation;
+            problems.addError(msg, operand);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.ChildNode)
      */
     @Override

Modified: trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties
===================================================================
--- trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties	2010-01-06 23:48:32 UTC (rev 1536)
@@ -131,6 +131,8 @@
 columnDoesNotExistInQuery = Column '{0}' does not exist in query
 columnIsNotFullTextSearchable = Column '{0}' on the table '{1}' does not support full-text searching
 tableIsNotFullTextSearchable = Table '{0}' has no columns that support full-text searching
+columnTypeCannotBeUsedInArithmeticOperation = Column '{0}' on table '{1}' has a type of '{2}' and cannot be used in an arithmetic operation
+dynamicOperandCannotBeUsedInArithmeticOperation = '{0}' does not evaluate to a long or double and cannot be used in an arithmetic operation
 selectorDoesNotExistInQuery = Selector '{0}' does not exist in query
 propertyOnSelectorIsNotUsedInQuery = Property '{0}' on selector '{1}' is not used in query
 errorResolvingNodesFromLocationsUsingSourceAndWorkspace = Error resolving nodes from locations using '{1}' workspace in '{0}'
@@ -155,6 +157,7 @@
 expectingLiteralAndUnableToParseAsLong = Expecting literal and unable to parse '{0}' at line {1}, column {2} as a long
 expectingLiteralAndUnableToParseAsDouble = Expecting literal and unable to parse '{0}' at line {1}, column {2} as a double
 expectingLiteralAndUnableToParseAsDate = Expecting literal and unable to parse '{0}' at line {1}, column {2} as a date
+unexpectedClosingParenthesis = Unexpected closing parenthesis without a matching opening parenthesis
 
 # Search
 interruptedWhileClosingChannel = Thread was interrupted while closing request processing channel for source "{0}"

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/QueryBuilderTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/QueryBuilderTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/QueryBuilderTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -466,6 +466,40 @@
     }
 
     @Test
+    public void shouldBuildQueryWithCriteriaUsingPlus() {
+        query = builder.selectStar()
+                       .from("table AS nodes")
+                       .where()
+                       .depth("nodes")
+                       .plus()
+                       .depth("nodes")
+                       .plus()
+                       .depth("nodes")
+                       .isEqualTo(3)
+                       .end()
+                       .query();
+        assertThatSql(query, is("SELECT * FROM table AS nodes " + //
+                                "WHERE ((DEPTH(nodes) + DEPTH(nodes)) + DEPTH(nodes)) = 3"));
+    }
+
+    @Test
+    public void shouldBuildQueryWithCriteriaUsingPlusAndMinus() {
+        query = builder.selectStar()
+                       .from("table AS nodes")
+                       .where()
+                       .depth("nodes")
+                       .minus()
+                       .depth("nodes")
+                       .plus()
+                       .fullTextSearchScore("nodes")
+                       .isEqualTo(3)
+                       .end()
+                       .query();
+        assertThatSql(query, is("SELECT * FROM table AS nodes " + //
+                                "WHERE (DEPTH(nodes) - (DEPTH(nodes) + SCORE(nodes))) = 3"));
+    }
+
+    @Test
     public void shouldBuildQueryWithCriteriaUsingLengthEqualTo() {
         query = builder.selectStar()
                        .from("table AS nodes")
@@ -1369,7 +1403,7 @@
     }
 
     @Test
-    public void shouldBuilderQueryWithSetCriteria() {
+    public void shouldBuildQueryWithSetCriteria() {
         query = builder.selectStar()
                        .from("table AS nodes")
                        .where()
@@ -1380,4 +1414,18 @@
         assertThatSql(query, is("SELECT * FROM table AS nodes " + //
                                 "WHERE NAME(nodes) IN ('value1','value2','value3')"));
     }
+
+    @Test
+    public void shouldBuildQueryWithOneOrderByClause() {
+        query = builder.selectStar()
+                       .from("table AS nodes")
+                       .orderBy()
+                       .ascending()
+                       .fullTextSearchScore("nodes")
+                       .then()
+                       .descending()
+                       .length("nodes", "column")
+                       .end()
+                       .query();
+    }
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -34,13 +34,19 @@
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.query.AbstractQueryTest;
 import org.jboss.dna.graph.query.QueryContext;
+import org.jboss.dna.graph.query.model.ArithmeticOperand;
+import org.jboss.dna.graph.query.model.ArithmeticOperator;
 import org.jboss.dna.graph.query.model.Column;
 import org.jboss.dna.graph.query.model.Comparison;
+import org.jboss.dna.graph.query.model.DynamicOperand;
 import org.jboss.dna.graph.query.model.EquiJoinCondition;
 import org.jboss.dna.graph.query.model.FullTextSearch;
+import org.jboss.dna.graph.query.model.FullTextSearchScore;
 import org.jboss.dna.graph.query.model.JoinType;
 import org.jboss.dna.graph.query.model.Literal;
 import org.jboss.dna.graph.query.model.Operator;
+import org.jboss.dna.graph.query.model.Order;
+import org.jboss.dna.graph.query.model.Ordering;
 import org.jboss.dna.graph.query.model.PropertyValue;
 import org.jboss.dna.graph.query.model.QueryCommand;
 import org.jboss.dna.graph.query.model.SelectorName;
@@ -507,6 +513,88 @@
         assertThat(node.isSameAs(access), is(true));
     }
 
+    @Test
+    public void shouldOptimizePlanForQueryWithOrderByClause() {
+        node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY v2.c11, v2.c12 DESC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+        PlanNode project = new PlanNode(Type.PROJECT, sort, selector("t1"));
+        project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+        PlanNode join = new PlanNode(Type.JOIN, project, selector("t2"), selector("t1"));
+        join.setProperty(Property.JOIN_ALGORITHM, JoinAlgorithm.NESTED_LOOP);
+        join.setProperty(Property.JOIN_TYPE, JoinType.INNER);
+        join.setProperty(Property.JOIN_CONDITION, new EquiJoinCondition(selector("t1"), "c11", selector("t2"), "c21"));
+
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("t2"));
+        PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("t2"));
+        rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t2", "c21")));
+        PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("t2"));
+        rightSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t2"), "c21"),
+                                                                          Operator.EQUAL_TO, new Literal("x")));
+        PlanNode rightSource = new PlanNode(Type.SOURCE, rightSelect1, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_NAME, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t2")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
+    @Test
+    public void shouldOptimizePlanForQueryWithOrderByClauseThatUsesScoreFunction() {
+        node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY SCORE(v2) ASC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"), selector("t2"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascendingScore("t1", "t2")));
+        PlanNode project = new PlanNode(Type.PROJECT, sort, selector("t1"));
+        project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+        PlanNode join = new PlanNode(Type.JOIN, project, selector("t2"), selector("t1"));
+        join.setProperty(Property.JOIN_ALGORITHM, JoinAlgorithm.NESTED_LOOP);
+        join.setProperty(Property.JOIN_TYPE, JoinType.INNER);
+        join.setProperty(Property.JOIN_CONDITION, new EquiJoinCondition(selector("t1"), "c11", selector("t2"), "c21"));
+
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("t2"));
+        PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("t2"));
+        rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t2", "c21")));
+        PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("t2"));
+        rightSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t2"), "c21"),
+                                                                          Operator.EQUAL_TO, new Literal("x")));
+        PlanNode rightSource = new PlanNode(Type.SOURCE, rightSelect1, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_NAME, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t2")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
     // ----------------------------------------------------------------------------------------------------------------
     // Utility methods ...
     // ----------------------------------------------------------------------------------------------------------------
@@ -515,6 +603,39 @@
         return Arrays.asList(columns);
     }
 
+    protected List<Ordering> orderings( Ordering... orderings ) {
+        return Arrays.asList(orderings);
+    }
+
+    protected Ordering ascending( String table,
+                                  String columnName ) {
+        return new Ordering(new PropertyValue(new SelectorName(table), columnName), Order.ASCENDING);
+    }
+
+    protected Ordering descending( String table,
+                                   String columnName ) {
+        return new Ordering(new PropertyValue(new SelectorName(table), columnName), Order.DESCENDING);
+    }
+
+    protected Ordering ascendingScore( String... tableNames ) {
+        return new Ordering(score(tableNames), Order.ASCENDING);
+    }
+
+    protected Ordering descendingScore( String... tableNames ) {
+        return new Ordering(score(tableNames), Order.DESCENDING);
+    }
+
+    protected DynamicOperand score( String... tableNames ) {
+        DynamicOperand operand = null;
+        for (String tableName : tableNames) {
+            DynamicOperand right = new FullTextSearchScore(new SelectorName(tableName));
+            if (operand == null) operand = right;
+            else operand = new ArithmeticOperand(operand, ArithmeticOperator.ADD, right);
+        }
+        assert operand != null;
+        return operand;
+    }
+
     protected Column column( String table,
                              String columnName ) {
         return new Column(new SelectorName(table), columnName, columnName);

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/plan/CanonicalPlannerTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/plan/CanonicalPlannerTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/plan/CanonicalPlannerTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -60,6 +60,7 @@
     private Schemata schemata;
     private ImmutableSchemata.Builder schemataBuilder;
     private QueryContext queryContext;
+    private boolean print;
 
     @Before
     public void beforeEach() {
@@ -69,8 +70,13 @@
         builder = new QueryBuilder(typeSystem);
         problems = new SimpleProblems();
         schemataBuilder = ImmutableSchemata.createBuilder(typeSystem);
+        print = false;
     }
 
+    protected void print( PlanNode plan ) {
+        if (print) System.out.println(plan);
+    }
+
     protected SelectorName selector( String name ) {
         return new SelectorName(name);
     }
@@ -132,7 +138,7 @@
         PlanNode source = plan.getFirstChild();
         assertSourceNode(source, "__ALLNODES__", null, "column1", "column2", "column3");
         assertThat(source.getChildCount(), is(0));
-        System.out.println(plan);
+        print(plan);
     }
 
     @Test
@@ -159,7 +165,7 @@
         query = builder.selectStar().from("someTable").query();
         queryContext = new QueryContext(schemata, typeSystem, hints, problems);
         plan = planner.createPlan(queryContext, query);
-        System.out.println(plan);
+        print(plan);
         assertThat(problems.hasErrors(), is(false));
         assertThat(problems.isEmpty(), is(true));
         assertProjectNode(plan, "column1", "column2", "column3");
@@ -188,7 +194,7 @@
         queryContext = new QueryContext(schemata, typeSystem, hints, problems);
         plan = planner.createPlan(queryContext, query);
         assertThat(problems.hasErrors(), is(false));
-        System.out.println(plan);
+        print(plan);
         assertThat(plan.getType(), is(PlanNode.Type.PROJECT));
         assertThat(plan.getSelectors(), is(selectors("t1")));
     }
@@ -200,7 +206,7 @@
         queryContext = new QueryContext(schemata, typeSystem, hints, problems);
         plan = planner.createPlan(queryContext, query);
         assertThat(problems.hasErrors(), is(false));
-        System.out.println(plan);
+        print(plan);
         assertThat(plan.getType(), is(PlanNode.Type.PROJECT));
         assertThat(plan.getSelectors(), is(selectors("t1")));
     }
@@ -267,4 +273,48 @@
         assertThat(problems.hasErrors(), is(true));
     }
 
+    @Test
+    public void shouldProducePlanWhenOrderByClauseIsUsed() {
+        schemata = schemataBuilder.addTable("dna:someTable", "column1", "column2", "column3").build();
+        query = builder.selectStar()
+                       .from("dna:someTable AS t1")
+                       .where()
+                       .path("t1")
+                       .isEqualTo(1L)
+                       .end()
+                       .orderBy()
+                       .ascending()
+                       .propertyValue("t1", "column1")
+                       .end()
+                       .query();
+        queryContext = new QueryContext(schemata, typeSystem, hints, problems);
+        plan = planner.createPlan(queryContext, query);
+        assertThat(problems.hasErrors(), is(false));
+        print(plan);
+        assertThat(plan.getType(), is(PlanNode.Type.SORT));
+        assertThat(plan.getSelectors(), is(selectors("t1")));
+    }
+
+    @Test
+    public void shouldProducePlanWhenOrderByClauseWithScoreIsUsed() {
+        schemata = schemataBuilder.addTable("dna:someTable", "column1", "column2", "column3").build();
+        query = builder.selectStar()
+                       .from("dna:someTable AS t1")
+                       .where()
+                       .path("t1")
+                       .isEqualTo(1L)
+                       .end()
+                       .orderBy()
+                       .ascending()
+                       .fullTextSearchScore("t1")
+                       .end()
+                       .query();
+        queryContext = new QueryContext(schemata, typeSystem, hints, problems);
+        plan = planner.createPlan(queryContext, query);
+        assertThat(problems.hasErrors(), is(false));
+        print(plan);
+        assertThat(plan.getType(), is(PlanNode.Type.SORT));
+        assertThat(plan.getSelectors(), is(selectors("t1")));
+    }
+
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/process/QueryResultColumnsTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/process/QueryResultColumnsTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/process/QueryResultColumnsTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -92,7 +92,7 @@
 
     @Test
     public void shouldReturnSameTuplesListPassedIntoConstructor() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         assertThat(results.getTuples(), is(sameInstance(tuples)));
     }
 
@@ -105,14 +105,14 @@
     @Test
     public void shouldHaveNoTuplesIfConstructedWithEmptyTuplesList() {
         tuples.clear();
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         assertThat(results.getTuples().isEmpty(), is(true));
         assertThat(results.getCursor().hasNext(), is(false));
     }
 
     @Test
     public void shouldReturnMutableTuplesList() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         assertThat(results.getTuples().isEmpty(), is(false));
         results.getTuples().clear();
         assertThat(results.getTuples().isEmpty(), is(true));
@@ -121,7 +121,7 @@
 
     @Test
     public void shouldReturnCursorThatAccessesTuples() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         Cursor cursor = results.getCursor();
         Iterator<Object[]> expectedIter = tuples.iterator();
         int rowNumber = 0;
@@ -155,7 +155,7 @@
 
     @Test( expected = IllegalStateException.class )
     public void shouldRequireNextOnCursorToBeCalledBeforeGettingValueUsingColumnIndex() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         Cursor cursor = results.getCursor();
         assertThat(cursor.hasNext(), is(true));
         cursor.getValue(0);
@@ -163,7 +163,7 @@
 
     @Test( expected = IllegalStateException.class )
     public void shouldRequireNextOnCursorToBeCalledBeforeGettingValueUsingColumnName() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         Cursor cursor = results.getCursor();
         assertThat(cursor.hasNext(), is(true));
         cursor.getValue("colA");
@@ -171,14 +171,14 @@
 
     @Test
     public void shouldPrintToStringAllResults() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         List<String> lines = StringUtil.splitLines(results.toString());
         assertThat(lines.size(), is(tuples.size() + 4)); // = delim + header + delim + (...lines...) + delim
     }
 
     @Test
     public void shouldPrintToStringBuilderAllResults() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         StringBuilder sb = new StringBuilder();
         results.toString(typeSystem, sb);
         List<String> lines = StringUtil.splitLines(sb.toString());
@@ -188,7 +188,7 @@
     @Test
     public void shouldPrintToStringBuilderAllResultsEvenWhenNoTuples() {
         tuples.clear();
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         StringBuilder sb = new StringBuilder();
         results.toString(typeSystem, sb);
         List<String> lines = StringUtil.splitLines(sb.toString());
@@ -197,7 +197,7 @@
 
     @Test
     public void shouldPrintToStringBuilderOnlyFirstLinesOfResults() {
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         StringBuilder sb = new StringBuilder();
         results.toString(typeSystem, sb, 1);
         List<String> lines = StringUtil.splitLines(sb.toString());
@@ -207,7 +207,7 @@
     @Test
     public void shouldPrintToStringBuilderOnlyFirstLinesOfResultsEvenWhenNoTuples() {
         tuples.clear();
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         StringBuilder sb = new StringBuilder();
         results.toString(typeSystem, sb, 3);
         List<String> lines = StringUtil.splitLines(sb.toString());
@@ -217,7 +217,7 @@
     @Test
     public void shouldPrintToStringBuilderAllResultsWhenMaxRowParameterIsLargerThanNumberOfTuples() {
         tuples.clear();
-        results = new QueryResults(columns, statistics, tuples, context.getProblems());
+        results = new QueryResults(columns, statistics, tuples, context.getProblems(), null);
         StringBuilder sb = new StringBuilder();
         results.toString(typeSystem, sb, 3);
         List<String> lines = StringUtil.splitLines(sb.toString());

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -46,8 +46,12 @@
 import javax.jcr.query.RowIterator;
 import net.jcip.annotations.Immutable;
 import net.jcip.annotations.NotThreadSafe;
+import org.jboss.dna.common.collection.Problem;
+import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.common.collection.Problem.Status;
 import org.jboss.dna.common.text.ParsingException;
 import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.StringUtil;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.property.NamespaceRegistry;
 import org.jboss.dna.graph.property.Path;
@@ -119,6 +123,7 @@
                 throw new InvalidQueryException(JcrI18n.queryCannotBeParsedUsingLanguage.text(language, expression));
             }
             PlanHints hints = new PlanHints();
+            hints.showPlan = true;
             // If using XPath, we need to add a few hints ...
             if (Query.XPATH.equals(language)) {
                 hints.hasFullTextSearch = true; // requires 'jcr:score' to exist
@@ -260,6 +265,18 @@
 
             return queryNode;
         }
+
+        protected void checkForProblems( Problems problems ) throws RepositoryException {
+            if (problems.hasErrors()) {
+                // Build a message with the problems ...
+                StringBuilder msg = new StringBuilder();
+                for (Problem problem : problems) {
+                    if (problem.getStatus() != Status.ERROR) continue;
+                    msg.append(problem.getMessageString()).append("\n");
+                }
+                throw new RepositoryException(msg.toString());
+            }
+        }
     }
 
     /**
@@ -297,7 +314,12 @@
             this.variables = null;
         }
 
-        protected QueryCommand getCommand() {
+        /**
+         * Get the underlying and immutable Abstract Query Model representation of this query.
+         * 
+         * @return the AQM representation; never null
+         */
+        public QueryCommand getAbstractQueryModel() {
             return query;
         }
 
@@ -314,12 +336,23 @@
                                                                             schemata,
                                                                             hints,
                                                                             variables);
+            checkForProblems(result.getProblems());
             if (Query.XPATH.equals(language)) {
                 return new XPathQueryResult(session, result);
             }
             return new JcrQueryResult(session, result);
         }
 
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            return language + " -> " + statement + "\n" + StringUtil.createString(' ', Math.min(language.length() - 3, 0))
+                   + "AQM -> " + query;
+        }
     }
 
     @NotThreadSafe
@@ -354,8 +387,19 @@
                                                                              statement,
                                                                              MAXIMUM_RESULTS_FOR_FULL_TEXT_SEARCH_QUERIES,
                                                                              0);
+            checkForProblems(result.getProblems());
             return new JcrQueryResult(session, result);
         }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            return language + " -> " + statement;
+        }
     }
 
     protected static final String JCR_SCORE_COLUMN_NAME = "jcr:score";
@@ -430,6 +474,15 @@
         }
 
         /**
+         * Get a description of the query plan, if requested.
+         * 
+         * @return the query plan, or null if the plan was not requested
+         */
+        public String getPlan() {
+            return results.getPlan();
+        }
+
+        /**
          * {@inheritDoc}
          * 
          * @see java.lang.Object#toString()

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPath.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPath.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPath.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -26,10 +26,12 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import org.jboss.dna.common.collection.ReadOnlyIterator;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.common.util.ObjectUtil;
 import org.jboss.dna.graph.query.model.Operator;
+import org.jboss.dna.graph.query.model.Order;
 
 /**
  * Abstract syntax components of an XPath query. The supported grammar is defined by JCR 1.0, and is a subset of what is allowed
@@ -642,11 +644,14 @@
     public static class PathExpression extends Component implements Iterable<StepExpression> {
         private final List<StepExpression> steps;
         private final boolean relative;
+        private final OrderBy orderBy;
 
         public PathExpression( boolean relative,
-                               List<StepExpression> steps ) {
+                               List<StepExpression> steps,
+                               OrderBy orderBy ) {
             this.steps = steps;
             this.relative = relative;
+            this.orderBy = orderBy;
         }
 
         /**
@@ -657,6 +662,15 @@
         }
 
         /**
+         * Get the order-by clause.
+         * 
+         * @return the order-by clause, or null if there is no such clause
+         */
+        public OrderBy getOrderBy() {
+            return orderBy;
+        }
+
+        /**
          * @return steps
          */
         public List<StepExpression> getSteps() {
@@ -669,12 +683,12 @@
 
         public PathExpression withoutLast() {
             assert !steps.isEmpty();
-            return new PathExpression(relative, steps.subList(0, steps.size() - 1));
+            return new PathExpression(relative, steps.subList(0, steps.size() - 1), orderBy);
         }
 
         public PathExpression withoutFirst() {
             assert !steps.isEmpty();
-            return new PathExpression(relative, steps.subList(1, steps.size()));
+            return new PathExpression(relative, steps.subList(1, steps.size()), orderBy);
         }
 
         /**
@@ -701,7 +715,10 @@
             if (obj == this) return true;
             if (obj instanceof PathExpression) {
                 PathExpression that = (PathExpression)obj;
-                return this.relative == that.relative && this.steps.equals(that.steps);
+                if (this.relative != that.relative) return false;
+                if (this.orderBy != null && !this.orderBy.equals(that.orderBy)) return false;
+                if (this.orderBy == null && that.orderBy != null) return false;
+                return this.steps.equals(that.steps);
             }
             return false;
         }
@@ -1382,4 +1399,166 @@
             return "schema-attribute(" + attributeDeclarationName + ")";
         }
     }
+
+    public static class OrderBy extends Component implements Iterable<OrderBySpec> {
+        private final List<OrderBySpec> orderBySpecifications;
+
+        public OrderBy( List<OrderBySpec> orderBySpecifications ) {
+            this.orderBySpecifications = orderBySpecifications;
+        }
+
+        /**
+         *@return the list of order-by specifications; never null
+         */
+        public List<OrderBySpec> getOrderBySpecifications() {
+            return orderBySpecifications;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.jcr.xpath.XPath.Component#collapse()
+         */
+        @Override
+        public Component collapse() {
+            return super.collapse();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Iterable#iterator()
+         */
+        public Iterator<OrderBySpec> iterator() {
+            return new ReadOnlyIterator<OrderBySpec>(orderBySpecifications.iterator());
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals( Object obj ) {
+            if (obj == this) return true;
+            if (obj instanceof OrderBy) {
+                OrderBy that = (OrderBy)obj;
+                return this.orderBySpecifications.equals(that.orderBySpecifications);
+            }
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("order-by(");
+            boolean first = true;
+            for (OrderBySpec spec : orderBySpecifications) {
+                if (first) first = false;
+                else sb.append(',');
+                sb.append(spec);
+            }
+            sb.append(')');
+            return sb.toString();
+        }
+    }
+
+    public static class OrderBySpec {
+        private final Order order;
+        private final FunctionCall scoreFunction;
+        private final NameTest attributeName;
+
+        public OrderBySpec( Order order,
+                            FunctionCall scoreFunction ) {
+            assert order != null;
+            assert scoreFunction != null;
+            this.order = order;
+            this.scoreFunction = scoreFunction;
+            this.attributeName = null;
+        }
+
+        public OrderBySpec( Order order,
+                            NameTest attributeName ) {
+            assert order != null;
+            assert attributeName != null;
+            this.order = order;
+            this.scoreFunction = null;
+            this.attributeName = attributeName;
+        }
+
+        /**
+         * Get the attribute name for this order specification.
+         * 
+         * @return the attribute name, or null if the order is defined by the {@link #getScoreFunction() score function}
+         */
+        public NameTest getAttributeName() {
+            return attributeName;
+        }
+
+        /**
+         * Get the score function for this order specification.
+         * 
+         * @return the score function with its parameters, or null if the order is defined by the {@link #getAttributeName()
+         *         attribute name}
+         */
+        public FunctionCall getScoreFunction() {
+            return scoreFunction;
+        }
+
+        /**
+         * The order for this specification
+         * 
+         * @return the order; never null
+         */
+        public Order getOrder() {
+            return order;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals( Object obj ) {
+            if (obj == this) return true;
+            if (obj instanceof OrderBySpec) {
+                OrderBySpec that = (OrderBySpec)obj;
+                if (this.order != that.order) return false;
+                if (this.attributeName != null && !this.attributeName.equals(that.attributeName)) return false;
+                if (this.scoreFunction != null && !this.scoreFunction.equals(that.scoreFunction)) return false;
+                return true;
+            }
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            if (scoreFunction != null) {
+                sb.append(scoreFunction.toString());
+            } else {
+                sb.append('@').append(attributeName.toString());
+            }
+            switch (order) {
+                case ASCENDING:
+                    sb.append(" ascending");
+                    break;
+                case DESCENDING:
+                    sb.append(" descending");
+                    break;
+            }
+            return sb.toString();
+        }
+    }
 }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathParser.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathParser.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathParser.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -37,6 +37,7 @@
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.property.ValueFormatException;
 import org.jboss.dna.graph.query.model.Operator;
+import org.jboss.dna.graph.query.model.Order;
 import org.jboss.dna.graph.query.model.TypeSystem;
 import org.jboss.dna.jcr.xpath.XPath.Add;
 import org.jboss.dna.jcr.xpath.XPath.And;
@@ -63,6 +64,8 @@
 import org.jboss.dna.jcr.xpath.XPath.NodeComparisonOperator;
 import org.jboss.dna.jcr.xpath.XPath.NodeTest;
 import org.jboss.dna.jcr.xpath.XPath.Or;
+import org.jboss.dna.jcr.xpath.XPath.OrderBy;
+import org.jboss.dna.jcr.xpath.XPath.OrderBySpec;
 import org.jboss.dna.jcr.xpath.XPath.ParenthesizedExpression;
 import org.jboss.dna.jcr.xpath.XPath.PathExpression;
 import org.jboss.dna.jcr.xpath.XPath.ProcessingInstructionTest;
@@ -281,7 +284,8 @@
             }
             relative = false;
         }
-        PathExpression result = new PathExpression(relative, parseRelativePathExpr(tokens).getSteps());
+        PathExpression relativeExpr = parseRelativePathExpr(tokens);
+        PathExpression result = new PathExpression(relative, relativeExpr.getSteps(), relativeExpr.getOrderBy());
         if (prependDependentOrSelf) {
             result.getSteps().add(0, new DescendantOrSelf());
         }
@@ -299,7 +303,8 @@
                 steps.add(parseStepExpr(tokens));
             }
         }
-        return new PathExpression(true, steps);
+        OrderBy orderBy = parseOrderBy(tokens); // may be null
+        return new PathExpression(true, steps, orderBy);
     }
 
     protected StepExpression parseStepExpr( TokenStream tokens ) {
@@ -658,6 +663,37 @@
     protected void parseSequenceType( TokenStream tokens ) {
     }
 
+    protected OrderBy parseOrderBy( TokenStream tokens ) {
+        if (tokens.canConsume("order", "by")) {
+            List<OrderBySpec> specs = new ArrayList<OrderBySpec>();
+            do {
+                OrderBySpec spec = parseOrderBySpec(tokens);
+                specs.add(spec);
+            } while (tokens.canConsume(','));
+            if (!specs.isEmpty()) return new OrderBy(specs);
+        }
+        return null;
+    }
+
+    protected OrderBySpec parseOrderBySpec( TokenStream tokens ) {
+        if (tokens.canConsume('@')) {
+            NameTest attributeName = parseQName(tokens);
+            Order order = Order.ASCENDING;
+            if (tokens.canConsume("ascending")) order = Order.ASCENDING;
+            else if (tokens.canConsume("descending")) order = Order.DESCENDING;
+            return new OrderBySpec(order, attributeName);
+        }
+        if (tokens.matches("jcr", ":", "score", "(")) {
+            FunctionCall scoreFunction = parseFunctionCall(tokens);
+            Order order = Order.ASCENDING;
+            if (tokens.canConsume("ascending")) order = Order.ASCENDING;
+            else if (tokens.canConsume("descending")) order = Order.DESCENDING;
+            return new OrderBySpec(order, scoreFunction);
+        }
+        throw new ParsingException(tokens.nextPosition(),
+                                   "Expected either 'jcr:score(tableName)' or '@<propertyName>' but found " + tokens.consume());
+    }
+
     /**
      * Remove any leading and trailing single-quotes or double-quotes from the supplied text.
      * 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -33,7 +33,11 @@
 import org.jboss.dna.graph.property.PropertyType;
 import org.jboss.dna.graph.query.QueryBuilder;
 import org.jboss.dna.graph.query.QueryBuilder.ConstraintBuilder;
+import org.jboss.dna.graph.query.QueryBuilder.OrderByBuilder;
+import org.jboss.dna.graph.query.QueryBuilder.OrderByOperandBuilder;
+import org.jboss.dna.graph.query.model.AllNodes;
 import org.jboss.dna.graph.query.model.Operator;
+import org.jboss.dna.graph.query.model.Query;
 import org.jboss.dna.graph.query.model.QueryCommand;
 import org.jboss.dna.graph.query.model.TypeSystem;
 import org.jboss.dna.graph.query.parse.InvalidQueryException;
@@ -54,6 +58,8 @@
 import org.jboss.dna.jcr.xpath.XPath.NameTest;
 import org.jboss.dna.jcr.xpath.XPath.NodeTest;
 import org.jboss.dna.jcr.xpath.XPath.Or;
+import org.jboss.dna.jcr.xpath.XPath.OrderBy;
+import org.jboss.dna.jcr.xpath.XPath.OrderBySpec;
 import org.jboss.dna.jcr.xpath.XPath.ParenthesizedExpression;
 import org.jboss.dna.jcr.xpath.XPath.PathExpression;
 import org.jboss.dna.jcr.xpath.XPath.StepExpression;
@@ -221,6 +227,55 @@
             translateSource(tableName, path, where);
         }
         where.end();
+
+        // Process the order-by clause ...
+        OrderBy orderBy = pathExpression.getOrderBy();
+        if (orderBy != null) {
+            OrderByBuilder orderByBuilder = builder.orderBy();
+            for (OrderBySpec spec : orderBy) {
+                OrderByOperandBuilder operandBuilder = null;
+                switch (spec.getOrder()) {
+                    case ASCENDING:
+                        operandBuilder = orderByBuilder.ascending();
+                        break;
+                    case DESCENDING:
+                        operandBuilder = orderByBuilder.descending();
+                        break;
+                }
+                assert operandBuilder != null;
+                if (spec.getAttributeName() != null) {
+                    // This order by is defined by an attribute ...
+                    NameTest attribute = spec.getAttributeName();
+                    assert !attribute.isWildcard();
+                    operandBuilder.propertyValue(tableName, attribute.toString());
+                    builder.select(tableName + "." + attribute.toString());
+                } else {
+                    // This order-by is defined by a "jcr:score" function ...
+                    FunctionCall scoreFunction = spec.getScoreFunction();
+                    assert scoreFunction != null;
+                    List<Component> args = scoreFunction.getParameters();
+                    String nameOfTableToScore = tableName;
+                    if (!args.isEmpty()) {
+                        if (args.size() == 1 && args.get(0) instanceof NameTest) {
+                            // Just the table name ...
+                            NameTest tableNameTest = (NameTest)args.get(0);
+                            nameOfTableToScore = tableNameTest.toString();
+                        }
+                    }
+                    operandBuilder.fullTextSearchScore(nameOfTableToScore);
+                }
+            }
+            orderByBuilder.end();
+        }
+        // Try building this query, because we need to check the # of columns selected and the # of sources ...
+        Query query = (Query)builder.query();
+        if (query.getColumns().isEmpty() && query.getSource() instanceof AllNodes) {
+            // This is basically 'SELECT * FROM __ALLNODES__", which means that no type was explicitly specified and
+            // nothing was selected from that type. According to JCR 1.0 Section 6.6.3.1, this equates to
+            // 'SELECT * FROM [nt:base]', and since there is just one property on nt:base (but many on __ALLNODES__)
+            // this really equates to 'SELECT [jcr:primaryType] FROM __ALLNODES__'.
+            builder.select("jcr:primaryType");
+        }
     }
 
     /**
@@ -301,17 +356,17 @@
         if (path.size() == 0) {
             // This is a query against the root node ...
             String alias = newAlias();
-            builder.from("nt:base AS " + alias);
+            builder.fromAllNodesAs(alias);
             where.path(alias).isEqualTo("/");
             return alias;
         }
         String alias = newAlias();
         if (tableName != null) {
             // This is after some element(...) steps, so we need to join ...
-            builder.join("nt:base AS " + alias);
+            builder.joinAllNodesAs(alias);
         } else {
             // This is the only part of the query ...
-            builder.from("nt:base AS " + alias);
+            builder.fromAllNodesAs(alias);
         }
         tableName = alias;
         if (path.size() == 1 && path.get(0).collapse() instanceof NameTest) {
@@ -326,7 +381,7 @@
             }
         } else {
             // Must be just a bunch of descendant-or-self, axis and filter steps ...
-            translatePathExpressionConstraint(new PathExpression(true, path), where, alias);
+            translatePathExpressionConstraint(new PathExpression(true, path, null), where, alias);
         }
         return tableName;
     }
@@ -338,7 +393,7 @@
         NameTest typeName = elementTest.getTypeName();
         if (typeName.isWildcard()) {
             tableName = newAlias();
-            builder.from("nt:base AS " + tableName);
+            builder.fromAllNodesAs(tableName);
         } else {
             if (typeName.getLocalTest() == null) {
                 throw new InvalidQueryException(
@@ -414,7 +469,7 @@
             // This adds the criteria that the child node exists ...
             NameTest childName = (NameTest)predicate;
             String alias = newAlias();
-            builder.join("nt:base AS " + alias).onChildNode(tableName, alias);
+            builder.joinAllNodesAs(alias).onChildNode(tableName, alias);
             if (!childName.isWildcard()) where.nodeName(alias).isEqualTo(nameFrom(childName));
             tableName = alias;
         } else if (predicate instanceof Comparison) {
@@ -532,7 +587,7 @@
                 } else if (param1 instanceof NameTest) {
                     // refers to child node, so we need to add a join ...
                     String alias = newAlias();
-                    builder.join("nt:base AS " + alias).onChildNode(tableName, alias);
+                    builder.joinAllNodesAs(alias).onChildNode(tableName, alias);
                     // Now add the criteria ...
                     where.search(alias, value);
                     tableName = alias;
@@ -570,31 +625,32 @@
             // Requires that the descendant node with the relative path does exist ...
             PathExpression pathExpr = (PathExpression)predicate;
             List<StepExpression> steps = pathExpr.getSteps();
+            OrderBy orderBy = pathExpr.getOrderBy();
             assert steps.size() > 1; // 1 or 0 would have been collapsed ...
             Component firstStep = steps.get(0).collapse();
             if (firstStep instanceof ContextItem) {
                 // Remove the context and retry ...
-                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size())), tableName, where);
+                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size()), orderBy), tableName, where);
             }
             if (firstStep instanceof NameTest) {
                 // Special case where this is similar to '[a/@id]'
                 NameTest childName = (NameTest)firstStep;
                 String alias = newAlias();
-                builder.join("nt:base AS " + alias).onChildNode(tableName, alias);
+                builder.joinAllNodesAs(alias).onChildNode(tableName, alias);
                 if (!childName.isWildcard()) {
                     where.nodeName(alias).isEqualTo(nameFrom(childName));
                 }
-                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size())), alias, where);
+                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size()), orderBy), alias, where);
             }
             if (firstStep instanceof DescendantOrSelf) {
                 // Special case where this is similar to '[a/@id]'
                 String alias = newAlias();
-                builder.join("nt:base AS " + alias).onDescendant(tableName, alias);
-                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size())), alias, where);
+                builder.joinAllNodesAs(alias).onDescendant(tableName, alias);
+                return translatePredicate(new PathExpression(true, steps.subList(1, steps.size()), orderBy), alias, where);
             }
             // Add the join ...
             String alias = newAlias();
-            builder.join("nt:base AS " + alias).onDescendant(tableName, alias);
+            builder.joinAllNodesAs(alias).onDescendant(tableName, alias);
             // Now add the criteria ...
             translatePathExpressionConstraint(pathExpr, where, alias);
         } else {

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -44,7 +44,7 @@
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path.Segment;
-import org.jboss.dna.jcr.JcrQueryManager.JcrQuery;
+import org.jboss.dna.jcr.JcrQueryManager.JcrQueryResult;
 import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.dna.jcr.JcrRepository.QueryLanguage;
 import org.junit.After;
@@ -179,8 +179,8 @@
         assertThat(result, is(notNullValue()));
         if (print) {
             System.out.println();
-            System.out.println(query.getLanguage() + ": " + query.getStatement());
-            System.out.println(" --> : " + ((JcrQuery)query).getCommand());
+            System.out.println(query);
+            System.out.println(" plan -> " + ((JcrQueryResult)result).getPlan());
             System.out.println(result);
         }
         assertThat(result.getNodes().getSize(), is(numberOfResults));
@@ -267,6 +267,30 @@
     }
 
     @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByPropertyValue() throws RepositoryException {
+        Query query = session.getWorkspace()
+                             .getQueryManager()
+                             .createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        print = true;
+        assertResults(query, result, 21);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByScore() throws RepositoryException {
+        Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured) order by jcr:score()",
+                                                                           Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        assertResults(query, result, 21);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+    }
+
+    @Test
     public void shouldBeAbleToExecuteXPathQueryToFindSameNameSiblingsByIndex() throws RepositoryException {
         Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root/Other/NodeA", Query.XPATH);
         assertThat(query, is(notNullValue()));

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -147,8 +147,6 @@
     private static class LevelOneFeatureTests extends TestSuite {
         protected LevelOneFeatureTests() {
             super("JCR Level 1 API Tests");
-            // We currently don't pass the tests in those suites that are commented out
-            // See https://jira.jboss.org/jira/browse/DNA-285
 
             addTestSuite(org.apache.jackrabbit.test.api.RootNodeTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.NodeReadMethodsTest.class);

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -36,6 +36,7 @@
 import org.jboss.dna.common.text.TokenStream.Tokenizer;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.query.model.Operator;
+import org.jboss.dna.graph.query.model.Order;
 import org.jboss.dna.graph.query.model.TypeSystem;
 import org.jboss.dna.jcr.xpath.XPath.And;
 import org.jboss.dna.jcr.xpath.XPath.AnyKindTest;
@@ -55,6 +56,8 @@
 import org.jboss.dna.jcr.xpath.XPath.NameTest;
 import org.jboss.dna.jcr.xpath.XPath.NodeTest;
 import org.jboss.dna.jcr.xpath.XPath.Or;
+import org.jboss.dna.jcr.xpath.XPath.OrderBy;
+import org.jboss.dna.jcr.xpath.XPath.OrderBySpec;
 import org.jboss.dna.jcr.xpath.XPath.ParenthesizedExpression;
 import org.jboss.dna.jcr.xpath.XPath.PathExpression;
 import org.jboss.dna.jcr.xpath.XPath.SchemaAttributeTest;
@@ -137,6 +140,22 @@
                                                                                      literal("1"))));
     }
 
+    @Test
+    public void shouldParseXPathExpressionWithOrderBy() {
+        assertParsable("//element(*, my:type) order by @a1, at a2", pathExpr(orderBy(asc(nameTest("a1")), asc(nameTest("a2"))),
+                                                                          descendantOrSelf(),
+                                                                          axisStep(element(wildcard(), nameTest("my", "type")))));
+        assertParsable("//element(*, my:type) order by @p:a1, @a2",
+                       pathExpr(orderBy(asc(nameTest("p", "a1")), asc(nameTest("a2"))),
+                                descendantOrSelf(),
+                                axisStep(element(wildcard(), nameTest("my", "type")))));
+        assertParsable("/jcr:root/element(name, my:type) order by @p:a1", pathExpr(orderBy(asc(nameTest("p", "a1"))),
+                                                                                   axisStep(nameTest("jcr", "root")),
+                                                                                   axisStep(element(nameTest("name"),
+                                                                                                    nameTest("my", "type")))));
+        assertParsable("/jcr:root order by @p:a1", pathExpr(orderBy(asc(nameTest("p", "a1"))), axisStep(nameTest("jcr", "root"))));
+    }
+
     @Ignore
     @Test
     public void shouldParseXPathExpressionsThatCombineSeparateExpressions() {
@@ -851,9 +870,69 @@
     }
 
     // ----------------------------------------------------------------------------------------------------------------
+    // order-by
+    // ----------------------------------------------------------------------------------------------------------------
+
+    @Test
+    public void shouldParseOrderByOneAttributeNameClause() {
+        assertThat(parser.parseOrderBy(tokenize("order by @a1")), is(orderBy(asc(nameTest("a1")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 ascending")), is(orderBy(asc(nameTest("a1")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 descending")), is(orderBy(desc(nameTest("a1")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @pre:a1")), is(orderBy(asc(nameTest("pre", "a1")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @pre:a1 ascending")), is(orderBy(asc(nameTest("pre", "a1")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @pre:a1 descending")), is(orderBy(desc(nameTest("pre", "a1")))));
+    }
+
+    @Test
+    public void shouldParseOrderByMultipleAttributeNameClauses() {
+        assertThat(parser.parseOrderBy(tokenize("order by @a1, at a2")), is(orderBy(asc(nameTest("a1")), asc(nameTest("a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 ascending , @a2 ascending")), is(orderBy(asc(nameTest("a1")),
+                                                                                                       asc(nameTest("a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 descending, @a2 ascending")), is(orderBy(desc(nameTest("a1")),
+                                                                                                       asc(nameTest("a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 ascending , @a2 descending")), is(orderBy(asc(nameTest("a1")),
+                                                                                                        desc(nameTest("a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 descending, @a2 descending")), is(orderBy(desc(nameTest("a1")),
+                                                                                                        desc(nameTest("a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @pre:a1, @pre:a2")), is(orderBy(asc(nameTest("pre", "a1")),
+                                                                                          asc(nameTest("pre", "a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 ascending, @pre:a2 ascending")), is(orderBy(asc(nameTest("a1")),
+                                                                                                          asc(nameTest("pre",
+                                                                                                                       "a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 descending, @pre:a2 ascending")), is(orderBy(desc(nameTest("a1")),
+                                                                                                           asc(nameTest("pre",
+                                                                                                                        "a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 ascending, @pre:a2 descending")), is(orderBy(asc(nameTest("a1")),
+                                                                                                           desc(nameTest("pre",
+                                                                                                                         "a2")))));
+        assertThat(parser.parseOrderBy(tokenize("order by @a1 descending, @pre:a2 descending")),
+                   is(orderBy(desc(nameTest("a1")), desc(nameTest("pre", "a2")))));
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------
     // utility methods
     // ----------------------------------------------------------------------------------------------------------------
 
+    protected XPath.OrderBy orderBy( OrderBySpec... specs ) {
+        return new XPath.OrderBy(Arrays.asList(specs));
+    }
+
+    protected OrderBySpec asc( FunctionCall scoreFunction ) {
+        return new OrderBySpec(Order.ASCENDING, scoreFunction);
+    }
+
+    protected OrderBySpec desc( FunctionCall scoreFunction ) {
+        return new OrderBySpec(Order.DESCENDING, scoreFunction);
+    }
+
+    protected OrderBySpec asc( NameTest attributeName ) {
+        return new OrderBySpec(Order.ASCENDING, attributeName);
+    }
+
+    protected OrderBySpec desc( NameTest attributeName ) {
+        return new OrderBySpec(Order.DESCENDING, attributeName);
+    }
+
     protected TokenStream tokenize( String xpath ) {
         Tokenizer tokenizer = new XPathParser.XPathTokenizer(false); // skip comments
         return new TokenStream(xpath, tokenizer, true).start(); // case sensitive!!
@@ -878,17 +957,32 @@
     }
 
     protected PathExpression pathExpr( List<StepExpression> steps ) {
-        return new PathExpression(false, steps);
+        return new PathExpression(false, steps, null);
     }
 
+    protected PathExpression pathExpr( List<StepExpression> steps,
+                                       OrderBy orderBy ) {
+        return new PathExpression(false, steps, orderBy);
+    }
+
+    protected PathExpression pathExpr( OrderBy orderBy,
+                                       StepExpression... steps ) {
+        return pathExpr(Arrays.asList(steps), orderBy);
+    }
+
     protected PathExpression relativePathExpr( StepExpression... steps ) {
         return relativePathExpr(Arrays.asList(steps));
     }
 
     protected PathExpression relativePathExpr( List<StepExpression> steps ) {
-        return new PathExpression(true, steps);
+        return new PathExpression(true, steps, null);
     }
 
+    protected PathExpression relativePathExpr( List<StepExpression> steps,
+                                               OrderBy orderBy ) {
+        return new PathExpression(true, steps, orderBy);
+    }
+
     protected Literal literal( String value ) {
         return new Literal(value);
     }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java	2010-01-06 23:48:32 UTC (rev 1536)
@@ -65,85 +65,96 @@
 
     @Test
     public void shouldTranslateFromXPathOfAnyNode() {
-        assertThat(xpath("//element(*)"), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("/jcr:root//element(*)"), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("//*"), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("/jcr:root//*"), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("//."), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("/jcr:root//."), isSql("SELECT * FROM [nt:base] AS nodeSet1"));
+        assertThat(xpath("//element(*)"), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("/jcr:root//element(*)"), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("//*"), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("/jcr:root//*"), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("//."), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("/jcr:root//."), isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingExplicitRootPath() {
-        assertThat(xpath("/jcr:root"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/'"));
+        assertThat(xpath("/jcr:root"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/'"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingExplicitPath() {
-        assertThat(xpath("/jcr:root/a"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a'"));
-        assertThat(xpath("/jcr:root/a/b"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
-        assertThat(xpath("/jcr:root/a/b/c"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c'"));
-        assertThat(xpath("/jcr:root/a/b/c/d"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c/d'"));
+        assertThat(xpath("/jcr:root/a"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a'"));
+        assertThat(xpath("/jcr:root/a/b"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
+        assertThat(xpath("/jcr:root/a/b/c"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c'"));
+        assertThat(xpath("/jcr:root/a/b/c/d"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c/d'"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingExplicitPathWithChildNumbers() {
-        assertThat(xpath("/jcr:root/a[2]/b"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a[2]/b'"));
-        assertThat(xpath("/jcr:root/a/b[3]"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[3]'"));
-        assertThat(xpath("/jcr:root/a[2]/b[3]"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a[2]/b[3]'"));
+        assertThat(xpath("/jcr:root/a[2]/b"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a[2]/b'"));
+        assertThat(xpath("/jcr:root/a/b[3]"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[3]'"));
+        assertThat(xpath("/jcr:root/a[2]/b[3]"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a[2]/b[3]'"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingExplicitPathWithWildcardChildNumbers() {
-        assertThat(xpath("/jcr:root/a[*]/b"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
-        assertThat(xpath("/jcr:root/a/b[*]"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
-        assertThat(xpath("/jcr:root/a[*]/b[*]"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
+        assertThat(xpath("/jcr:root/a[*]/b"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
+        assertThat(xpath("/jcr:root/a/b[*]"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
+        assertThat(xpath("/jcr:root/a[*]/b[*]"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b'"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingPathWithDescendantOrSelf() {
         assertThat(xpath("/jcr:root/a/b//c"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c' OR PATH(nodeSet1) LIKE '/a/b/%/c'"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c' OR PATH(nodeSet1) LIKE '/a/b/%/c'"));
         assertThat(xpath("/jcr:root/a/b[2]//c"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[2]/c' OR PATH(nodeSet1) LIKE '/a/b[2]/%/c'"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[2]/c' OR PATH(nodeSet1) LIKE '/a/b[2]/%/c'"));
         assertThat(xpath("/jcr:root/a/b//c[4]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c[4]' OR PATH(nodeSet1) LIKE '/a/b/%/c[4]'"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c[4]' OR PATH(nodeSet1) LIKE '/a/b/%/c[4]'"));
         assertThat(xpath("/jcr:root/a/b[2]//c[4]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[2]/c[4]' OR PATH(nodeSet1) LIKE '/a/b[2]/%/c[4]'"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b[2]/c[4]' OR PATH(nodeSet1) LIKE '/a/b[2]/%/c[4]'"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingPathWithMultipleDescendantOrSelf() {
         assertThat(xpath("/jcr:root/a/b//c//d"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE (((PATH(nodeSet1) = '/a/b/c/d' OR PATH(nodeSet1) LIKE '/a/b/%/c/d') OR PATH(nodeSet1) LIKE '/a/b/c/%/d') OR PATH(nodeSet1) LIKE '/a/b/%/c/%/d')"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE (((PATH(nodeSet1) = '/a/b/c/d' OR PATH(nodeSet1) LIKE '/a/b/%/c/d') OR PATH(nodeSet1) LIKE '/a/b/c/%/d') OR PATH(nodeSet1) LIKE '/a/b/%/c/%/d')"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingPredicatesUsingRelativePaths() {
         assertThat(xpath("//element(*,my:type)[a/@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) WHERE NAME(nodeSet1) = 'a' AND nodeSet1.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) WHERE NAME(nodeSet1) = 'a' AND nodeSet1.id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[a/b/@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND nodeSet2.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND nodeSet2.id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[a/b/((@id and @name) or not(@address))]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(nodeSet2.address IS NOT NULL)))"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(nodeSet2.address IS NOT NULL)))"));
         assertThat(xpath("//element(*,my:type)[./a/b/((@id and @name) or not(@address))]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(nodeSet2.address IS NOT NULL)))"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(nodeSet2.address IS NOT NULL)))"));
         assertThat(xpath("//element(*,my:type)[a/b/((@id and @name) or not(jcr:contains(@desc,'rock star')))]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(CONTAINS(nodeSet2.desc,'rock star'))))"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE (NAME(nodeSet1) = 'a' AND NAME(nodeSet2) = 'b') AND ((nodeSet2.id IS NOT NULL and nodeSet2.name IS NOT NULL) OR (NOT(CONTAINS(nodeSet2.desc,'rock star'))))"));
         assertThat(xpath("//element(*,my:type)[*/@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) WHERE nodeSet1.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) WHERE nodeSet1.id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[*/*/@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE nodeSet2.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE nodeSet2.id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[./*/*/@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN [nt:base] as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE nodeSet2.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISCHILDNODE(nodeSet1,[my:type]) JOIN __ALLNODES__ as nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE nodeSet2.id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[.//@id]"),
-                   isSql("SELECT * FROM [my:type] JOIN [nt:base] as nodeSet1 ON ISDESCENDANTNODE(nodeSet1,[my:type]) WHERE nodeSet1.id IS NOT NULL"));
+                   isSql("SELECT * FROM [my:type] JOIN __ALLNODES__ as nodeSet1 ON ISDESCENDANTNODE(nodeSet1,[my:type]) WHERE nodeSet1.id IS NOT NULL"));
     }
 
     @Test
     public void shouldTranslateFromXPathContainingPredicatesIdentifyingPropertiesThatMustHaveValues() {
         assertThat(xpath("/jcr:root/testroot/serializationNode[@jcr:primaryType]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/testroot/serializationNode' AND nodeSet1.[jcr:primaryType] IS NOT NULL"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/testroot/serializationNode' AND nodeSet1.[jcr:primaryType] IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[@id]"), isSql("SELECT * FROM [my:type] WHERE id IS NOT NULL"));
         assertThat(xpath("//element(*,my:type)[@id][@name]"),
                    isSql("SELECT * FROM [my:type] WHERE id IS NOT NULL AND name IS NOT NULL"));
@@ -192,8 +203,8 @@
         assertThat(xpath("//element(*,my:type)/(@id union @name)"), isSql("SELECT id, name FROM [my:type]"));
         assertThat(xpath("//element(*,my:type)/(@id union @name union @x:address)"),
                    isSql("SELECT id, name, [x:address] FROM [my:type]"));
-        assertThat(xpath("//(@id|@name)"), isSql("SELECT nodeSet1.id, nodeSet1.name FROM [nt:base] AS nodeSet1"));
-        assertThat(xpath("//./(@id|@name)"), isSql("SELECT nodeSet1.id, nodeSet1.name FROM [nt:base] AS nodeSet1"));
+        assertThat(xpath("//(@id|@name)"), isSql("SELECT nodeSet1.id, nodeSet1.name FROM __ALLNODES__ AS nodeSet1"));
+        assertThat(xpath("//./(@id|@name)"), isSql("SELECT nodeSet1.id, nodeSet1.name FROM __ALLNODES__ AS nodeSet1"));
     }
 
     @Test
@@ -208,53 +219,67 @@
 
     @Test
     public void shouldTranslateFromXPathOfAnyNodeWithName() {
-        assertThat(xpath("//element(nodeName,*)"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
+        assertThat(xpath("//element(nodeName,*)"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
 
-        assertThat(xpath("//element(nodeName,*)"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
+        assertThat(xpath("//element(nodeName,*)"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
 
-        assertThat(xpath("//nodeName"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
+        assertThat(xpath("//nodeName"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
 
         assertThat(xpath("/jcr:root//element(nodeName,*)"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
 
-        assertThat(xpath("/jcr:root//nodeName"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
+        assertThat(xpath("/jcr:root//nodeName"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName'"));
     }
 
     @Test
     public void shouldTranslateFromXPathOfNodeWithNameUnderRoot() {
         assertThat(xpath("/jcr:root/element(nodeName,*)"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName' AND DEPTH(nodeSet1) = CAST(1 AS LONG)"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE NAME(nodeSet1) = 'nodeName' AND DEPTH(nodeSet1) = CAST(1 AS LONG)"));
 
-        assertThat(xpath("/jcr:root/nodeName"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/nodeName'"));
+        assertThat(xpath("/jcr:root/nodeName"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/nodeName'"));
 
-        assertThat(xpath("nodeName"), isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE PATH(nodeSet1) = '/nodeName'"));
+        assertThat(xpath("nodeName"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/nodeName'"));
     }
 
     @Test
     public void shouldTranslateFromXPathOfAnyNodeUsingPredicate() {
         assertThat(xpath("//.[jcr:contains(.,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE CONTAINS(nodeSet1.*,'bar')"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE CONTAINS(nodeSet1.*,'bar')"));
         assertThat(xpath("//.[jcr:contains(a,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE CONTAINS(nodeSet2.*,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE CONTAINS(nodeSet2.*,'bar')"));
         assertThat(xpath("//*[jcr:contains(.,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 WHERE CONTAINS(nodeSet1.*,'bar')"));
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE CONTAINS(nodeSet1.*,'bar')"));
         assertThat(xpath("//*[jcr:contains(a,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE CONTAINS(nodeSet2.*,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE CONTAINS(nodeSet2.*,'bar')"));
         assertThat(xpath("//*[jcr:contains(a/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
         assertThat(xpath("//*[jcr:contains(a/*/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN [nt:base] AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN __ALLNODES__ AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
         assertThat(xpath("/jcr:root//element(*)[jcr:contains(a/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
         assertThat(xpath("/jcr:root//element(*)[jcr:contains(a/*/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN [nt:base] AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN __ALLNODES__ AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
         assertThat(xpath("/jcr:root//*[jcr:contains(a/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet2.b,'bar')"));
         assertThat(xpath("/jcr:root//*[jcr:contains(a/*/@b,'bar')]"),
-                   isSql("SELECT * FROM [nt:base] AS nodeSet1 JOIN [nt:base] AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN [nt:base] AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
+                   isSql("SELECT * FROM __ALLNODES__ AS nodeSet1 JOIN __ALLNODES__ AS nodeSet2 ON ISCHILDNODE(nodeSet2,nodeSet1) JOIN __ALLNODES__ AS nodeSet3 ON ISCHILDNODE(nodeSet3,nodeSet2) WHERE NAME(nodeSet2) = 'a' AND CONTAINS(nodeSet3.b,'bar')"));
     }
 
     @Test
+    public void shouldTranslateFromXPathUsingOrderBy() {
+        assertThat(xpath("//element(*,*) order by @title"),
+                   isSql("SELECT nodeSet1.title FROM __ALLNODES__ AS nodeSet1 ORDER BY nodeSet1.title"));
+        assertThat(xpath("/jcr:root/testroot/*[@prop1] order by @prop1 ascending"),
+                   isSql("SELECT nodeSet1.prop1 FROM __ALLNODES__ as nodeSet1 WHERE PATH(nodeSet1) = '/testroot' AND nodeSet1.prop1 IS NOT NULL ORDER BY nodeSet1.prop1"));
+    }
+
+    @Test
     public void shouldParseXPathExpressions() {
         xpath("/jcr:root/a/b/c");
         xpath("/jcr:root/a/b/c[*]");

Modified: trunk/dna-jcr/src/test/resources/tck/repositoryForTckTests.xml
===================================================================
--- trunk/dna-jcr/src/test/resources/tck/repositoryForTckTests.xml	2010-01-06 22:13:11 UTC (rev 1535)
+++ trunk/dna-jcr/src/test/resources/tck/repositoryForTckTests.xml	2010-01-06 23:48:32 UTC (rev 1536)
@@ -55,7 +55,14 @@
     <nt:unstructured jcr:name="node1" prop1="&lt;foo&amp;foo&gt;">
        <nt:unstructured jcr:name="jcr:xmltext" jcr:xmlcharacters="This is the text for node1[2]!" />
     </nt:unstructured>
-    <nt:unstructured jcr:name="node1" prop1="&lt;foo&amp;foo&gt;">
+    <nt:unstructured jcr:name="node1" prop1="prop1 value for node1[3]">
        <nt:unstructured jcr:name="jcr:xmltext" jcr:xmlcharacters="This is the text for node1[3]!" />
     </nt:unstructured>
+    <!-- 
+        XPathOrderByTest requires multiple nodes of type 'nt:unstructured' with distinct 'prop1' values
+    -->
+    <nt:unstructured jcr:name="nodeForOrderBy" prop1="propValue3"/>
+    <nt:unstructured jcr:name="anotherNodeForOrderBy" prop1="propValue1">
+       <nt:unstructured jcr:name="aNestedNodeForOrderBy" prop1="propValue2"/>
+    </nt:unstructured>
 </testroot>
\ No newline at end of file


From dna-commits at lists.jboss.org  Wed Jan  6 18:49:23 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 18:49:23 -0500
Subject: [dna-commits] DNA SVN: r1537 - in trunk:
	dna-graph/src/test/java/org/jboss/dna/graph/connector/path
	and 3 other directories.
Message-ID: <201001062349.o06NnNq0007685@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-06 18:49:23 -0500 (Wed, 06 Jan 2010)
New Revision: 1537

Modified:
   trunk/.gitignore
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java
Log:
Minor modifications to correct or suppress 'unchecked' warnings. Also updated .gitignore file with new 'dna-sequencer-classfile' project.

Modified: trunk/.gitignore
===================================================================
--- trunk/.gitignore	2010-01-06 23:48:32 UTC (rev 1536)
+++ trunk/.gitignore	2010-01-06 23:49:23 UTC (rev 1537)
@@ -56,6 +56,7 @@
 /extensions/dna-connector-svn/target
 /extensions/dna-mimetype-detector-aperture/.settings
 /extensions/dna-mimetype-detector-aperture/target
+/extensions/dna-sequencer-classfile/target
 /extensions/dna-sequencer-cnd/target
 /extensions/dna-sequencer-ddl/target
 /extensions/dna-sequencer-esbMessage/target

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	2010-01-06 23:48:32 UTC (rev 1536)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	2010-01-06 23:49:23 UTC (rev 1537)
@@ -23,12 +23,10 @@
  */
 package org.jboss.dna.graph.connector.path;
 
-
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
-import javax.naming.NamingException;
 import javax.naming.Reference;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositorySourceCapabilities;
@@ -65,7 +63,7 @@
                 return null;
             }
 
-            public Reference getReference() throws NamingException {
+            public Reference getReference() {
                 return null;
             }
         };

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 23:48:32 UTC (rev 1536)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepository.java	2010-01-06 23:49:23 UTC (rev 1537)
@@ -59,7 +59,7 @@
 
 public class SvnRepository extends WritablePathRepository {
 
-    protected static final String DEFAULT_MIME_TYPE = "application/octet-stream";
+    private static final String DEFAULT_MIME_TYPE = "application/octet-stream";
     protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
 
     protected final SvnRepositorySource source;

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 23:48:32 UTC (rev 1536)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SvnRepositorySourceTest.java	2010-01-06 23:49:23 UTC (rev 1537)
@@ -154,12 +154,11 @@
         assertThat(source.getName(), is(isNull()));
     }
 
-
     @Test
     public void shouldHaveDefaultRetryLimit() {
         assertThat(source.getRetryLimit(), is(SvnRepositorySource.DEFAULT_RETRY_LIMIT));
     }
-    
+
     @Test( expected = IllegalArgumentException.class )
     public void shouldNotAllowNullSVNUrl() {
         source.setRepositoryRootUrl(null);
@@ -187,31 +186,30 @@
             assertThat(source.getRetryLimit(), is(i));
         }
     }
-    
+
     @Test( expected = RepositorySourceException.class )
     public void shouldFailToCreateConnectionIfSourceHasNoName() {
         source.setName(null);
         source.getConnection();
     }
-    
+
     @Test( expected = RepositorySourceException.class )
     public void shouldFailToCreateConnectionIfSourceHasNoUsername() {
         source.setUsername(null);
         source.getConnection();
     }
-    
+
     @Test( expected = RepositorySourceException.class )
     public void shouldFailToCreateConnectionIfSourceHasNoPassword() {
         source.setPassword(null);
         source.getConnection();
     }
-    
+
     @Test
     public void shouldCreateConnection() throws Exception {
         connection = source.getConnection();
         assertThat(connection, is(notNullValue()));
     }
-    
 
     @Test
     public void shouldCreateJndiReferenceAndRecreatedObjectFromReference() throws Exception {

Modified: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java	2010-01-06 23:48:32 UTC (rev 1536)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/metadata/ClassFileMetadataReaderTest.java	2010-01-06 23:49:23 UTC (rev 1537)
@@ -92,11 +92,11 @@
         ClassMetadata cmd = ClassFileMetadataReader.instance(input);
 
         assertThat(cmd, instanceOf(EnumMetadata.class));
-        EnumMetadata emd = (EnumMetadata) cmd;
-        
+        EnumMetadata emd = (EnumMetadata)cmd;
+
         List<String> enumValues = Arrays.asList(new String[] {"VALUE_A", "VALUE_B", "VALUE_C"});
         assertThat(emd.getValues(), is(enumValues));
-        
+
         for (FieldMetadata fmd : emd.getFields()) {
             assertThat(fmd.getName(), not(anyOf(is("VALUE_A"), is("VALUE_B"), is("VALUE_C"))));
         }
@@ -141,7 +141,7 @@
         checkConstructors(cmd, clazz);
     }
 
-    @SuppressWarnings( "unchecked" )
+    @SuppressWarnings( {"unchecked", "synthetic-access"} )
     private void checkFields( ClassMetadata cmd,
                               Class<?> clazz ) throws Exception {
         Map<FieldKey, Field> clazzFields = new HashMap<FieldKey, Field>();
@@ -181,6 +181,7 @@
         }
     }
 
+    @SuppressWarnings( "synthetic-access" )
     private void checkMethods( ClassMetadata cmd,
                                Class<?> clazz ) throws Exception {
         Map<MethodKey, Method> clazzMethods = new HashMap<MethodKey, Method>();
@@ -218,7 +219,6 @@
 
             assertThat(metaMethod.getAnnotations().size(), is(clazzMethod.getDeclaredAnnotations().length));
 
-
             // Can't really check this since some annotations are not runtime annotations
             // for (AnnotationMetadata amd : metaMethod.getAnnotations()) {
             // Class<Annotation> annotationClass = (Class<Annotation>)Class.forName(amd.getAnnotationClassName());
@@ -229,7 +229,7 @@
         }
     }
 
-    @SuppressWarnings( "unchecked" )
+    @SuppressWarnings( {"unchecked", "synthetic-access"} )
     private void checkConstructors( ClassMetadata cmd,
                                     Class<?> clazz ) throws Exception {
         Map<MethodKey, Constructor> clazzCtors = new HashMap<MethodKey, Constructor>();


From dna-commits at lists.jboss.org  Wed Jan  6 18:49:59 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 18:49:59 -0500
Subject: [dna-commits] DNA SVN: r1538 - in trunk:
	dna-graph/src/test/java/org/jboss/dna/graph/connector/test
	and 2 other directories.
Message-ID: <201001062349.o06Nnxkf007697@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-06 18:49:59 -0500 (Wed, 06 Jan 2010)
New Revision: 1538

Modified:
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/ReadableConnectorTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorNoCreateWorkspaceTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorReadingTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/TestEnvironment.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicCreateWorkspacesTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicNoCreateWorkspaceTest.java
   trunk/pom.xml
Log:
Changes to the JPA connector test cases and the database test environment to use in-memory HSQLDB databases and to lessen the chance of mixing the Basic and Simple models during the tests.

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/ReadableConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/ReadableConnectorTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/ReadableConnectorTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -45,6 +45,7 @@
 import org.jboss.dna.graph.request.ReadNextBlockOfChildrenRequest;
 import org.jboss.dna.graph.request.ReadNodeRequest;
 import org.jboss.dna.graph.request.ReadPropertyRequest;
+import org.junit.After;
 import org.junit.Test;
 
 /**
@@ -58,18 +59,17 @@
  */
 public abstract class ReadableConnectorTest extends AbstractConnectorTest {
 
-    // /**
-    // * Method that is executed after each test. This method does nothing, since the repository is set up once for all of the
-    // tests
-    // * and then shutdown after all tests have completed.
-    // *
-    // * @throws Exception
-    // */
-    // @Override
-    // @After
-    // public void afterEach() throws Exception {
-    // // Don't shut down the repository
-    // }
+    /**
+     * Method that is executed after each test. This method does nothing, since the repository is set up once for all of the tests
+     * and then shutdown after all tests have completed.
+     * 
+     * @throws Exception
+     */
+    @Override
+    @After
+    public void afterEach() throws Exception {
+        // Don't shut down the repository
+    }
 
     @Test
     public void shouldAlwaysBeAbleToReadRootNode() {

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorNoCreateWorkspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorNoCreateWorkspaceTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorNoCreateWorkspaceTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -49,7 +49,7 @@
      */
     @Override
     protected RepositorySource setUpSource() {
-        predefinedWorkspaces = new String[] {"workspace1", "workspace2", "workspace3"};
+        predefinedWorkspaces = new String[] {"default", "workspace1", "workspace2", "workspace3"};
 
         // Set the connection properties using the environment defined in the POM files ...
         JpaSource source = TestEnvironment.configureJpaSource("Test Repository", this);

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorReadingTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorReadingTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorReadingTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -24,7 +24,6 @@
 package org.jboss.dna.connector.store.jpa;
 
 import org.jboss.dna.common.statistic.Stopwatch;
-import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.ReadableConnectorTest;
@@ -44,17 +43,6 @@
         // Set the connection properties using the environment defined in the POM files ...
         JpaSource source = TestEnvironment.configureJpaSource("Test Repository", this);
 
-        // Create a graph and look up the root node. We do this to initialize the connection pool and
-        // force the database to be setup at this point. By doing it now, we don't include this overhead
-        // in our test timings.
-        try {
-            Graph graph = Graph.create(source, context);
-            graph.getNodeAt("/");
-        } catch (Throwable t) {
-            Logger.getLogger(getClass()).debug("Unable to read the root node while setting up the \"" + source.getName()
-                                               + "\" JPA source");
-        }
-
         return source;
     }
 
@@ -71,7 +59,11 @@
         int numPropertiesPerNode = 7;
         Stopwatch sw = new Stopwatch();
         boolean batch = true;
-        graph.createWorkspace().named("default");
+        if (!graph.getWorkspaces().contains("default")) {
+            graph.createWorkspace().named("default");
+        } else {
+            graph.useWorkspace("default");
+        }
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
         graph.createWorkspace().named("other workspace");
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -23,8 +23,10 @@
  */
 package org.jboss.dna.connector.store.jpa;
 
+import java.util.UUID;
 import org.jboss.dna.common.statistic.Stopwatch;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.WritableConnectorTest;
 import org.jboss.dna.graph.property.ReferentialIntegrityException;
@@ -35,6 +37,8 @@
  */
 public class JpaConnectorWritingTest extends WritableConnectorTest {
 
+    private boolean isReferentialIntegrityEnforced = false;
+
     /**
      * {@inheritDoc}
      * 
@@ -46,7 +50,7 @@
         JpaSource source = TestEnvironment.configureJpaSource("Test Repository", this);
 
         // Override the inherited properties ...
-        source.setReferentialIntegrityEnforced(true);
+        source.setReferentialIntegrityEnforced(isReferentialIntegrityEnforced);
         source.setCompressData(true);
 
         return source;
@@ -59,12 +63,20 @@
      */
     @Override
     protected void initializeContent( Graph graph ) {
-        graph.createWorkspace().named("default");
+        if (!graph.getWorkspaces().contains("default")) {
+            graph.createWorkspace().named("default");
+        } else {
+            graph.useWorkspace("default");
+        }
     }
 
     @Test( expected = ReferentialIntegrityException.class )
     public void shouldNotCopyChildrenBetweenWorkspacesAndRemoveExistingNodesWithSameUuidIfSpecifiedIfReferentialIntegrityIsViolated()
         throws Exception {
+        if (!isReferentialIntegrityEnforced) {
+            throw new ReferentialIntegrityException(Location.create(UUID.randomUUID()));
+        }
+
         String defaultWorkspaceName = graph.getCurrentWorkspaceName();
         String workspaceName = "copyChildrenSource";
 

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/TestEnvironment.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/TestEnvironment.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/TestEnvironment.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -32,7 +32,7 @@
                                                 Object testCase ) {
         Properties properties = new Properties();
         ClassLoader loader = testCase instanceof Class<?> ? ((Class<?>)testCase).getClassLoader() : testCase.getClass()
-                                                                                                         .getClassLoader();
+                                                                                                            .getClassLoader();
         try {
             properties.load(loader.getResourceAsStream("database.properties"));
         } catch (IOException e) {
@@ -42,7 +42,6 @@
         // Set the connection properties to be an in-memory HSQL database ...
         JpaSource source = new JpaSource();
         source.setName(sourceName);
-        source.setModel(JpaSource.Models.BASIC.getName());
         source.setDialect(properties.getProperty("jpaSource.dialect"));
         source.setDriverClassName(properties.getProperty("jpaSource.driverClassName"));
         source.setUsername(properties.getProperty("jpaSource.username"));

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicCreateWorkspacesTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicCreateWorkspacesTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicCreateWorkspacesTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -36,6 +36,7 @@
 
         // Set the connection properties using the environment defined in the POM files ...
         JpaSource source = TestEnvironment.configureJpaSource("Test Repository", this);
+        source.setModel(JpaSource.Models.BASIC.getName());
 
         // Override the inherited properties, since that's the focus of these tests ...
         source.setCreatingWorkspacesAllowed(true);

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicNoCreateWorkspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicNoCreateWorkspaceTest.java	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicNoCreateWorkspaceTest.java	2010-01-06 23:49:59 UTC (rev 1538)
@@ -36,6 +36,7 @@
 
         // Set the connection properties using the environment defined in the POM files ...
         JpaSource source = TestEnvironment.configureJpaSource("Test Repository", this);
+        source.setModel(JpaSource.Models.BASIC.getName());
 
         // Override the inherited properties, since that's the focus of these tests ...
         source.setCreatingWorkspacesAllowed(true);

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-06 23:49:23 UTC (rev 1537)
+++ trunk/pom.xml	2010-01-06 23:49:59 UTC (rev 1538)
@@ -382,7 +382,7 @@
 		        <database>hsqldb</database>
             <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
             <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:hsqldb:target/test/db/hsqldb/dna</jpaSource.url>
+            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
             <jpaSource.username>sa</jpaSource.username>
             <jpaSource.password />
           </properties>
@@ -409,7 +409,7 @@
 		        <database>hsqldb</database>
             <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
             <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:hsqldb:target/test/db/hsqldb/dna</jpaSource.url>
+            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
             <jpaSource.username>sa</jpaSource.username>
             <jpaSource.password />
           </properties>


From dna-commits at lists.jboss.org  Wed Jan  6 18:50:23 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 18:50:23 -0500
Subject: [dna-commits] DNA SVN: r1539 - in
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector:
	path/cache and 1 other directory.
Message-ID: <201001062350.o06NoNKT008086@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-06 18:50:22 -0500 (Wed, 06 Jan 2010)
New Revision: 1539

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
Log:
Corrected several compiler warnings for potential null pointers. These warnings were correct.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-06 23:49:59 UTC (rev 1538)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-06 23:50:22 UTC (rev 1539)
@@ -838,9 +838,11 @@
     @Override
     public void process( CreateNodeRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        Request projectedRequest = projected == null ? null : projected.getRequest();
-        // Check the error first ...
+        Request projectedRequest = projected.getRequest();
+        // Check the error on the projected request ...
         if (checkErrorOrCancel(request, projectedRequest)) return;
 
         // No error, so project the results back to the federated repository ...
@@ -866,8 +868,10 @@
     @Override
     public void process( UpdatePropertiesRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        UpdatePropertiesRequest source = projected == null ? null : (UpdatePropertiesRequest)projected.getRequest();
+        UpdatePropertiesRequest source = (UpdatePropertiesRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location sourceLocation = source.getActualLocationOfNode();
         request.setActualLocationOfNode(projectToFederated(request.on(), projected.getProjection(), sourceLocation, request));
@@ -882,8 +886,10 @@
     @Override
     public void process( SetPropertyRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        SetPropertyRequest source = projected == null ? null : (SetPropertyRequest)projected.getRequest();
+        SetPropertyRequest source = (SetPropertyRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         // Set the actual location and created flags ...
         Location sourceLocation = source.getActualLocationOfNode();
@@ -899,8 +905,10 @@
     @Override
     public void process( RemovePropertyRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        SetPropertyRequest source = projected == null ? null : (SetPropertyRequest)projected.getRequest();
+        SetPropertyRequest source = (SetPropertyRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location sourceLocation = source.getActualLocationOfNode();
         request.setActualLocationOfNode(projectToFederated(request.from(), projected.getProjection(), sourceLocation, request));
@@ -914,9 +922,11 @@
     @Override
     public void process( DeleteBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
         // Do an initial check to make sure that there was no error on the source that prevented projection
-        Request projectedSource = projected == null ? null : projected.getRequest();
+        Request projectedSource = projected.getRequest();
         if (checkErrorOrCancel(request, projectedSource)) return;
 
         // Go through the projected requests, and look for the top-most node ...
@@ -954,9 +964,11 @@
     @Override
     public void process( DeleteChildrenRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
         // Do an initial check to make sure that there was no error on the source that prevented projection
-        Request projectedSource = projected == null ? null : projected.getRequest();
+        Request projectedSource = projected.getRequest();
         if (checkErrorOrCancel(request, projectedSource)) return;
 
         // Go through the projected requests, and look for the top-most node ...
@@ -986,8 +998,10 @@
     @Override
     public void process( RenameNodeRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        RenameNodeRequest source = projected == null ? null : (RenameNodeRequest)projected.getRequest();
+        RenameNodeRequest source = (RenameNodeRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1004,8 +1018,10 @@
     @Override
     public void process( CopyBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        CopyBranchRequest source = projected == null ? null : (CopyBranchRequest)projected.getRequest();
+        CopyBranchRequest source = (CopyBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1022,8 +1038,10 @@
     @Override
     public void process( CloneBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        CloneBranchRequest source = projected == null ? null : (CloneBranchRequest)projected.getRequest();
+        CloneBranchRequest source = (CloneBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1047,8 +1065,10 @@
     @Override
     public void process( MoveBranchRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        // Check the projection first ...
+        if (checkErrorOrCancel(request, federatedRequest)) return;
 
-        MoveBranchRequest source = projected == null ? null : (MoveBranchRequest)projected.getRequest();
+        MoveBranchRequest source = (MoveBranchRequest)projected.getRequest();
         if (checkErrorOrCancel(request, source)) return;
         Location locationBefore = source.getActualLocationBefore();
         Location locationAfter = source.getActualLocationBefore();
@@ -1160,6 +1180,22 @@
     }
 
     protected boolean checkErrorOrCancel( Request request,
+                                          FederatedRequest federatedRequest ) {
+        if (federatedRequest.getFirstProjectedRequest() == null) {
+            Request original = federatedRequest.original();
+            if (original.hasError()) {
+                // No source requests had results ...
+                request.setError(original.getError());
+                return true;
+            }
+            assert original.isCancelled();
+            request.cancel();
+            return true;
+        }
+        return false;
+    }
+
+    protected boolean checkErrorOrCancel( Request request,
                                           Request sourceRequest ) {
         if (sourceRequest.hasError()) {
             request.setError(sourceRequest.getError());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	2010-01-06 23:49:59 UTC (rev 1538)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	2010-01-06 23:50:22 UTC (rev 1539)
@@ -62,18 +62,18 @@
 
         CacheEntry entry = nodesByPath.get(path);
         if (entry == null) {
-            statistics.misses.getAndIncrement();
+            statistics.incrementMisses();
             return null;
         }
 
         PathNode node = entry.getNode();
         if (node != null) {
-            statistics.hits.getAndIncrement();
+            statistics.incrementHits();
             return node;
         }
 
         nodesByPath.remove(path, entry);
-        statistics.expirations.getAndIncrement();
+        statistics.incrementExpirations();
         return null;
     }
 
@@ -81,8 +81,8 @@
         assert node != null;
 
         if (!policy.shouldCache(node)) return;
-        
-        statistics.writes.getAndIncrement();
+
+        statistics.incrementWrites();
         nodesByPath.put(node.getPath(), new CacheEntry(node));
     }
 
@@ -104,13 +104,17 @@
         this.statistics = null;
     }
 
+    protected PathCachePolicy policy() {
+        return this.policy;
+    }
+
     class CacheEntry {
         private final SoftReference<PathNode> ref;
         private final long expiryTime;
 
         CacheEntry( PathNode node ) {
             ref = new SoftReference<PathNode>(node);
-            expiryTime = System.currentTimeMillis() + (policy.getTimeToLive() * 1000);
+            expiryTime = System.currentTimeMillis() + (policy().getTimeToLive() * 1000);
         }
 
         PathNode getNode() {
@@ -143,5 +147,21 @@
         public long getExpirations() {
             return expirations.get();
         }
+
+        public long incrementWrites() {
+            return writes.getAndIncrement();
+        }
+
+        public long incrementHits() {
+            return hits.getAndIncrement();
+        }
+
+        public long incrementMisses() {
+            return misses.getAndIncrement();
+        }
+
+        public long incrementExpirations() {
+            return expirations.getAndIncrement();
+        }
     }
 }


From dna-commits at lists.jboss.org  Wed Jan  6 19:14:25 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 19:14:25 -0500
Subject: [dna-commits] DNA SVN: r1540 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/search.
Message-ID: <201001070014.o070EPS9016715@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-06 19:14:25 -0500 (Wed, 06 Jan 2010)
New Revision: 1540

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/search/SearchEngineIndexer.java
Log:
DNA-617 Fix for the NPE in the search indexer (in the case when there isn't even a root in the source).

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/search/SearchEngineIndexer.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/search/SearchEngineIndexer.java	2010-01-06 23:50:22 UTC (rev 1539)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/search/SearchEngineIndexer.java	2010-01-07 00:14:25 UTC (rev 1540)
@@ -288,6 +288,7 @@
         Location topNode = locationIter.next();
         assert topNode.equals(startingLocation);
         Map<Name, Property> properties = readSubgraph.getPropertiesFor(topNode);
+        if (properties == null) return;
         if (startingLocation.getPath().isRoot()) {
             // The properties of the root node generally don't include the primary type, but we need to add it here ...
             Property rootPrimaryType = context.getPropertyFactory().create(JcrLexicon.PRIMARY_TYPE, DnaLexicon.ROOT);


From dna-commits at lists.jboss.org  Wed Jan  6 20:13:23 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 20:13:23 -0500
Subject: [dna-commits] DNA SVN: r1541 -
	trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn.
Message-ID: <201001070113.o071DNSn029711@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 20:13:22 -0500 (Wed, 06 Jan 2010)
New Revision: 1541

Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
Log:
DNA-618 SVN connector integration tests are failing with '404 Not Found'

Applied patch that shrinks the size of the repo, making it run dramatically more quickly from sites outside of the jboss.org network. Prior to the search code, there was no particular penalty for having a huge repo as long as you didn't try to read every node. But the search code has to read the whole repo to build the search index. In this case, that required reading several thousand files, each requiring two network calls (one for the file and one for its contents). 

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-07 00:14:25 UTC (rev 1540)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/svn/SvnAndJcrIntegrationTest.java	2010-01-07 01:13:22 UTC (rev 1541)
@@ -51,7 +51,7 @@
     @Before
     public void beforeEach() throws Exception {
         final String repositoryUrl = "http://anonsvn.jboss.org/repos/dna/";
-        final String[] predefinedWorkspaceNames = {"trunk", "tags", "branches"};
+        final String[] predefinedWorkspaceNames = {"trunk/dna-common/src/main/java/org/jboss/dna/common/xml",};
         final String svnRepositorySource = "svnRepositorySource";
         final String repositoryName = "svnRepository";
         final JcrConfiguration configuration = new JcrConfiguration();
@@ -61,11 +61,10 @@
                      .setProperty("username", "anonymous")
                      .setProperty("repositoryRootUrl", repositoryUrl)
                      .setProperty("predefinedWorkspaceNames", predefinedWorkspaceNames)
-.setProperty("defaultWorkspaceName",
-                                                                                                                                                                                                                                    predefinedWorkspaceNames[0])
+                     .setProperty("defaultWorkspaceName", predefinedWorkspaceNames[0])
                      .setProperty("creatingWorkspacesAllowed", false);
 
-        configuration.repository(repositoryName).setSource(svnRepositorySource).setOption(Option.QUERY_EXECUTION_ENABLED, "false");
+        configuration.repository(repositoryName).setSource(svnRepositorySource).setOption(Option.QUERY_EXECUTION_ENABLED, "true");
 
         configuration.save();
         this.engine = configuration.build();
@@ -94,13 +93,13 @@
         while (nodeIterator.hasNext()) {
             System.out.println(nodeIterator.nextNode());
         }
-        assertThat(this.session.getRootNode().getNode("dna-graph"), is(notNullValue()));
+        assertThat(this.session.getRootNode().getNode("XmlCharacters.java"), is(notNullValue()));
     }
 
     @Test
     public void shouldProvideAccessToJcrDataNodeUnderFileNode() throws Exception {
-        System.out.println("Getting /pom.xml/jcr:content and then walking its properties ...");
-        Node resourceNodeOfPomFile = this.session.getRootNode().getNode("pom.xml/jcr:content");
+        System.out.println("Getting /package-info.java/jcr:content and then walking its properties ...");
+        Node resourceNodeOfPomFile = this.session.getRootNode().getNode("package-info.java/jcr:content");
         assertThat(resourceNodeOfPomFile, is(notNullValue()));
 
         for (PropertyIterator iter = resourceNodeOfPomFile.getProperties(); iter.hasNext();) {
@@ -109,19 +108,6 @@
         }
     }
 
-    @Test
-    public void shouldProvideAccessToJcrDataNodeUnderDeepFileNode() throws Exception {
-        String path = "extensions/dna-sequencer-text/src/test/resources/delimited/multiLineCommaDelimitedFile.csv/jcr:content";
-        System.out.println("Getting " + path + " and then walking its properties ...");
-        Node resourceNodeOfPomFile = this.session.getRootNode().getNode(path);
-        assertThat(resourceNodeOfPomFile, is(notNullValue()));
-
-        for (PropertyIterator iter = resourceNodeOfPomFile.getProperties(); iter.hasNext();) {
-            Property property = iter.nextProperty();
-            assertThat(property.getName(), is(notNullValue()));
-        }
-    }
-
     protected class MyCustomSecurityContext implements SecurityContext {
         /**
          * {@inheritDoc}


From dna-commits at lists.jboss.org  Wed Jan  6 20:16:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 20:16:34 -0500
Subject: [dna-commits] DNA SVN: r1542 - in trunk/extensions:
	dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache
	and 1 other directory.
Message-ID: <201001070116.o071GYYj030180@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 20:16:33 -0500 (Wed, 06 Jan 2010)
New Revision: 1542

Modified:
   trunk/extensions/dna-connector-infinispan/src/main/java/org/jboss/dna/connector/infinispan/InfinispanSource.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
Log:
Fixed eclipse warnings

Modified: trunk/extensions/dna-connector-infinispan/src/main/java/org/jboss/dna/connector/infinispan/InfinispanSource.java
===================================================================
--- trunk/extensions/dna-connector-infinispan/src/main/java/org/jboss/dna/connector/infinispan/InfinispanSource.java	2010-01-07 01:13:22 UTC (rev 1541)
+++ trunk/extensions/dna-connector-infinispan/src/main/java/org/jboss/dna/connector/infinispan/InfinispanSource.java	2010-01-07 01:16:33 UTC (rev 1542)
@@ -48,6 +48,7 @@
 import org.infinispan.manager.CacheManager;
 import org.infinispan.manager.DefaultCacheManager;
 import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.common.util.StringUtil;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositoryConnection;
@@ -481,6 +482,11 @@
         return false;
     }
 
+    @Override
+    public int hashCode() {
+        return HashCode.compute(getName());
+    }
+
     /**
      * {@inheritDoc}
      */

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java	2010-01-07 01:13:22 UTC (rev 1541)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java	2010-01-07 01:16:33 UTC (rev 1542)
@@ -52,6 +52,7 @@
 import org.jboss.cache.DefaultCacheFactory;
 import org.jboss.cache.config.ConfigurationException;
 import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.common.util.StringUtil;
 import org.jboss.dna.graph.DnaLexicon;
@@ -586,6 +587,11 @@
         return false;
     }
 
+    @Override
+    public int hashCode() {
+        return HashCode.compute(getName());
+    }
+
     /**
      * {@inheritDoc}
      */


From dna-commits at lists.jboss.org  Wed Jan  6 20:21:20 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 20:21:20 -0500
Subject: [dna-commits] DNA SVN: r1543 -
	trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile.
Message-ID: <201001070121.o071LKi7030668@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 20:21:20 -0500 (Wed, 06 Jan 2010)
New Revision: 1543

Modified:
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
Log:
Fixed eclipse warnings

Modified: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	2010-01-07 01:16:33 UTC (rev 1542)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	2010-01-07 01:21:20 UTC (rev 1543)
@@ -121,6 +121,7 @@
             called = true;
         }
 
+        @SuppressWarnings( "unused" )
         public void recordEnum( StreamSequencerContext context,
                                 SequencerOutput output,
                                 EnumMetadata enumMetadata ) {


From dna-commits at lists.jboss.org  Wed Jan  6 21:08:02 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 21:08:02 -0500
Subject: [dna-commits] DNA SVN: r1544 -
	trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta.
Message-ID: <201001070208.o07282AT009898@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 21:08:01 -0500 (Wed, 06 Jan 2010)
New Revision: 1544

Modified:
   trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
Log:
DNA-625 JdbcMetadataRepositoryTckTest Failing When Run From Command-Line

Applied patch that shrinks the size of the repository for the test back down. 

Modified: trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-07 01:21:20 UTC (rev 1543)
+++ trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-07 02:08:01 UTC (rev 1544)
@@ -5,7 +5,7 @@
 javax.jcr.tck.dnaNodeTypePath=/org/jboss/dna/connector/meta/jdbc/connector-metajdbc.cnd
 
 # The fan-out from the tables node is HUGE in HSQLDB.  This allows the tests to complete reasonably quickly.
-javax.jcr.tck.testroot=/default/INFORMATION_SCHEMA
+javax.jcr.tck.testroot=/default/INFORMATION_SCHEMA/tables/SYSTEM_USERS
 
 # There's only one workspace per repository for this connector right now
 javax.jcr.tck.workspacename=default


From dna-commits at lists.jboss.org  Wed Jan  6 21:59:55 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 21:59:55 -0500
Subject: [dna-commits] DNA SVN: r1545 -
	trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile.
Message-ID: <201001070259.o072xtVn015456@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 21:59:55 -0500 (Wed, 06 Jan 2010)
New Revision: 1545

Modified:
   trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
Log:
Fixed eclipse warning in a different way

Modified: trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	2010-01-07 02:08:01 UTC (rev 1544)
+++ trunk/extensions/dna-sequencer-classfile/src/test/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerTest.java	2010-01-07 02:59:55 UTC (rev 1545)
@@ -121,7 +121,11 @@
             called = true;
         }
 
-        @SuppressWarnings( "unused" )
+        /**
+         * @param context
+         * @param output
+         * @param enumMetadata
+         */
         public void recordEnum( StreamSequencerContext context,
                                 SequencerOutput output,
                                 EnumMetadata enumMetadata ) {


From dna-commits at lists.jboss.org  Wed Jan  6 23:05:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 6 Jan 2010 23:05:34 -0500
Subject: [dna-commits] DNA SVN: r1546 -
	trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic.
Message-ID: <201001070405.o0745Ytu003437@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-06 23:05:33 -0500 (Wed, 06 Jan 2010)
New Revision: 1546

Modified:
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
Log:
DNA-617 NPE while updating indexes (during integration tests)

Applied the patch to correct an issue in the connector that caused it calculate an SNS index of 2 for all nodes whose SNS index was not supposed to be 1. The expanded TCK test data exposed this.

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2010-01-07 02:59:55 UTC (rev 1545)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2010-01-07 04:05:33 UTC (rev 1546)
@@ -363,9 +363,13 @@
                     while (iter.hasPrevious()) {
                         Location existing = iter.previous();
                         Path.Segment segment = existing.getPath().getLastSegment();
-                        if (!segment.getName().equals(childName)) continue;
-                        // Otherwise the name matched, so get the indexes ...
-                        nextSnsIndex = segment.getIndex() + 1;
+                        if (segment.getName().equals(childName)) {
+                            // Otherwise the name matched, so get the indexes ...
+                            nextSnsIndex = segment.getIndex() + 1;
+
+                            // We've found the last match, so no need to loop further
+                            break;
+                        }
                     }
                 }
             } else {


From dna-commits at lists.jboss.org  Thu Jan  7 02:22:27 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 02:22:27 -0500
Subject: [dna-commits] DNA SVN: r1547 - in trunk:
	docs/examples/gettingstarted and 1 other directories.
Message-ID: <201001070722.o077MRrS012070@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-07 02:22:26 -0500 (Thu, 07 Jan 2010)
New Revision: 1547

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties
Log:
DNA-616 The problem has to do with the fact that this example uses a FederatedRepositorySource as a source for a JpaRepository (which creates a FederatedRepositorySource on top of the supplied source).  Thus, there is a FederatedRepositorySource that uses another FederatedRepositorySource, and this is the condition that causes the deadlock.

When the JcrRepository is created, it uses a SearchIndexer to crawl the content and create the requisite indexes for query/search.  The SearchIndexer is create a CompositeRequestChannel (which it uses to submit to the designated repository source a CompositeRequest that remains open, allowing the SearchIndexer to supply requests and then use those requests to build other requests that are submitted within the same execution/transaction), and is submitting a ReadBranchRequest to the source that happens to be the lower FederatedRepositorySource. The FederatedRepositorySource returns a connection that has an execute(...) method that implements the work by using the fork-join algorithm to process the request, which in this case is the  CompositeRequest (owned by the CompositeRequestChannel created by the SearchIndexer).

Now, the ForkRequestProcessor works on all the incoming request, which again is the CompositeRequest.  The FRP's process(CompositeRequest) is actually inherited from RequestProcessor, and simply uses an iterator to get all of the requests within the CompositeRequest.  The iterator promptly returns the first ReadBranchRequest, so the ForkRequestProcessor handles this via it's process(ReadBranchRequest), and like all of the ForkRequestProcessor.process(...) methods, forks the request into appropriate requests to submit to the underlying (federated) sources, and then it enqueues the forked requests into a queue.

Note that the ForkRequestProcessor does NOT mark the requests it processes as being completed.  After all, this is the job of the JoinRequestProcessor.

Meanwhile, the ForkRequestProcessor.process(ReadBranchRequest) completes and returns, and the iterator in the ForkRequestProcessor.process(CompositeRequest) then attempts to get the next request.

But the SearchIndexer has only added one ReadBranchRequest and is waiting/blocking until that request is completed before it continues.  But the FederatedRepositoryConnection is waiting/blocking until the next request is added to the CompositeRequest.  Thus the deadlock.

The only way to break this deadlock is for the ReadRequestBranch to be completed.  But, because of the way that FederatedRepositoryConnection.execute(...) is implemented, the ForkRequestProcessor.process(request) must complete before the JoinRequestProcessor is started.  So we need to create and start the JoinRequestProcessor without waiting for the ForkRequestProcessor.process(request) to complete.

The solution is actually coded in the FederatedRepositoryConnection.execute(...) - there is a 'shouldProcessSynchronously(Request)' method that returns whether the ForkRequestProcessor should be processed synchronously or asynchronously, and is implemented to always return 'true' (synchronous).  The solution to this problem requires that the method return 'false' for CompositeRequests that contain more than one (or an unknown number) of requests.  (In other cases, there is just one request, so the forking can be done synchronously, saving the work of pushing the fork processing into the executor service.)

Thus, the 'shouldProcessSynchronously(Request)' was implemented to do this, and the test completed ... with an error.  This error is caused by a bug in the JoinRequestProcessor.process(ReadBranchRequest) that failed to properly calculate the projected actual Locations for the ProxyNodes from the source requests.  (Apparently the SearchIndexer reads a branch that is deeper than was previously tested.)

Fixing the JoinRequestProcessor.process(ReadBranchRequest) allows the repository example test cases to complete successfully.

See the attached patch, which was committed and verified with a full integration build (all unit and integration tests pass).  The patch also changes the log level of the repository example back to 'ERROR' (what it was previously), and also re-enables the 'docs/examples/gettingstarted/repository' project in the 'docs/examples/gettingstarted/pom.xml'.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2010-01-07 04:05:33 UTC (rev 1546)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2010-01-07 07:22:26 UTC (rev 1547)
@@ -134,14 +134,18 @@
     }
 
     protected boolean shouldProcessSynchronously( Request request ) {
+        if (request instanceof CompositeRequest) {
+            CompositeRequest composite = (CompositeRequest)request;
+            if (composite.size() == 1) return true;
+            // There is more than one request, and the JoinRequestProcessor needs to be able to run even if
+            // the ForkRequestProcessor is processing incoming requests. Normally this would work fine,
+            // but if the incoming request is a CompositeRequestChannel.CompositeRequest, the ForkRequestProcessor
+            // will block if the channel is still open. In a synchronous mode, this prevents the JoinRequestProcessor
+            // from completing the incoming requests. See DNA-616 for details.
+            return false;
+        }
+        // Otherwise, its just a single request ...
         return true;
-        // if (request instanceof CompositeRequest) {
-        // CompositeRequest composite = (CompositeRequest)request;
-        // if (composite.size() == 1) return true;
-        // return false;
-        // }
-        // // Otherwise, its just a single request ...
-        // return true;
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2010-01-07 04:05:33 UTC (rev 1546)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2010-01-07 07:22:26 UTC (rev 1547)
@@ -611,7 +611,14 @@
                 ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), workspace.getName());
                 List<Location> children = new ArrayList<Location>(placeholder.children().size());
                 for (ProjectedNode child : placeholder.children()) {
-                    children.add(child.location()); // the ProxyNodes will have only a path!
+                    if (child instanceof ProxyNode) {
+                        ProxyNode proxy = (ProxyNode)child;
+                        children.add(proxy.federatedLocation()); // the ProxyNodes will have only a path!
+                        proxy.federatedLocation();
+                    } else {
+                        assert child instanceof PlaceholderNode;
+                        children.add(child.location());
+                    }
                 }
                 placeholderRequest.addChildren(children);
                 placeholderRequest.addProperties(placeholder.properties().values());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-07 04:05:33 UTC (rev 1546)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2010-01-07 07:22:26 UTC (rev 1547)
@@ -497,6 +497,17 @@
         return actual;
     }
 
+    protected Location determineActualLocation( Location actualInSource,
+                                                Projection projection ) {
+        assert projection != null;
+        // Get the projection from the source-specific location ...
+        Path pathInSource = actualInSource.getPath();
+        for (Path path : projection.getPathsInRepository(pathInSource, pathFactory)) {
+            return actualInSource.with(path);
+        }
+        return actualInSource;
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -657,6 +668,8 @@
                     projectToFederated(actualLocation, projection, request, parent, children, properties);
                 }
                 Location locationOfProxy = readFromSource.getActualLocationOfNode();
+                // The location is in terms of the source, so get the projected location ...
+                locationOfProxy = determineActualLocation(locationOfProxy, projection);
                 actualLocationsOfProxyNodes.put(locationOfProxy.getPath(), locationOfProxy);
             }
             setCacheableInfo(request, fromSource.getCachePolicy());

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2010-01-07 04:05:33 UTC (rev 1546)
+++ trunk/docs/examples/gettingstarted/pom.xml	2010-01-07 07:22:26 UTC (rev 1547)
@@ -10,7 +10,7 @@
 
   <modules>
     <module>sequencers</module>
-    <!-- module>repositories</module -->
+    <module>repositories</module>
   </modules>
 
   <dependencyManagement>

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties	2010-01-07 04:05:33 UTC (rev 1546)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties	2010-01-07 07:22:26 UTC (rev 1547)
@@ -5,7 +5,7 @@
 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %m%n
 
 # Root logger option
-log4j.rootLogger=WARNING, stdout
+log4j.rootLogger=ERROR, stdout
 
 # Set up the default logging to be INFO level, then override specific units
-log4j.logger.org.jboss.dna=WARNING
+log4j.logger.org.jboss.dna=ERROR


From dna-commits at lists.jboss.org  Thu Jan  7 02:22:38 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 02:22:38 -0500
Subject: [dna-commits] DNA SVN: r1548 -
	trunk/extensions/dna-connector-jdbc-metadata.
Message-ID: <201001070722.o077McP4012080@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-07 02:22:38 -0500 (Thu, 07 Jan 2010)
New Revision: 1548

Modified:
   trunk/extensions/dna-connector-jdbc-metadata/pom.xml
Log:
Changed the module description for 'dna-connector-jdbc-metadata' to specify that it is a connector for JDBC schema/metadata

Modified: trunk/extensions/dna-connector-jdbc-metadata/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-07 07:22:26 UTC (rev 1547)
+++ trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-07 07:22:38 UTC (rev 1548)
@@ -10,7 +10,7 @@
 	<!-- The groupId and version values are inherited from parent -->
 	<artifactId>dna-connector-jdbc-metadata</artifactId>
 	<packaging>jar</packaging>
-	<name>JBoss DNA Connector to JDBC</name>
+	<name>JBoss DNA Connector to JDBC Schemas</name>
 	<description>JBoss DNA Connector that processes JDBC metadata</description>
 	<url>http://labs.jboss.org/dna</url>
 	<dependencies>


From dna-commits at lists.jboss.org  Thu Jan  7 09:39:17 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 09:39:17 -0500
Subject: [dna-commits] DNA SVN: r1549 - in trunk/dna-jcr/src/main:
	resources/org/jboss/dna/jcr and 1 other directory.
Message-ID: <201001071439.o07EdHeX009252@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-07 09:39:17 -0500 (Thu, 07 Jan 2010)
New Revision: 1549

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
Log:
DNA-591

Applied patch that cleanly (i.e., with proper internationalization) corrects the NPE and provides a reasonably useful error message instead.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2010-01-07 07:22:38 UTC (rev 1548)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2010-01-07 14:39:17 UTC (rev 1549)
@@ -160,6 +160,8 @@
     public static I18n cannotRedefineProperty;
     public static I18n autocreatedPropertyNeedsDefault;
     public static I18n singleValuedPropertyNeedsSingleValuedDefault;
+    public static I18n couldNotFindDefinitionOfRequiredPrimaryType;
+    public static I18n cannotRedefineChildNodeWithIncompatibleDefinition;
 
     public static I18n noDefinition;
     public static I18n noSnsDefinition;
@@ -174,6 +176,7 @@
     public static I18n cannotUnregisterSupertype;
     public static I18n cannotUnregisterRequiredPrimaryType;
     public static I18n cannotUnregisterDefaultPrimaryType;
+    public static I18n cannotUnregisterInUseType;
 
     public static I18n cannotAddMixin;
     public static I18n invalidMixinTypeForNode;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2010-01-07 07:22:38 UTC (rev 1548)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2010-01-07 14:39:17 UTC (rev 1549)
@@ -45,6 +45,7 @@
 import javax.jcr.version.OnParentVersionAction;
 import net.jcip.annotations.GuardedBy;
 import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.common.text.TextEncoder;
 import org.jboss.dna.common.text.XmlNameEncoder;
 import org.jboss.dna.common.util.CheckArg;
@@ -1922,23 +1923,32 @@
         for (JcrNodeDefinition ancestor : ancestors) {
             if (ancestor.isProtected()) {
                 throw new InvalidNodeTypeDefinitionException(
-                                                             JcrI18n.cannotOverrideProtectedDefinition.text(ancestor.getDeclaringNodeType()
-                                                                                                                    .getName(),
+                                                             JcrI18n.cannotOverrideProtectedDefinition.text(ancestor.getDeclaringNodeType().getName(),
                                                                                                             "child node"));
             }
 
             if (ancestor.isMandatory() && !node.isMandatory()) {
                 throw new InvalidNodeTypeDefinitionException(
-                                                             JcrI18n.cannotMakeMandatoryDefinitionOptional.text(ancestor.getDeclaringNodeType()
-                                                                                                                        .getName(),
+                                                             JcrI18n.cannotMakeMandatoryDefinitionOptional.text(ancestor.getDeclaringNodeType().getName(),
                                                                                                                 "child node"));
 
             }
 
-            for (int i = 0; i < ancestor.getRequiredPrimaryTypes().length; i++) {
-                NodeType apt = ancestor.getRequiredPrimaryTypes()[i];
+            Name[] requiredPrimaryTypeNames = ancestor.requiredPrimaryTypeNames();
+            for (int i = 0; i < requiredPrimaryTypeNames.length; i++) {
+                NodeType apt = findTypeInMapOrList(requiredPrimaryTypeNames[i], pendingTypes);
+
+                if (apt == null) {
+                    I18n msg = JcrI18n.couldNotFindDefinitionOfRequiredPrimaryType;
+                    throw new InvalidNodeTypeDefinitionException(msg.text(requiredPrimaryTypeNames[i],
+                                                                          node.getName(),
+                                                                          node.getDeclaringNodeType()));
+
+                }
+
                 boolean found = false;
-                for (Name name : node.getRequiredPrimaryTypeNames()) {
+
+                for (Name name : node.requiredPrimaryTypeNames()) {
                     JcrNodeType npt = findTypeInMapOrList(name, pendingTypes);
 
                     if (npt.isNodeType(apt.getName())) {
@@ -1947,12 +1957,8 @@
                     }
                 }
                 if (!found) {
-                    throw new InvalidNodeTypeDefinitionException(
-                                                                 "Cannot redefine child node '"
-                                                                 + nodeName
-                                                                 + "' with required type '"
-                                                                 + apt.getName()
-                                                                 + "' with new child node that does not required that type or a subtype of that type.");
+                    I18n msg = JcrI18n.cannotRedefineChildNodeWithIncompatibleDefinition;
+                    throw new InvalidNodeTypeDefinitionException(msg.text(nodeName, apt.getName(), node.getDeclaringNodeType()));
 
                 }
             }
@@ -1995,16 +2001,15 @@
 
         Value[] defaultValues = prop.getDefaultValues();
         if (prop.isAutoCreated() && !prop.isProtected() && (defaultValues == null || defaultValues.length == 0)) {
-            throw new InvalidNodeTypeDefinitionException(JcrI18n.autocreatedPropertyNeedsDefault.text(prop.getName(),
-                                                                                                      prop.getDeclaringNodeType()
-                                                                                                          .getName()));
+            throw new InvalidNodeTypeDefinitionException(
+                                                         JcrI18n.autocreatedPropertyNeedsDefault.text(prop.getName(),
+                                                                                                      prop.getDeclaringNodeType().getName()));
         }
 
         if (!prop.isMultiple() && (defaultValues != null && defaultValues.length > 1)) {
             throw new InvalidNodeTypeDefinitionException(
                                                          JcrI18n.singleValuedPropertyNeedsSingleValuedDefault.text(prop.getName(),
-                                                                                                                   prop.getDeclaringNodeType()
-                                                                                                                       .getName()));
+                                                                                                                   prop.getDeclaringNodeType().getName()));
         }
 
         Name propName = context.getValueFactories().getNameFactory().create(prop.getName());
@@ -2018,15 +2023,13 @@
         for (JcrPropertyDefinition ancestor : ancestors) {
             if (ancestor.isProtected()) {
                 throw new InvalidNodeTypeDefinitionException(
-                                                             JcrI18n.cannotOverrideProtectedDefinition.text(ancestor.getDeclaringNodeType()
-                                                                                                                    .getName(),
+                                                             JcrI18n.cannotOverrideProtectedDefinition.text(ancestor.getDeclaringNodeType().getName(),
                                                                                                             "property"));
             }
 
             if (ancestor.isMandatory() && !prop.isMandatory()) {
                 throw new InvalidNodeTypeDefinitionException(
-                                                             JcrI18n.cannotMakeMandatoryDefinitionOptional.text(ancestor.getDeclaringNodeType()
-                                                                                                                        .getName(),
+                                                             JcrI18n.cannotMakeMandatoryDefinitionOptional.text(ancestor.getDeclaringNodeType().getName(),
                                                                                                                 "property"));
 
             }
@@ -2037,16 +2040,14 @@
                 && !Arrays.equals(ancestor.getValueConstraints(), prop.getValueConstraints())) {
                 throw new InvalidNodeTypeDefinitionException(
                                                              JcrI18n.constraintsChangedInSubtype.text(propName,
-                                                                                                      ancestor.getDeclaringNodeType()
-                                                                                                              .getName()));
+                                                                                                      ancestor.getDeclaringNodeType().getName()));
             }
 
             if (!isAlwaysSafeConversion(prop.getRequiredType(), ancestor.getRequiredType())) {
                 throw new InvalidNodeTypeDefinitionException(
                                                              JcrI18n.cannotRedefineProperty.text(propName,
                                                                                                  PropertyType.nameFromValue(prop.getRequiredType()),
-                                                                                                 ancestor.getDeclaringNodeType()
-                                                                                                         .getName(),
+                                                                                                 ancestor.getDeclaringNodeType().getName(),
                                                                                                  PropertyType.nameFromValue(ancestor.getRequiredType())));
 
             }

Modified: trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
===================================================================
--- trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2010-01-07 07:22:38 UTC (rev 1548)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2010-01-07 14:39:17 UTC (rev 1549)
@@ -144,6 +144,8 @@
 cannotRedefineProperty=Cannot redefine property '{0}' with new type '{1}' when existing property with same name in type '{2}' has incompatible type '{3}'
 autocreatedPropertyNeedsDefault=Auto-created property '{0}' in type '{1}' must specify a default value
 singleValuedPropertyNeedsSingleValuedDefault=Single-valued property '{0}' in type '{1}' cannot have multiple default values
+couldNotFindDefinitionOfRequiredPrimaryType = Could not find node type definition for the type of required primary type "{0}" while validating child node definition "{1}" of node type "{2}"
+cannotRedefineChildNodeWithIncompatibleDefinition = Cannot redefine child node "{0}" with required type "{1}" in node type "{2}" with new child node that does not require that type or a subtype of that type.
 
 noDefinition=Cannot find a definition for the {0} named '{1}' on the node at '{2}' with primary type '{3}' and mixin types: {4}
 noSnsDefinition=Cannot find a definition that allows same-name siblings for the child node named '{0}' on the node at '{1}' with primary type '{2}' and mixin types: {3} and a child node already exists with this name
@@ -158,6 +160,7 @@
 cannotUnregisterSupertype=Cannot unregister type '{0}' which is supertype of type '{1}'
 cannotUnregisterRequiredPrimaryType=Cannot unregister type '{0}' which is the required primary type for child node '{2}' on type '{1}'
 cannotUnregisterDefaultPrimaryType=Cannot unregister type '{0}' which is the default primary type for child node '{2}' of type '{1}'
+cannotUnregisterInUseType=Cannot unregister type '{0}' because it is currently being used on at least one node
 
 cannotAddMixin = This node does not allow adding the mixin type "{0}"
 invalidMixinTypeForNode = "{0}" is not currently a mixin type for node "{1}"


From dna-commits at lists.jboss.org  Thu Jan  7 09:43:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 09:43:34 -0500
Subject: [dna-commits] DNA SVN: r1550 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map.
Message-ID: <201001071443.o07EhYaJ009762@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-07 09:43:33 -0500 (Thu, 07 Jan 2010)
New Revision: 1550

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java
Log:
Fixed one eclipse warning and added some asserts to clarify intent.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java	2010-01-07 14:39:17 UTC (rev 1549)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java	2010-01-07 14:43:33 UTC (rev 1550)
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
@@ -721,6 +722,11 @@
         return false;
     }
 
+    @Override
+    public int hashCode() {
+        return HashCode.compute(getName());
+    }
+
     /**
      * {@inheritDoc}
      * 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java	2010-01-07 14:39:17 UTC (rev 1549)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java	2010-01-07 14:43:33 UTC (rev 1550)
@@ -98,8 +98,13 @@
     public void process( ReadAllChildrenRequest request ) {
         MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
         MapNode node = getTargetNode(workspace, request, request.of());
-        if (node == null) return;
+        if (node == null) {
+            assert request.hasError();
+            return;
+        }
+
         Location actualLocation = getActualLocation(request.of(), node);
+        assert actualLocation != null;
         Path path = actualLocation.getPath();
         // Get the names of the children ...
         List<MapNode> children = node.getChildren();
@@ -142,13 +147,19 @@
     public void process( ReadAllPropertiesRequest request ) {
         MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
         MapNode node = getTargetNode(workspace, request, request.at());
-        if (node == null) return;
+        if (node == null) {
+            assert request.hasError();
+            return;
+        }
+
         // Get the properties of the node ...
         Location actualLocation = getActualLocation(request.at(), node);
         request.addProperty(propertyFactory.create(DnaLexicon.UUID, node.getUuid()));
         for (Property property : node.getProperties().values()) {
             request.addProperty(property);
         }
+
+        assert actualLocation != null;
         request.setActualLocationOfNode(actualLocation);
         setCacheableInfo(request);
     }


From dna-commits at lists.jboss.org  Thu Jan  7 09:47:53 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 09:47:53 -0500
Subject: [dna-commits] DNA SVN: r1551 - in trunk/dna-graph/src:
	main/java/org/jboss/dna/graph/connector/path/cache and 1
	other directories.
Message-ID: <201001071447.o07Elrpl010276@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-07 09:47:53 -0500 (Thu, 07 Jan 2010)
New Revision: 1551

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultCacheStatistics.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/NoCachePolicy.java
Removed:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
Log:
DNA-626 Change Default Path Repository Cache Behavior to Not Cache

Applied patch that reverts the default caching behavior for the path repository implementations to not cache.  It is still possible to override the cache policy for any path repository by calling setCachePolicy(PathCachePolicy)  on the repository source.  

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySource.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -37,7 +37,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.connector.path.cache.DefaultPathCachePolicy;
+import org.jboss.dna.graph.connector.path.cache.NoCachePolicy;
 import org.jboss.dna.graph.connector.path.cache.PathCachePolicy;
 import org.jboss.dna.graph.connector.path.cache.PathRepositoryCache;
 
@@ -59,12 +59,10 @@
      */
     public static final int DEFAULT_RETRY_LIMIT = 0;
 
-    private static final int DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS = 30;
-
     /**
-     * The default cache policy for this repository source (cache all nodes which remain valid for 30 seconds)
+     * The default cache policy for this repository source (no caching)
      */
-    public static final PathCachePolicy DEFAULT_CACHE_POLICY = new DefaultPathCachePolicy(DEFAULT_CACHE_TIME_TO_LIVE_IN_SECONDS);
+    public static final PathCachePolicy DEFAULT_CACHE_POLICY = new NoCachePolicy();
 
     protected int retryLimit = DEFAULT_RETRY_LIMIT;
     protected String name;

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultCacheStatistics.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultCacheStatistics.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultCacheStatistics.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -0,0 +1,48 @@
+package org.jboss.dna.graph.connector.path.cache;
+
+import java.util.concurrent.atomic.AtomicLong;
+import net.jcip.annotations.ThreadSafe;
+
+/**
+ * Default, thread-safe implementation of {@link CacheStatistics} that uses {@link AtomicLong AtomicLongs} as counters for the
+ * statistics.
+ */
+ at ThreadSafe
+public final class DefaultCacheStatistics implements CacheStatistics {
+    private final AtomicLong writes = new AtomicLong(0);
+    private final AtomicLong hits = new AtomicLong(0);
+    private final AtomicLong misses = new AtomicLong(0);
+    private final AtomicLong expirations = new AtomicLong(0);
+
+    public long getWrites() {
+        return writes.get();
+    }
+
+    public long getHits() {
+        return hits.get();
+    }
+
+    public long getMisses() {
+        return misses.get();
+    }
+
+    public long getExpirations() {
+        return expirations.get();
+    }
+
+    public long incrementWrites() {
+        return writes.getAndIncrement();
+    }
+
+    public long incrementHits() {
+        return hits.getAndIncrement();
+    }
+
+    public long incrementMisses() {
+        return misses.getAndIncrement();
+    }
+
+    public long incrementExpirations() {
+        return expirations.getAndIncrement();
+    }
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultCacheStatistics.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -1,63 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.graph.connector.path.cache;
-
-import net.jcip.annotations.Immutable;
-import org.jboss.dna.graph.connector.path.PathNode;
-
-/**
- * Trivial path cache policy implementation that caches all nodes in an in-memory cache.
- * <p>
- * As a result, this cache policy may not be safe for use with some large repositories as it does not attempt to limit cache
- * attempts based on the size of the node or the current size of the cache.
- * </p>
- */
- at Immutable
-public class DefaultPathCachePolicy implements PathCachePolicy {
-
-    private static final long serialVersionUID = 1L;
-
-    private final long cacheTimeToLiveInSeconds;
-
-    public DefaultPathCachePolicy( long cacheTimeToLiveInSeconds ) {
-        super();
-        this.cacheTimeToLiveInSeconds = cacheTimeToLiveInSeconds;
-    }
-
-    /**
-     * @return true for all nodes
-     * @see PathCachePolicy#shouldCache(PathNode)
-     */
-    public boolean shouldCache( PathNode node ) {
-        return true;
-    }
-
-    public long getTimeToLive() {
-        return this.cacheTimeToLiveInSeconds;
-    }
-
-    public Class<? extends WorkspaceCache> getCacheClass() {
-        return InMemoryWorkspaceCache.class;
-    }
-}

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/InMemoryWorkspaceCache.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -27,7 +27,6 @@
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicLong;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.graph.connector.path.PathNode;
 import org.jboss.dna.graph.property.Path;
@@ -39,9 +38,10 @@
 public class InMemoryWorkspaceCache implements WorkspaceCache {
     private final ConcurrentMap<Path, CacheEntry> nodesByPath = new ConcurrentHashMap<Path, CacheEntry>();
     private PathCachePolicy policy = null;
-    private InMemoryStatistics statistics = new InMemoryStatistics();
+    private DefaultCacheStatistics statistics = new DefaultCacheStatistics();
 
-    public void initialize( PathCachePolicy policy ) {
+    public void initialize( PathCachePolicy policy,
+                            String workspaceName ) {
         if (this.policy != null) {
             throw new IllegalStateException();
         }
@@ -49,8 +49,12 @@
         this.policy = policy;
     }
 
+    protected PathCachePolicy policy() {
+        return policy;
+    }
+
     public void clearStatistics() {
-        statistics = new InMemoryStatistics();
+        statistics = new DefaultCacheStatistics();
     }
 
     public CacheStatistics getStatistics() {
@@ -81,7 +85,7 @@
         assert node != null;
 
         if (!policy.shouldCache(node)) return;
-
+        
         statistics.incrementWrites();
         nodesByPath.put(node.getPath(), new CacheEntry(node));
     }
@@ -104,10 +108,6 @@
         this.statistics = null;
     }
 
-    protected PathCachePolicy policy() {
-        return this.policy;
-    }
-
     class CacheEntry {
         private final SoftReference<PathNode> ref;
         private final long expiryTime;
@@ -126,42 +126,38 @@
         }
     }
 
-    class InMemoryStatistics implements CacheStatistics {
-        private final AtomicLong writes = new AtomicLong(0);
-        private final AtomicLong hits = new AtomicLong(0);
-        private final AtomicLong misses = new AtomicLong(0);
-        private final AtomicLong expirations = new AtomicLong(0);
+    /**
+     * Trivial path cache policy implementation that caches all nodes in an in-memory cache.
+     * <p>
+     * As a result, this cache policy may not be safe for use with some large repositories as it does not attempt to limit cache
+     * attempts based on the size of the node or the current size of the cache.
+     * </p>
+     */
+    public static class InMemoryCachePolicy implements PathCachePolicy {
 
-        public long getWrites() {
-            return writes.get();
-        }
+        private static final long serialVersionUID = 1L;
 
-        public long getHits() {
-            return hits.get();
-        }
+        private final long cacheTimeToLiveInSeconds;
 
-        public long getMisses() {
-            return misses.get();
+        public InMemoryCachePolicy( long cacheTimeToLiveInSeconds ) {
+            super();
+            this.cacheTimeToLiveInSeconds = cacheTimeToLiveInSeconds;
         }
 
-        public long getExpirations() {
-            return expirations.get();
+        /**
+         * @return true for all nodes
+         * @see PathCachePolicy#shouldCache(PathNode)
+         */
+        public boolean shouldCache( PathNode node ) {
+            return true;
         }
 
-        public long incrementWrites() {
-            return writes.getAndIncrement();
+        public long getTimeToLive() {
+            return this.cacheTimeToLiveInSeconds;
         }
 
-        public long incrementHits() {
-            return hits.getAndIncrement();
+        public Class<? extends WorkspaceCache> getCacheClass() {
+            return InMemoryWorkspaceCache.class;
         }
-
-        public long incrementMisses() {
-            return misses.getAndIncrement();
-        }
-
-        public long incrementExpirations() {
-            return expirations.getAndIncrement();
-        }
     }
 }

Copied: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/NoCachePolicy.java (from rev 1529, trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/DefaultPathCachePolicy.java)
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/NoCachePolicy.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/NoCachePolicy.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -0,0 +1,52 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.connector.path.cache;
+
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.connector.path.PathNode;
+
+/**
+ * Trivial path cache policy implementation that performs no caching at all
+ */
+ at Immutable
+public class NoCachePolicy implements PathCachePolicy {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @return false for all nodes
+     * @see PathCachePolicy#shouldCache(PathNode)
+     */
+    public boolean shouldCache( PathNode node ) {
+        return false;
+    }
+
+    public long getTimeToLive() {
+        return 0;
+    }
+
+    public Class<? extends WorkspaceCache> getCacheClass() {
+        return InMemoryWorkspaceCache.class;
+    }
+}

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/PathRepositoryCache.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -63,18 +63,18 @@
         WorkspaceCache cache = cachesByName.get(workspaceName);
         if (cache != null) return cache;
 
-        cache = newCache();
+        cache = newCache(workspaceName);
         cachesByName.putIfAbsent(workspaceName, cache);
 
         return cachesByName.get(workspaceName);
     }
 
-    private final WorkspaceCache newCache() {
+    private final WorkspaceCache newCache( String workspaceName ) {
         WorkspaceCache cache = null;
 
         try {
             cache = policy.getCacheClass().newInstance();
-            cache.initialize(policy);
+            cache.initialize(policy, workspaceName);
         } catch (IllegalAccessException iae) {
             throw new IllegalStateException(iae);
         } catch (InstantiationException ie) {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/WorkspaceCache.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -31,7 +31,7 @@
  * The basic contract for a workspace-level cache of paths to the nodes stored at that path.
  * <p>
  * Implementations must provide a no-argument constructor in order to be instantiated by {@link PathRepositoryCache}. After
- * instantiation, the {@link #initialize(PathCachePolicy)} method will be called to inject the cache policy into the
+ * instantiation, the {@link #initialize(PathCachePolicy, String)} method will be called to inject the cache policy into the
  * implementation.
  * </p>
  * <p>
@@ -45,9 +45,11 @@
      * Injects the cache policy into the cache
      * 
      * @param policy the active cache policy for the repository source with which this cache is associated
+     * @param workspaceName the name of the workspace that this cache is managing
      * @throws IllegalStateException if this method is called on a cache that has already been initialized.
      */
-    public void initialize( PathCachePolicy policy );
+    public void initialize( PathCachePolicy policy,
+                            String workspaceName );
 
     /**
      * Clears all statistics for this cache
@@ -71,7 +73,7 @@
 
     /**
      * Attempts to cache the given node. Implementations must call {@link PathCachePolicy#shouldCache(PathNode)} on the policy
-     * from the {@link #initialize(PathCachePolicy)} method to determine if the node should be cached.
+     * from the {@link #initialize(PathCachePolicy, String)} method to determine if the node should be cached.
      * 
      * @param node the node that is to be cached; may not be null
      */

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/path/cache/package-info.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -29,7 +29,7 @@
  * <p>
  * Each {@code AbstractPathRepositorySource} has a local instance of {@link PathRepositoryCache} that reads the {@code PathCachePolicy} for the source and uses it to create instances of
  * {@link WorkspaceCache} for each workspace in the repository.  When a workspace cache instance is requested for the first time from the {@link PathRepositoryCache#getCache(String)} method,
- * an instance of the class is created using the no-argument constructor for the class and {@link WorkspaceCache#initialize(PathCachePolicy)} is called with the current cache policy. 
+ * an instance of the class is created using the no-argument constructor for the class and {@link WorkspaceCache#initialize(PathCachePolicy, String)} is called with the current cache policy. 
  * </p>
  * <p>
  * When {@link org.jboss.dna.graph.connector.path.AbstractPathRepositorySource#setCachePolicy(PathCachePolicy) the cache policy is changed} on the source, the existing {@code PathRepositoryCache}

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	2010-01-07 14:43:33 UTC (rev 1550)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/path/AbstractPathRepositorySourceTest.java	2010-01-07 14:47:53 UTC (rev 1551)
@@ -134,7 +134,8 @@
         boolean closed = false;
         PathCachePolicy policy;
 
-        public void initialize( PathCachePolicy policy ) {
+        public void initialize( PathCachePolicy policy,
+                                String workspaceName ) {
             this.policy = policy;
         }
 


From dna-commits at lists.jboss.org  Thu Jan  7 13:24:40 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 13:24:40 -0500
Subject: [dna-commits] DNA SVN: r1552 - in trunk:
	dna-jcr/src/main/java/org/jboss/dna/jcr and 1 other directories.
Message-ID: <201001071824.o07IOepJ027456@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-07 13:24:39 -0500 (Thu, 07 Jan 2010)
New Revision: 1552

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractSessionTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/WorkspaceLockManagerTest.java
Log:
DNA-460 NodeTypeManager.unregisterType

Applied patch that changes the query language from XPath to SQL to allow the use of the LIMIT keyword. The patch also corrects a minor problem with limit/offset parsing.


Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/CanonicalPlanner.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -361,11 +361,11 @@
 
         boolean attach = false;
         if (limit.getOffset() != 0) {
-            limitNode.setProperty(Property.LIMIT_COUNT, limit.getOffset());
+            limitNode.setProperty(Property.LIMIT_OFFSET, limit.getOffset());
             attach = true;
         }
         if (!limit.isUnlimited()) {
-            limitNode.setProperty(Property.LIMIT_OFFSET, limit.getRowLimit());
+            limitNode.setProperty(Property.LIMIT_COUNT, limit.getRowLimit());
             attach = true;
         }
         if (attach) {

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrQueryManager.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -331,7 +331,7 @@
         public QueryResult execute() throws RepositoryException {
             // Submit immediately to the workspace graph ...
             Schemata schemata = session.workspace().nodeTypeManager().schemata();
-            QueryResults result = session.repository().queryManager().query(session.workspace(),
+            QueryResults result = session.repository().queryManager().query(session.workspace().getName(),
                                                                             query,
                                                                             schemata,
                                                                             hints,
@@ -383,7 +383,7 @@
          */
         public QueryResult execute() throws RepositoryException {
             // Submit immediately to the workspace graph ...
-            QueryResults result = session.repository().queryManager().search(session.workspace(),
+            QueryResults result = session.repository().queryManager().search(session.workspace().getName(),
                                                                              statement,
                                                                              MAXIMUM_RESULTS_FOR_FULL_TEXT_SEARCH_QUERIES,
                                                                              0);

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -95,6 +95,7 @@
 import org.jboss.dna.graph.query.parse.QueryParsers;
 import org.jboss.dna.graph.query.parse.SqlQueryParser;
 import org.jboss.dna.graph.request.InvalidWorkspaceException;
+import org.jboss.dna.jcr.RepositoryQueryManager.PushDown;
 import org.jboss.dna.jcr.xpath.XPathQueryParser;
 
 /**
@@ -536,7 +537,8 @@
         // Set up the repository type manager ...
         try {
             boolean includeInheritedProperties = Boolean.valueOf(this.options.get(Option.TABLES_INCLUDE_COLUMNS_FOR_INHERITED_PROPERTIES));
-            this.repositoryTypeManager = new RepositoryNodeTypeManager(this.executionContext, includeInheritedProperties);
+            // this.repositoryTypeManager = new RepositoryNodeTypeManager(this, includeInheritedProperties);
+            this.repositoryTypeManager = new RepositoryNodeTypeManager(this, includeInheritedProperties);
             this.repositoryTypeManager.registerNodeTypes(new CndNodeTypeSource(new String[] {
                 "/org/jboss/dna/jcr/jsr_170_builtins.cnd", "/org/jboss/dna/jcr/dna_builtins.cnd"}));
         } catch (RepositoryException re) {
@@ -585,7 +587,7 @@
             // We can query the federated source if it supports queries and searches
             // AND the original source supports queries and searches ...
             if (canQuerySource && canQueryFederated) {
-                this.queryManager = new RepositoryQueryManager();
+                this.queryManager = new PushDown(this.sourceName, executionContext, connectionFactory);
             } else {
                 // Otherwise create a repository query manager that maintains its own search engine ...
                 String indexDirectory = this.options.get(Option.QUERY_INDEX_DIRECTORY);
@@ -595,7 +597,7 @@
                                                                              indexDirectory, updateIndexesSynchronously);
             }
         } else {
-            this.queryManager = new RepositoryQueryManager.Disabled();
+            this.queryManager = new RepositoryQueryManager.Disabled(this.sourceName);
         }
 
         /*
@@ -953,6 +955,13 @@
     }
 
     /**
+     * @return a list of all workspace names, without regard to the access permissions of any particular user
+     */
+    Set<String> workspaceNames() {
+        return Graph.create(sourceName, connectionFactory, executionContext).getWorkspaces();
+    }
+
+    /**
      * Returns the lock manager for the named workspace (if one already exists) or creates a new lock manager and returns it. This
      * method is thread-safe.
      * 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -31,6 +31,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import javax.jcr.PropertyType;
@@ -42,6 +43,7 @@
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
+import javax.jcr.query.InvalidQueryException;
 import javax.jcr.version.OnParentVersionAction;
 import net.jcip.annotations.GuardedBy;
 import net.jcip.annotations.ThreadSafe;
@@ -64,6 +66,12 @@
 import org.jboss.dna.graph.property.PropertyFactory;
 import org.jboss.dna.graph.property.ValueFactories;
 import org.jboss.dna.graph.property.ValueFactory;
+import org.jboss.dna.graph.query.QueryResults;
+import org.jboss.dna.graph.query.model.QueryCommand;
+import org.jboss.dna.graph.query.model.TypeSystem;
+import org.jboss.dna.graph.query.parse.QueryParser;
+import org.jboss.dna.graph.query.parse.SqlQueryParser;
+import org.jboss.dna.graph.query.validate.Schemata;
 import org.jboss.dna.jcr.nodetype.InvalidNodeTypeDefinitionException;
 import org.jboss.dna.jcr.nodetype.NodeTypeDefinition;
 import org.jboss.dna.jcr.nodetype.NodeTypeExistsException;
@@ -105,6 +113,8 @@
 
     private static final TextEncoder NAME_ENCODER = new XmlNameEncoder();
 
+    private final JcrRepository repository;
+    private final QueryParser queryParser;
     private final ExecutionContext context;
 
     @GuardedBy( "nodeTypeManagerLock" )
@@ -142,9 +152,10 @@
         ANY
     }
 
-    RepositoryNodeTypeManager( ExecutionContext context,
+    RepositoryNodeTypeManager( JcrRepository repository,
                                boolean includeColumnsForInheritedProperties ) {
-        this.context = context;
+        this.repository = repository;
+        this.context = repository.getExecutionContext();
         this.includeColumnsForInheritedProperties = includeColumnsForInheritedProperties;
         this.propertyFactory = context.getPropertyFactory();
         this.pathFactory = context.getValueFactories().getPathFactory();
@@ -152,6 +163,8 @@
         propertyDefinitions = new HashMap<PropertyDefinitionId, JcrPropertyDefinition>();
         childNodeDefinitions = new HashMap<NodeDefinitionId, JcrNodeDefinition>();
         nodeTypes = new HashMap<Name, JcrNodeType>(50);
+        queryParser = new SqlQueryParser();
+
     }
 
     /**
@@ -1199,13 +1212,18 @@
                                                                                                                           childNode.getName()));
                         }
                     }
+
+                    /*
+                     * Search the content graph to make sure that this type isn't being used
+                     */
+                    if (isNodeTypeInUse(nodeTypeName)) {
+                        throw new InvalidNodeTypeDefinitionException(JcrI18n.cannotUnregisterInUseType.text(name));
+
+                    }
+
                 }
             }
 
-            /*
-             * Do a full recursive search over the content graph to make sure that this type isn't being used
-             */
-            // TODO: replace this with a query after queries work
             this.nodeTypes.keySet().removeAll(nodeTypeNames);
             this.schemata = null;
 
@@ -1215,6 +1233,36 @@
     }
 
     /**
+     * Check if the named node type is in use in any workspace in the repository
+     * 
+     * @param nodeTypeName the name of the node type to check
+     * @return true if at least one node is using that type; false otherwise
+     * @throws InvalidQueryException if there is an error searching for uses of the named node type
+     */
+    boolean isNodeTypeInUse( Name nodeTypeName ) throws InvalidQueryException {
+        String nodeTypeString = nodeTypeName.getString(context.getNamespaceRegistry());
+        String expression = "SELECT * from [" + nodeTypeString + "] LIMIT 1";
+
+        TypeSystem typeSystem = context.getValueFactories().getTypeSystem();
+        // Parsing must be done now ...
+        QueryCommand command = queryParser.parseQuery(expression, typeSystem);
+        assert command != null : "Could not parse " + expression;
+
+        Schemata schemata = getRepositorySchemata();
+
+        Set<String> workspaceNames = repository.workspaceNames();
+        for (String workspaceName : workspaceNames) {
+            QueryResults result = repository.queryManager().query(workspaceName, command, schemata, null, null);
+
+            if (result.getRowCount() > 0) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
      * Registers a new node type or updates an existing node type using the specified definition and returns the resulting {@code
      * NodeType} object.
      * <p>

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -77,31 +77,25 @@
 /**
  * 
  */
-class RepositoryQueryManager {
+abstract class RepositoryQueryManager {
 
-    RepositoryQueryManager() {
-    }
+    protected final String sourceName;
 
-    @SuppressWarnings( "unused" )
-    public QueryResults query( JcrWorkspace workspace,
-                               QueryCommand query,
-                               Schemata schemata,
-                               PlanHints hints,
-                               Map<String, Object> variables ) throws InvalidQueryException {
-        Graph.BuildQuery builder = workspace.graph().query(query, schemata);
-        if (variables != null) builder.using(variables);
-        if (hints != null) builder.using(hints);
-        return builder.execute();
+    RepositoryQueryManager( String sourceName ) {
+        this.sourceName = sourceName;
     }
 
-    @SuppressWarnings( "unused" )
-    public QueryResults search( JcrWorkspace workspace,
-                                String searchExpression,
-                                int maxRowCount,
-                                int offset ) throws InvalidQueryException {
-        return workspace.graph().search(searchExpression, maxRowCount, offset);
-    }
+    public abstract QueryResults query( String workspaceName,
+                                        QueryCommand query,
+                                        Schemata schemata,
+                                        PlanHints hints,
+                                        Map<String, Object> variables ) throws InvalidQueryException;
 
+    public abstract QueryResults search( String workspaceName,
+                                         String searchExpression,
+                                         int maxRowCount,
+                                         int offset ) throws InvalidQueryException;
+
     /**
      * Crawl and index the content in the named workspace.
      * 
@@ -138,35 +132,82 @@
         // do nothing by default
     }
 
+    static class PushDown extends RepositoryQueryManager {
+        private final ExecutionContext context;
+        private final RepositoryConnectionFactory connectionFactory;
+
+        PushDown( String sourceName,
+                  ExecutionContext context,
+                  RepositoryConnectionFactory connectionFactory ) {
+            super(sourceName);
+            this.context = context;
+            this.connectionFactory = connectionFactory;
+        }
+
+        private Graph workspaceGraph( String workspaceName ) {
+            Graph graph = Graph.create(this.sourceName, connectionFactory, context);
+
+            if (workspaceName != null) {
+                graph.useWorkspace(workspaceName);
+            }
+
+            return graph;
+        }
+
+        @Override
+        public QueryResults query( String workspaceName,
+                                   QueryCommand query,
+                                   Schemata schemata,
+                                   PlanHints hints,
+                                   Map<String, Object> variables ) throws InvalidQueryException {
+            Graph.BuildQuery builder = workspaceGraph(workspaceName).query(query, schemata);
+            if (variables != null) builder.using(variables);
+            if (hints != null) builder.using(hints);
+            return builder.execute();
+        }
+
+        @Override
+        public QueryResults search( String workspaceName,
+                                    String searchExpression,
+                                    int maxRowCount,
+                                    int offset ) throws InvalidQueryException {
+            return workspaceGraph(workspaceName).search(searchExpression, maxRowCount, offset);
+        }
+
+    }
+
     static class Disabled extends RepositoryQueryManager {
 
+        Disabled( String sourceName ) {
+            super(sourceName);
+        }
+
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.jcr.RepositoryQueryManager#query(org.jboss.dna.jcr.JcrWorkspace,
-         *      org.jboss.dna.graph.query.model.QueryCommand, org.jboss.dna.graph.query.validate.Schemata,
-         *      org.jboss.dna.graph.query.plan.PlanHints, java.util.Map)
+         * @see org.jboss.dna.jcr.RepositoryQueryManager#query(java.lang.String, org.jboss.dna.graph.query.model.QueryCommand,
+         *      org.jboss.dna.graph.query.validate.Schemata, org.jboss.dna.graph.query.plan.PlanHints, java.util.Map)
          */
         @Override
-        public QueryResults query( JcrWorkspace workspace,
+        public QueryResults query( String workspaceName,
                                    QueryCommand query,
                                    Schemata schemata,
                                    PlanHints hints,
                                    Map<String, Object> variables ) throws InvalidQueryException {
-            throw new InvalidQueryException(JcrI18n.queryIsDisabledInRepository.text(workspace.getSourceName()));
+            throw new InvalidQueryException(JcrI18n.queryIsDisabledInRepository.text(this.sourceName));
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.jcr.RepositoryQueryManager#search(org.jboss.dna.jcr.JcrWorkspace, java.lang.String, int, int)
+         * @see org.jboss.dna.jcr.RepositoryQueryManager#search(java.lang.String, java.lang.String, int, int)
          */
         @Override
-        public QueryResults search( JcrWorkspace workspace,
+        public QueryResults search( String workspaceName,
                                     String searchExpression,
                                     int maxRowCount,
                                     int offset ) throws InvalidQueryException {
-            throw new InvalidQueryException(JcrI18n.queryIsDisabledInRepository.text(workspace.getSourceName()));
+            throw new InvalidQueryException(JcrI18n.queryIsDisabledInRepository.text(this.sourceName));
         }
     }
 
@@ -186,6 +227,8 @@
                        Observable observable,
                        String indexDirectory,
                        boolean updateIndexesSynchronously ) throws RepositoryException {
+            super(nameOfSourceToBeSearchable);
+
             this.context = context;
             this.sourceName = nameOfSourceToBeSearchable;
             this.connectionFactory = connectionFactory;
@@ -301,22 +344,36 @@
         }
 
         @Override
-        public QueryResults query( JcrWorkspace workspace,
+        public QueryResults query( String workspaceName,
                                    QueryCommand query,
                                    Schemata schemata,
                                    PlanHints hints,
                                    Map<String, Object> variables ) {
-            TypeSystem typeSystem = workspace.context().getValueFactories().getTypeSystem();
+            TypeSystem typeSystem = context.getValueFactories().getTypeSystem();
             SearchEngineProcessor processor = searchEngine.createProcessor(context, null, true);
             try {
                 QueryContext context = new GraphQueryContext(schemata, typeSystem, hints, new SimpleProblems(), variables,
-                                                             processor, workspace.getName());
+                                                             processor, workspaceName);
                 return queryEngine.execute(context, query);
             } finally {
                 processor.close();
             }
         }
 
+        @Override
+        public QueryResults search( String workspaceName,
+                                    String searchExpression,
+                                    int maxRowCount,
+                                    int offset ) throws InvalidQueryException {
+            Graph graph = Graph.create(sourceName, connectionFactory, context);
+
+            if (workspaceName != null) {
+                graph.useWorkspace(workspaceName);
+            }
+
+            return graph.search(searchExpression, maxRowCount, offset);
+        }
+
         /**
          * {@inheritDoc}
          * 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrTest.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrTest.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.stub;
 import java.io.IOException;
-import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Workspace;
 import org.jboss.dna.graph.ExecutionContext;
@@ -49,6 +48,7 @@
 public abstract class AbstractJcrTest {
 
     protected static ExecutionContext context;
+    protected static JcrRepository repository;
     protected static RepositoryNodeTypeManager rntm;
     protected InMemoryRepositorySource source;
     protected Graph store;
@@ -57,7 +57,6 @@
     protected JcrSession jcrSession;
     protected JcrNodeTypeManager nodeTypes;
     protected Workspace workspace;
-    protected Repository repository;
 
     /**
      * Initialize the expensive activities, and in particular the RepositoryNodeTypeManager instance.
@@ -70,7 +69,10 @@
 
         // Create the node type manager ...
         context.getNamespaceRegistry().register(Vehicles.Lexicon.Namespace.PREFIX, Vehicles.Lexicon.Namespace.URI);
-        rntm = new RepositoryNodeTypeManager(context, true);
+        repository = mock(JcrRepository.class);
+        stub(repository.getExecutionContext()).toReturn(context);
+
+        rntm = new RepositoryNodeTypeManager(repository, true);
         try {
             rntm.registerNodeTypes(new CndNodeTypeSource(new String[] {"/org/jboss/dna/jcr/jsr_170_builtins.cnd",
                 "/org/jboss/dna/jcr/dna_builtins.cnd"}));
@@ -115,7 +117,6 @@
         // Stub the session, workspace, and repository; then stub some critical methods ...
         jcrSession = mock(JcrSession.class);
         workspace = mock(Workspace.class);
-        repository = mock(Repository.class);
         stub(jcrSession.getExecutionContext()).toReturn(context);
         stub(jcrSession.getWorkspace()).toReturn(workspace);
         stub(jcrSession.getRepository()).toReturn(repository);

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractSessionTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractSessionTest.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractSessionTest.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -122,8 +122,24 @@
             }
         };
 
+        stub(repository.getExecutionContext()).toReturn(context);
+        stub(repository.getRepositorySourceName()).toReturn(repositorySourceName);
+        stub(repository.getPersistentRegistry()).toReturn(context.getNamespaceRegistry());
+        stub(repository.createWorkspaceGraph(anyString(), (ExecutionContext)anyObject())).toAnswer(new Answer<Graph>() {
+            public Graph answer( InvocationOnMock invocation ) throws Throwable {
+                return graph;
+            }
+        });
+        stub(repository.createSystemGraph(context)).toAnswer(new Answer<Graph>() {
+            public Graph answer( InvocationOnMock invocation ) throws Throwable {
+                return graph;
+            }
+        });
+        stub(this.repository.getRepositoryObservable()).toReturn(new MockObservable());
+
         // Stub out the repository, since we only need a few methods ...
-        repoTypeManager = new RepositoryNodeTypeManager(context, true);
+        repoTypeManager = new RepositoryNodeTypeManager(repository, true);
+        stub(repository.getRepositoryTypeManager()).toReturn(repoTypeManager);
 
         try {
             this.repoTypeManager.registerNodeTypes(new CndNodeTypeSource(new String[] {"/org/jboss/dna/jcr/jsr_170_builtins.cnd",
@@ -139,21 +155,6 @@
         }
         this.repoTypeManager.projectOnto(graph, pathFactory.create("/jcr:system/jcr:nodeTypes"));
 
-        stub(repository.getRepositoryTypeManager()).toReturn(repoTypeManager);
-        stub(repository.getRepositorySourceName()).toReturn(repositorySourceName);
-        stub(repository.getPersistentRegistry()).toReturn(context.getNamespaceRegistry());
-        stub(repository.createWorkspaceGraph(anyString(), (ExecutionContext)anyObject())).toAnswer(new Answer<Graph>() {
-            public Graph answer( InvocationOnMock invocation ) throws Throwable {
-                return graph;
-            }
-        });
-        stub(repository.createSystemGraph(context)).toAnswer(new Answer<Graph>() {
-            public Graph answer( InvocationOnMock invocation ) throws Throwable {
-                return graph;
-            }
-        });
-        stub(this.repository.getRepositoryObservable()).toReturn(new MockObservable());
-
         Path locksPath = pathFactory.createAbsolutePath(JcrLexicon.SYSTEM, DnaLexicon.LOCKS);
         workspaceLockManager = new WorkspaceLockManager(context, repository, workspaceName, locksPath);
 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -26,6 +26,7 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.stub;
 import java.io.IOException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -35,6 +36,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoAnnotations.Mock;
 
 /**
  * Test of CND-based type definitions. These test cases focus on ensuring that an import of a type from a CND file registers the
@@ -49,6 +51,8 @@
     private ExecutionContext context;
     private RepositoryNodeTypeManager repoTypeManager;
     private JcrNodeTypeSource nodeTypes;
+    @Mock
+    protected JcrRepository repository;
 
     @Before
     public void beforeEach() throws Exception {
@@ -56,7 +60,9 @@
         context = new ExecutionContext();
         context.getNamespaceRegistry().register(TestLexicon.Namespace.PREFIX, TestLexicon.Namespace.URI);
 
-        repoTypeManager = new RepositoryNodeTypeManager(context, true);
+        stub(repository.getExecutionContext()).toReturn(context);
+
+        repoTypeManager = new RepositoryNodeTypeManager(repository, true);
         try {
             this.repoTypeManager.registerNodeTypes(new CndNodeTypeSource(new String[] {"/org/jboss/dna/jcr/jsr_170_builtins.cnd",
                 "/org/jboss/dna/jcr/dna_builtins.cnd"}));

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -31,6 +31,7 @@
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -39,6 +40,7 @@
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -47,6 +49,8 @@
 import org.jboss.dna.jcr.JcrQueryManager.JcrQueryResult;
 import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.dna.jcr.JcrRepository.QueryLanguage;
+import org.jboss.dna.jcr.nodetype.InvalidNodeTypeDefinitionException;
+import org.jboss.security.config.IDTrustConfiguration;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -93,10 +97,22 @@
                      .registerNamespace("car", "http://www.jboss.org/dna/examples/cars/1.0")
                      .addNodeTypes(resourceUrl("cars.cnd"))
                      .setOption(Option.ANONYMOUS_USER_ROLES,
-                                JcrSession.DNA_READ_PERMISSION + "," + JcrSession.DNA_WRITE_PERMISSION);
+                                JcrSession.DNA_READ_PERMISSION + "," + JcrSession.DNA_WRITE_PERMISSION)
+                     .setOption(Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
         engine = configuration.build();
         engine.start();
 
+        // Initialize the JAAS configuration to allow for an admin login later
+        // Initialize IDTrust
+        String configFile = "security/jaas.conf.xml";
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+
+        try {
+            idtrustConfig.config(configFile);
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
+
         // Start the repository ...
         repository = engine.getRepository("cars");
 
@@ -363,4 +379,23 @@
         assertResults(query, result, 1);
         assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
     }
+
+    /*
+     * Adding this test case since its primarily a test of integration between the RNTM and the query engine
+     */
+    @Test( expected = InvalidNodeTypeDefinitionException.class )
+    public void shouldNotAllowUnregisteringUsedPrimaryType() throws Exception {
+        Session adminSession = null;
+
+        try {
+            adminSession = repository.login(new SimpleCredentials("superuser", "superuser".toCharArray()));
+            adminSession.setNamespacePrefix("cars", "http://www.jboss.org/dna/examples/cars/1.0");
+
+            JcrNodeTypeManager nodeTypeManager = (JcrNodeTypeManager)adminSession.getWorkspace().getNodeTypeManager();
+            nodeTypeManager.unregisterNodeType(Collections.singletonList("cars:Car"));
+        } finally {
+            if (adminSession != null) adminSession.logout();
+        }
+    }
+
 }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/WorkspaceLockManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/WorkspaceLockManagerTest.java	2010-01-07 14:47:53 UTC (rev 1551)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/WorkspaceLockManagerTest.java	2010-01-07 18:24:39 UTC (rev 1552)
@@ -65,11 +65,9 @@
         validUuid = UUID.randomUUID();
         validLocation = Location.create(validUuid);
 
-        // Stub out the repository, since we only need a few methods ...
-        repoTypeManager = new RepositoryNodeTypeManager(context, true);
 
         PathFactory pathFactory = context.getValueFactories().getPathFactory();
-        stub(repository.getRepositoryTypeManager()).toReturn(repoTypeManager);
+        stub(repository.getExecutionContext()).toReturn(context);
         stub(repository.getRepositorySourceName()).toReturn(sourceName);
         stub(repository.getPersistentRegistry()).toReturn(context.getNamespaceRegistry());
         stub(repository.createWorkspaceGraph(anyString(), (ExecutionContext)anyObject())).toAnswer(new Answer<Graph>() {
@@ -92,6 +90,11 @@
             }
         });
 
+        // Stub out the repository, since we only need a few methods ...
+        repoTypeManager = new RepositoryNodeTypeManager(repository, true);
+
+        stub(repository.getRepositoryTypeManager()).toReturn(repoTypeManager);
+
         executedRequests.clear();
     }
 


From dna-commits at lists.jboss.org  Thu Jan  7 14:11:35 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 14:11:35 -0500
Subject: [dna-commits] DNA SVN: r1553 - in trunk:
	dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle
	and 5 other directories.
Message-ID: <201001071911.o07JBZxO006600@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-07 14:11:34 -0500 (Thu, 07 Jan 2010)
New Revision: 1553

Added:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
Removed:
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
Log:
DNA-49 Oracle Sequencer/Parser fixes/changes. Cleaned up COMMIT statements & added Create Materialized View

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,7 +24,6 @@
 package org.jboss.dna.test.integration.sequencer.ddl.dialect.oracle;
 
 import static org.junit.Assert.assertEquals;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -39,7 +38,6 @@
 import org.junit.Test;
 
 /**
- * @author blafond
  *
  */
 public class OracleDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
@@ -86,10 +84,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -103,9 +97,8 @@
     
     @Test
     public void shouldSequenceOracleDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "oracle_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "oracle_test_statements.ddl", "shouldSequenceOracleDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -134,7 +127,77 @@
                 }
             }
         }
+    }
+    
+    @Test
+    public void shouldSequenceOracleCreateProceduresAndFunctions() throws Exception {
+
+        uploadFile(resourceFolder, "create_procedure_statements.ddl", "shouldSequenceOracleCreateProceduresAndFunctions");
         
-        System.out.println("FINISHED:  shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(4, numStatements);
+                    
+                    //printNodeProperties(ddlNode);
+                    //remove_emp <ns001:startLineNumber = 1, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression = 
+                    //  CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+                    //    BEGIN
+                    //       DELETE FROM employees
+                    //       WHERE employees.employee_id = remove_emp.employee_id;
+                    //    tot_emps := tot_emps - 1;
+                    //    END;
+                    //    /, ns001:startCharIndex = 0>
+                    // employee_id <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 0, jcr:mixinTypes = ns002:functionParameter, ns001:datatypeScale = 0>
+
+                    Node node = assertNode(ddlNode, "remove_emp", "oracleddl:createProcedureStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    Node paramNode = assertNode(node, "employee_id", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+                    
+                    //find_root <ns001:startLineNumber = 9, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression = 
+                    //    CREATE PROCEDURE find_root ( x IN REAL ) 
+                    //    IS LANGUAGE C
+                    //    NAME c_find_root
+                    //    LIBRARY c_utils
+                    //    PARAMETERS ( x BY REFERENCE );, ns001:startCharIndex = 211>
+                    //     x <ns001:datatypeName = REAL, jcr:primaryType = nt:unstructured, ns002:inOutNoCopy = IN, jcr:mixinTypes = ns002:functionParameter>
+                    node = assertNode(ddlNode, "find_root", "oracleddl:createProcedureStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    paramNode = assertNode(node, "x", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "REAL");
+                    verifySimpleStringProperty(paramNode, "oracleddl:inOutNoCopy", "IN");
+                    
+                    //CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+                    //    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+                    node = assertNode(ddlNode, "SecondMax", "oracleddl:createFunctionStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    paramNode = assertNode(node, "input", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+
+                    //CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+                    //   RETURN NUMBER DETERMINISTIC IS
+                    //    BEGIN 
+                    //      RETURN DBMS_LOB.GETLENGTH(a);
+                    //    END;
+                    ///
+                    node = assertNode(ddlNode, "text_length", "oracleddl:createFunctionStatement");
+                    assertEquals(1, node.getNodes().getSize());
+                    verifySimpleStringProperty(node, "ddl:datatypeName", "NUMBER");
+                    paramNode = assertNode(node, "a", "oracleddl:functionParameter");
+                    verifySimpleStringProperty(paramNode, "ddl:datatypeName", "CLOB");
+                }
+            }
+        }
     }
 }

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,6 +51,7 @@
 [oracleddl:operatorOperand]     > ddl:operand abstract
 [oracleddl:outlineOperand]      > ddl:operand abstract
 [oracleddl:packageOperand]      > ddl:operand abstract
+[oracleddl:parameterOperand]    > ddl:operand abstract
 [oracleddl:pfileOperand]        > ddl:operand abstract
 [oracleddl:procedureOperand]    > ddl:operand abstract
 [oracleddl:profileOperand]      > ddl:operand abstract
@@ -72,7 +73,18 @@
 // =============================================================================
 [oracleddl:columnDefinition] > ddl:columnDefinition
   - oracleddl:dropDefault (boolean)
-  
+
+//
+
+[oracleddl:functionParameter]     > oracleddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - oracleddl:default (STRING)
+  - oracleddl:defaultExpresssion (STRING)
+  - oracleddl:inOutNoCopy (STRING)
+
 // =============================================================================
 // ALTER STATEMENTS
 // =============================================================================
@@ -119,6 +131,11 @@
 [oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
 [oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
 [oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
 [oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
   - oracleddl:tableName (string) mandatory
   - oracleddl:unique (boolean)
@@ -133,6 +150,7 @@
 [oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
 [oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
 [oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
 [oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
 [oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
 [oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+    BEGIN
+       DELETE FROM employees
+       WHERE employees.employee_id = remove_emp.employee_id;
+    tot_emps := tot_emps - 1;
+    END;
+/
+
+CREATE PROCEDURE find_root
+   ( x IN REAL ) 
+   IS LANGUAGE C
+   NAME c_find_root
+   LIBRARY c_utils
+   PARAMETERS ( x BY REFERENCE );
+   
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+   RETURN NUMBER DETERMINISTIC IS
+    BEGIN 
+      RETURN DBMS_LOB.GETLENGTH(a);
+    END;
+/
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -84,7 +84,28 @@
 		static final String[] STMT_ANALYZE = {"ANALYZE"};
 		static final String[] STMT_ASSOCIATE_STATISTICS = {"ASSOCIATE", "STATISTICS"};
 		static final String[] STMT_AUDIT = {"AUDIT"};
-		static final String[] STMT_COMMIT = {"COMMIT"};
+		
+		/*
+                COMMIT [ WORK ] [ [ COMMENT string ]
+                    | [ WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ] ]
+                    | FORCE string [, integer ] ] ;
+                
+                COMMIT WORK COMMENT "some comment"
+                
+                COMMIT COMMENT "some comment"
+                
+                COMMIT WORK WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ]
+                
+                COMMIT WRITE IMMEDIATE NOWAIT;
+                
+                COMMIT WORK WRITE IMMEDIATE NOWAIT;
+                
+                COMMIT FORCE "some string", 10;
+		 */
+		static final String[] STMT_COMMIT_WORK = {"COMMIT", "WORK"};
+		static final String[] STMT_COMMIT_WRITE = {"COMMIT", "WRITE"};
+		static final String[] STMT_COMMIT_FORCE = {"COMMIT", "FORCE"};
+		static final String[] STMT_COMMIT       = {"COMMIT"}; // DON"T REGISTER THIS STMT
 		static final String[] STMT_COMMENT_ON = {"COMMENT", "ON"};
 		
 		static final String[] STMT_CREATE_CLUSTER = {CREATE, "CLUSTER"};
@@ -99,7 +120,8 @@
 		static final String[] STMT_CREATE_INDEXTYPE = {CREATE, "INDEXTYPE"};
 		static final String[] STMT_CREATE_JAVA = {CREATE, "JAVA"};
 		static final String[] STMT_CREATE_LIBRARY = {CREATE, "LIBRARY"}; // PARSE UNTIL '/'
-		static final String[] STMT_CREATE_MATERIALIZED = {CREATE, "MATERIALIZED"};
+		static final String[] STMT_CREATE_MATERIALIZED_VIEW = {CREATE, "MATERIALIZED", "VIEW"};
+		static final String[] STMT_CREATE_MATERIALIZED_VEIW_LOG = {CREATE, "MATERIALIZED", "VIEW", "LOG"};
 		static final String[] STMT_CREATE_OPERATOR = {CREATE, "OPERATOR"};
 		static final String[] STMT_CREATE_OR_REPLACE_DIRECTORY = {CREATE, "OR", "REPLACE", "DIRECTORY"};    // PARSE UNTIL '/'
 		static final String[] STMT_CREATE_OR_REPLACE_FUNCTION = {CREATE, "OR", "REPLACE", "FUNCTION"};    // PARSE UNTIL '/'
@@ -108,6 +130,7 @@
 		static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_OUTLINE = {CREATE,"OR", "REPLACE", "PUBLIC", "OUTLINE"}; // TODO: BML
 		static final String[] STMT_CREATE_OR_REPLACE_PRIVATE_OUTLINE = {CREATE,"OR", "REPLACE", "PRIVATE", "OUTLINE"}; // TODO: BML
 		static final String[] STMT_CREATE_OR_REPLACE_PACKAGE = {CREATE,"OR", "REPLACE", "PACKAGE"};
+		static final String[] STMT_CREATE_OR_REPLACE_PROCEDURE = {CREATE,"OR", "REPLACE", "PROCEDURE"}; // PARSE UNTIL '/'
 		static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM = {CREATE, "OR", "REPLACE", "PUBLIC", "SYNONYM"};
 		static final String[] STMT_CREATE_OR_REPLACE_SYNONYM = {CREATE, "OR", "REPLACE", "SYNONYM"};
 		static final String[] STMT_CREATE_OR_REPLACE_TRIGGER = {CREATE, "OR", "REPLACE", "TRIGGER"}; // PARSE UNTIL '/
@@ -135,24 +158,29 @@
 		public static final String[][] CREATE_PHRASES = {
 			STMT_CREATE_CLUSTER, STMT_CREATE_CONTEXT, STMT_CREATE_CONTROLFILE, STMT_CREATE_DATABASE, STMT_CREATE_DIMENSION, 
 			STMT_CREATE_DIRECTORY, STMT_CREATE_DISKGROUP, STMT_CREATE_FUNCTION, STMT_CREATE_INDEX, STMT_CREATE_INDEXTYPE, 
-			STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED, STMT_CREATE_OPERATOR, STMT_CREATE_OR_REPLACE_DIRECTORY, 
-			STMT_CREATE_OR_REPLACE_OUTLINE,
-			STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM,
+			STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED_VIEW, STMT_CREATE_MATERIALIZED_VEIW_LOG, STMT_CREATE_OPERATOR, 
+			STMT_CREATE_OR_REPLACE_DIRECTORY, STMT_CREATE_OR_REPLACE_FUNCTION, STMT_CREATE_LIBRARY,
+            STMT_CREATE_OR_REPLACE_LIBRARY, STMT_CREATE_OR_REPLACE_OUTLINE, STMT_CREATE_OR_REPLACE_PROCEDURE,
+			STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM, STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
 			STMT_CREATE_OR_REPLACE_TYPE, STMT_CREATE_OUTLINE, STMT_CREATE_PACKAGE, STMT_CREATE_PFILE, STMT_CREATE_PROCEDURE, 
 			STMT_CREATE_PROFILE, STMT_CREATE_PUBLIC_DATABASE, STMT_CREATE_PUBLIC_ROLLBACK, STMT_CREATE_PUBLIC_SYNONYM, STMT_CREATE_ROLE,
-			STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE, 
+			STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE, STMT_CREATE_TRIGGER, 
 			STMT_CREATE_TYPE, STMT_CREATE_USER, STMT_CREATE_UNIQUE_INDEX, STMT_CREATE_BITMAP_INDEX,
 			STMT_CREATE_TABLESPACE, STMT_CREATE_PROCEDURE
 		};
 		
-		public static final String[][] IGNORABLE_CREATE_PHRASES_WITH_SLASHES = {
-			STMT_CREATE_LIBRARY, STMT_CREATE_OR_REPLACE_FUNCTION,
-			STMT_CREATE_OR_REPLACE_LIBRARY,
-			STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
-			STMT_CREATE_TRIGGER
-		};
+	      static final String[][] SLASHED_STMT_PHRASES = {
+	          STMT_CREATE_FUNCTION, 
+	          STMT_CREATE_LIBRARY, 
+	          STMT_CREATE_OR_REPLACE_DIRECTORY, 
+	          STMT_CREATE_OR_REPLACE_FUNCTION,
+	          STMT_CREATE_OR_REPLACE_LIBRARY, 
+	          STMT_CREATE_OR_REPLACE_PROCEDURE, 
+	          STMT_CREATE_OR_REPLACE_TRIGGER,
+	          STMT_CREATE_PACKAGE, 
+	          STMT_CREATE_PROCEDURE
+	        };
 		
-		
 		static final String[] STMT_DISASSOCIATE_STATISTICS = {"DISASSOCIATE", "STATISTICS"};
 		
 		static final String[] STMT_DROP_CLUSTER = {DROP, "CLUSTER"};
@@ -214,7 +242,8 @@
 		};
 		
 		static final String[][] MISC_PHRASES = {
-			STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT, STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
+			STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT_WORK, STMT_COMMIT_WRITE, STMT_COMMIT_FORCE, 
+			STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
 			STMT_EXPLAIN_PLAN, STMT_FLASHBACK, STMT_LOCK_TABLE, STMT_MERGE, STMT_NOAUDIT, STMT_PURGE, 
 			STMT_RENAME, STMT_ROLLBACK_TO_SAVEPOINT, STMT_ROLLBACK_WORK, STMT_ROLLBACK, STMT_SAVEPOINT, STMT_TRUNCATE
 		};

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,7 +51,8 @@
     public static final Name TYPE_CREATE_INDEXTYPE_STATEMENT 		= new BasicName(Namespace.URI, "createIndextypeStatement");
     public static final Name TYPE_CREATE_JAVA_STATEMENT 			= new BasicName(Namespace.URI, "createJavaStatement");
     public static final Name TYPE_CREATE_LIBRARY_STATEMENT 			= new BasicName(Namespace.URI, "createLibraryStatement");
-    public static final Name TYPE_CREATE_MATERIALIZED_STATEMENT 	= new BasicName(Namespace.URI, "createMaterializedStatement");
+    public static final Name TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT 	      = new BasicName(Namespace.URI, "createMaterializedViewStatement");
+    public static final Name TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT      = new BasicName(Namespace.URI, "createMaterializedViewLogStatement");
     public static final Name TYPE_CREATE_OPERATOR_STATEMENT 		= new BasicName(Namespace.URI, "createOperatorStatement");
     public static final Name TYPE_CREATE_OUTLINE_STATEMENT 			= new BasicName(Namespace.URI, "createOutlineStatement");
     public static final Name TYPE_CREATE_PACKAGE_STATEMENT 			= new BasicName(Namespace.URI, "createPackageStatement");
@@ -149,13 +150,19 @@
     
     public static final Name TYPE_RENAME_COLUMN 					= new BasicName(Namespace.URI, "renameColumn");
     public static final Name TYPE_RENAME_CONSTRAINT 				= new BasicName(Namespace.URI, "renameConstraint");
+    public static final Name TYPE_FUNCTION_PARAMETER                = new BasicName(Namespace.URI, "functionParameter");
 
     // PROPERTY NAMES
     public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");
     public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName");
-    public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
-    public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique");
-    public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap");
-    public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName");
+    public static final Name COMMENT            = new BasicName(Namespace.URI, "comment");
+    public static final Name UNIQUE_INDEX       = new BasicName(Namespace.URI, "unique");
+    public static final Name BITMAP_INDEX       = new BasicName(Namespace.URI, "bitmap");
+    public static final Name TABLE_NAME         = new BasicName(Namespace.URI, "tableName");
+    public static final Name DEFAULT            = new BasicName(Namespace.URI, "default");
+    public static final Name DEFAULT_EXPRESSION = new BasicName(Namespace.URI, "defaultExpression");
+    public static final Name IN_OUT_NO_COPY     = new BasicName(Namespace.URI, "inOutNoCopy");
+    public static final Name AUTHID_VALUE       = new BasicName(Namespace.URI, "authIdValue");
+    
 
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,20 +24,18 @@
 package org.jboss.dna.sequencer.ddl.dialect.oracle;
 
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_OPTION_TYPE;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
 import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
 import static org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon.*;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
 import java.util.ArrayList;
 import java.util.List;
 import org.jboss.dna.common.text.ParsingException;
@@ -101,7 +99,6 @@
         registerStatementStartPhrase(ALTER_PHRASES);
         registerStatementStartPhrase(CREATE_PHRASES);
         registerStatementStartPhrase(DROP_PHRASES);
-        registerStatementStartPhrase(IGNORABLE_CREATE_PHRASES_WITH_SLASHES);
         registerStatementStartPhrase(MISC_PHRASES);
         registerStatementStartPhrase(SET_PHRASES);
     }
@@ -112,29 +109,17 @@
         assert tokens != null;
         assert rootNode != null;
 
-        // We may hava a prepare statement that is followed by a missing terminator node
+        // We may have a prepare statement that is followed by a missing terminator node
         // We also may have nodes that have an extra terminator node representing the '/' backslash
         // These nodes will have type "TYPE_BACKSLASH_TERMINATOR".
 
         List<AstNode> copyOfNodes = new ArrayList<AstNode>(rootNode.getChildren());
-        AstNode prepareNode = null;
+
         AstNode complexNode = null;
-        boolean mergeNextStatement = false;
+
         for (AstNode child : copyOfNodes) {
 
-            if (prepareNode != null && mergeNextStatement) {
-                mergeNodes(tokens, prepareNode, child);
-                rootNode.removeChild(child);
-                prepareNode = null;
-            }
 
-            if (prepareNode != null && nodeFactory().hasMixinType(child, TYPE_MISSING_TERMINATOR)) {
-                mergeNextStatement = true;
-            } else {
-                prepareNode = null;
-                mergeNextStatement = false;
-            }
-
             if ((complexNode != null && nodeFactory().hasMixinType(child, TYPE_UNKNOWN_STATEMENT))
                 || (complexNode != null && nodeFactory().hasMixinType(child, TYPE_BACKSLASH_TERMINATOR))) {
                 mergeNodes(tokens, complexNode, child);
@@ -143,16 +128,13 @@
                 complexNode = null;
             }
 
-            if (nodeFactory().hasMixinType(child, TYPE_PREPARE_STATEMENT)) {
-                prepareNode = child;
-                complexNode = null;
-            } else if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
+
+            if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_TRIGGER_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_LIBRARY_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_PACKAGE_STATEMENT)
                        || nodeFactory().hasMixinType(child, TYPE_CREATE_PROCEDURE_STATEMENT)) {
                 complexNode = child;
-                prepareNode = null;
             }
         }
 
@@ -249,7 +231,7 @@
             return parseStatement(tokens, STMT_ASSOCIATE_STATISTICS, parentNode, TYPE_ASSOCIATE_STATISTICS_STATEMENT);
         } else if (tokens.matches(STMT_AUDIT)) {
             return parseStatement(tokens, STMT_AUDIT, parentNode, TYPE_AUDIT_STATEMENT);
-        } else if (tokens.matches(STMT_COMMIT)) {
+        } else if (tokens.matches(STMT_COMMIT_FORCE) || tokens.matches(STMT_COMMIT_WORK) || tokens.matches(STMT_COMMIT_WRITE)) {
             return parseStatement(tokens, STMT_COMMIT, parentNode, TYPE_COMMIT_STATEMENT);
         } else if (tokens.matches(STMT_DISASSOCIATE_STATISTICS)) {
             return parseStatement(tokens, STMT_DISASSOCIATE_STATISTICS, parentNode, TYPE_DISASSOCIATE_STATISTICS_STATEMENT);
@@ -314,10 +296,10 @@
             return parseStatement(tokens, STMT_CREATE_DISKGROUP, parentNode, TYPE_CREATE_DISKGROUP_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_FUNCTION)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_FUNCTION
-            return parseStatement(tokens, STMT_CREATE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+            return parseCreateFunctionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_OR_REPLACE_FUNCTION)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_OR_REPLACE_FUNCTION
-            return parseStatement(tokens, STMT_CREATE_OR_REPLACE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+            return parseCreateFunctionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_INDEXTYPE)) {
             return parseStatement(tokens, STMT_CREATE_INDEXTYPE, parentNode, TYPE_CREATE_INDEXTYPE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_JAVA)) {
@@ -328,8 +310,8 @@
         } else if (tokens.matches(STMT_CREATE_OR_REPLACE_LIBRARY)) {
             // ============ > PARSE UNTIL '/' STMT_CREATE_OR_REPLACE_LIBRARY
             return parseStatement(tokens, STMT_CREATE_OR_REPLACE_LIBRARY, parentNode, TYPE_CREATE_LIBRARY_STATEMENT);
-        } else if (tokens.matches(STMT_CREATE_MATERIALIZED)) {
-            return parseStatement(tokens, STMT_CREATE_MATERIALIZED, parentNode, TYPE_CREATE_MATERIALIZED_STATEMENT);
+        } else if (tokens.matches(STMT_CREATE_MATERIALIZED_VIEW)) {
+            return parseMaterializedViewStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_OPERATOR)) {
             return parseStatement(tokens, STMT_CREATE_OPERATOR, parentNode, TYPE_CREATE_OPERATOR_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_OUTLINE)) {
@@ -346,7 +328,10 @@
             return parseStatement(tokens, STMT_CREATE_PFILE, parentNode, TYPE_CREATE_PFILE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
             // ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
-            return parseStatement(tokens, STMT_CREATE_PROCEDURE, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+            return parseCreateProcedureStatement(tokens, parentNode);
+        } else if (tokens.matches(STMT_CREATE_OR_REPLACE_PROCEDURE)) {
+            // ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
+            return parseCreateProcedureStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_PROFILE)) {
             return parseStatement(tokens, STMT_CREATE_PROFILE, parentNode, TYPE_CREATE_PROFILE_STATEMENT);
         } else if (tokens.matches(STMT_CREATE_ROLE)) {
@@ -413,7 +398,263 @@
 
         return node;
     }
+    
+    /**
+     * Parses DDL CREATE FUNCTION statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE FUNCTION statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateFunctionStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
 
+        markStartOfStatement(tokens);
+        
+        /* ----------------------------------------------------------------------
+            CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name
+              [ ( parameter_declaration [, parameter_declaration] ) 
+              ]
+              RETURN datatype
+              [ { invoker_rights_clause
+                | DETERMINISTIC
+                | parallel_enable_clause
+                | result_cache_clause
+                }...
+              ]
+              { { AGGREGATE | PIPELINED }
+                USING [ schema. ] implementation_type
+              | [ PIPELINED ] { IS | AS } { [ declare_section ] body | call_spec }
+              } ;
+            
+            parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        ---------------------------------------------------------------------- */
+        
+        boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_FUNCTION);
+        
+        tokens.canConsume(STMT_CREATE_FUNCTION);
+
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+        
+        if (isReplace) {
+            // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+        }
+        
+        boolean ok = parseParameters(tokens, node);
+        
+        if( ok ) {
+            if( tokens.canConsume("RETURN")) {
+                DataType dType = getDatatypeParser().parse(tokens);
+                if( dType != null ) {
+                    getDatatypeParser().setPropertiesOnNode(node, dType);
+                }
+            }
+        }
+        
+        parseUntilFwdSlash(tokens, false);
+        
+        tokens.canConsume("/");
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE PROCEDURE statement
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE PROCEDURE statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateProcedureStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        /* ----------------------------------------------------------------------
+            CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
+                [ ( parameter_declaration [, parameter_declaration ] ) ]
+                [ AUTHID { CURRENT_USER | DEFINER  ]
+                { IS | AS }
+                { [ declare_section ] body | call_spec | EXTERNAL} ;
+            
+             call_spec = LANGUAGE { Java_declaration | C_declaration }
+            
+             Java_declaration = JAVA NAME string
+            
+             C_declaration = 
+                C [ NAME name ]
+                    LIBRARY lib_name
+                    [ AGENT IN (argument[, argument ]...) ]
+                    [ WITH CONTEXT ]
+                    [ PARAMETERS (parameter[, parameter ]...) ]
+                    
+            parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        ---------------------------------------------------------------------- */
+        
+        boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_PROCEDURE);
+        
+        tokens.canConsume(STMT_CREATE_PROCEDURE);
+
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+
+        if (isReplace) {
+            // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+        }
+        
+        boolean ok = parseParameters(tokens, node);
+        
+        if( ok ) {
+            if( tokens.canConsume("AUTHID")) {
+                if( tokens.canConsume("CURRENT_USER")) {
+                    node.setProperty(AUTHID_VALUE, "AUTHID CURRENT_USER");
+                } else {
+                    tokens.consume("DEFINER");
+                    node.setProperty(AUTHID_VALUE, "DEFINER");
+                }
+            }
+        }
+        
+        parseUntilFwdSlash(tokens, false);
+        
+        tokens.canConsume("/");
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+    
+    
+    private boolean parseParameters( DdlTokenStream tokens, AstNode procedureNode) throws ParsingException {
+        assert tokens != null;
+        assert procedureNode != null;
+
+        //  parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+        // Assume we start with open parenthesis '(', then we parse comma separated list of function parameters
+        // which have the form:  [ parameter-Name ] DataType
+        // So, try getting datatype, if datatype == NULL, then parseName() & parse datatype, then repeat as long as next token is ","
+        
+        tokens.consume(L_PAREN); // EXPECTED
+
+        while (!tokens.canConsume(R_PAREN)) {
+
+            String paramName = parseName(tokens);
+            String inOutStr = null;
+            if( tokens.matches("IN")) {
+                if( tokens.canConsume("IN", "OUT")){
+                    if( tokens.canConsume("NOCOPY")) {
+                        inOutStr = "IN OUT NOCOPY";
+                    } else {
+                        inOutStr = "IN OUT";
+                    }
+                } else {
+                    tokens.consume("IN");
+                    inOutStr = "IN";
+                }
+                
+            } else if( tokens.matches("OUT")) {
+                if( tokens.canConsume("OUT", "NOCOPY")) {
+                    inOutStr = "OUT NOCOPY";
+                } else {
+                    tokens.consume("OUT");
+                    inOutStr = "OUT";
+                }
+            }
+            
+            DataType datatype = getDatatypeParser().parse(tokens);
+            AstNode paramNode = nodeFactory().node(paramName, procedureNode, TYPE_FUNCTION_PARAMETER);
+            if( datatype != null ) {
+                getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+            }
+            
+            if( tokens.matchesAnyOf(":=", "DEFAULT") || !tokens.matchesAnyOf(COMMA, R_PAREN)) {
+                String msg = DdlSequencerI18n.unsupportedProcedureParameterDeclaration.text(procedureNode.getProperty(StandardDdlLexicon.NAME));
+                DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
+                addProblem(problem, procedureNode);
+                return false;
+            }
+            
+            if( inOutStr != null ) {
+                paramNode.setProperty(IN_OUT_NO_COPY, inOutStr);
+            }
+
+            tokens.canConsume(COMMA);
+        }
+        
+        return true;
+    }
+    
+    /**
+     * Parses DDL CREATE MATERIALIZED VIEW statement
+     * 
+     * This could either be a standard view or a VIEW LOG ON statement.
+     * 
+     * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed CREATE MATERIALIZED VIEW statement node
+     * @throws ParsingException
+     */
+    protected AstNode parseMaterializedViewStatement( DdlTokenStream tokens,
+                                        AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+
+        markStartOfStatement(tokens);
+        
+        /* ----------------------------------------------------------------------
+            CREATE MATERIALIZED VIEW
+              [ schema. ]materialized_view
+              [ column_alias [, column_alias]... ]
+              [ OF [ schema. ]object_type ] .................... (MORE...)
+
+            EXAMPLES:
+            
+                CREATE MATERIALIZED VIEW LOG ON products
+                   WITH ROWID, SEQUENCE (prod_id)
+                   INCLUDING NEW VALUES;
+                
+                CREATE MATERIALIZED VIEW sales_mv
+                   BUILD IMMEDIATE
+                   REFRESH FAST ON COMMIT
+                   AS SELECT t.calendar_year, p.prod_id, 
+                      SUM(s.amount_sold) AS sum_sales
+                      FROM times t, products p, sales s
+                      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id
+                      GROUP BY t.calendar_year, p.prod_id;
+        ---------------------------------------------------------------------- */
+        
+        boolean isLog = tokens.canConsume(STMT_CREATE_MATERIALIZED_VEIW_LOG);
+        
+        tokens.canConsume(STMT_CREATE_MATERIALIZED_VIEW);
+
+        String name = parseName(tokens);
+
+        AstNode node = null;
+        
+        if( isLog ) {
+            node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT);
+        } else {
+            node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT);
+        }
+        
+        parseUntilTerminator(tokens);
+        
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+
+    
     @Override
     protected AstNode parseGrantStatement( DdlTokenStream tokens,
                                            AstNode parentNode ) throws ParsingException {
@@ -1192,7 +1433,7 @@
 
         // TODO: Oracle has changed some things between versions 9i, and 10/11,
         // Basically they've added column properties (i.e. SORT option, ENCRYPT encryption_spec)
-        // Need to 1) Override parseColumnDefinition to handle these.
+        // Need to 1) Override parseColumnDefinition shouldParseOracleProceduresAndFunctionsto handle these.
 
         String tableElementString = getTableElementsString(tokens, false);
 
@@ -1265,17 +1506,32 @@
                                        boolean stopAtStatementStart ) throws ParsingException {
         StringBuffer sb = new StringBuffer();
         if (stopAtStatementStart) {
-            while (tokens.hasNext() && !tokens.matches(DdlTokenizer.STATEMENT_KEY) && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
+            while (tokens.hasNext() 
+                    
+                    && !tokens.matches(DdlTokenizer.STATEMENT_KEY) 
+                    && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
                 // &&
                 sb.append(SPACE).append(tokens.consume());
             }
         } else {
-            while (tokens.hasNext() && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
+            while (tokens.hasNext() 
+                    && !isFwdSlashedStatement(tokens)
+                    && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
                 sb.append(SPACE).append(tokens.consume());
             }
         }
         return sb.toString();
     }
+    
+    private boolean isFwdSlashedStatement( DdlTokenStream tokens ) throws ParsingException {
+        for(int i=0; i< SLASHED_STMT_PHRASES.length; i++ ) {
+            if( tokens.matches(SLASHED_STMT_PHRASES[i])) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
 
     private void consumeSlash( DdlTokenStream tokens ) throws ParsingException {
         tokens.canConsume("/");

Modified: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties	2010-01-07 19:11:34 UTC (rev 1553)
@@ -30,4 +30,5 @@
 unusedTokensParsingColumnDefinition = The following unused tokens were found parsing a column definition for table: {0}.
 alterTableOptionNotFound = ALTER TABLE Option not found. Check your DDL for incomplete statement near line {0}, column {1} 
 unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create index statement: {0}.
-missingReturnTypeForFunction = The function {0} is missing a return data type.
\ No newline at end of file
+missingReturnTypeForFunction = The function {0} is missing a return data type.
+unsupportedProcedureParameterDeclaration  = The procedure {0} contains parameters with unsupported expression info.
\ No newline at end of file

Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -1,202 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- 
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[oracleddl:clusterOperand]      > ddl:operand abstract
-[oracleddl:commentOperand]      > ddl:operand abstract
-[oracleddl:contextOperand]      > ddl:operand abstract
-[oracleddl:controlfileOperand]  > ddl:operand abstract
-[oracleddl:databaseOperand]     > ddl:operand abstract
-[oracleddl:dimensionOperand]    > ddl:operand abstract
-[oracleddl:directoryOperand]    > ddl:operand abstract
-[oracleddl:diskgroupOperand]    > ddl:operand abstract
-[oracleddl:functionOperand]     > ddl:operand abstract
-[oracleddl:indexOperand]        > ddl:operand abstract
-[oracleddl:indextypeOperand]    > ddl:operand abstract
-[oracleddl:javaOperand]         > ddl:operand abstract
-[oracleddl:libraryOperand]      > ddl:operand abstract
-[oracleddl:materializedOperand] > ddl:operand abstract
-[oracleddl:operatorOperand]     > ddl:operand abstract
-[oracleddl:outlineOperand]      > ddl:operand abstract
-[oracleddl:packageOperand]      > ddl:operand abstract
-[oracleddl:pfileOperand]        > ddl:operand abstract
-[oracleddl:procedureOperand]    > ddl:operand abstract
-[oracleddl:profileOperand]      > ddl:operand abstract
-[oracleddl:resourceOperand]     > ddl:operand abstract
-[oracleddl:roleOperand]         > ddl:operand abstract
-[oracleddl:rollbackOperand]     > ddl:operand abstract
-[oracleddl:sequenceOperand]     > ddl:operand abstract
-[oracleddl:sessionOperand]      > ddl:operand abstract
-[oracleddl:spfileOperand]       > ddl:operand abstract
-[oracleddl:systemOperand]       > ddl:operand abstract
-[oracleddl:synonymOperand]      > ddl:operand abstract
-[oracleddl:tablespaceOperand]   > ddl:operand abstract
-[oracleddl:triggerOperand]      > ddl:operand abstract
-[oracleddl:typeOperand]         > ddl:operand abstract
-[oracleddl:userOperand]         > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[oracleddl:columnDefinition] > ddl:columnDefinition
-  - oracleddl:dropDefault (boolean)
-  
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
-[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
-[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
-[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
-[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
-
-[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
-  - oracleddl:newTableName (STRING)
-  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
-  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
-[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
-  - oracleddl:tableName (string) mandatory
-  - oracleddl:unique (boolean)
-  - oracleddl:bitmap (boolean)
-  + * (ddl:columnReference) = ddl:columnReference multiple
-[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
-[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
-[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[oracleddl:analyzeStatement]         > ddl:statement mixin
-[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:auditStatement]           > ddl:statement mixin
-[oracleddl:commitStatement]          > ddl:statement mixin
-[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
-  - oracleddl:targetObjectType (STRING) mandatory
-  - oracleddl:targetObjectName (STRING)
-  - oracleddl:comment (STRING) mandatory
-[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
-[oracleddl:explainPlanStatement]     > ddl:statement mixin
-[oracleddl:flashbackStatement]       > ddl:statement mixin
-[oracleddl:lockTableStatement]       > ddl:statement mixin
-[oracleddl:mergeStatement]           > ddl:statement mixin
-[oracleddl:nestedTableStatement]     > ddl:statement mixin
-[oracleddl:noauditStatement]         > ddl:statement mixin
-[oracleddl:purgeStatement]           > ddl:statement mixin
-[oracleddl:renameStatement]          > ddl:statement mixin
-[oracleddl:revokeStatement]          > ddl:statement mixin
-[oracleddl:rollbackStatement]        > ddl:statement mixin
-[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
-[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
-[oracleddl:truncateStatement]        > ddl:statement mixin

Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,220 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+ 
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[oracleddl:clusterOperand]      > ddl:operand abstract
+[oracleddl:commentOperand]      > ddl:operand abstract
+[oracleddl:contextOperand]      > ddl:operand abstract
+[oracleddl:controlfileOperand]  > ddl:operand abstract
+[oracleddl:databaseOperand]     > ddl:operand abstract
+[oracleddl:dimensionOperand]    > ddl:operand abstract
+[oracleddl:directoryOperand]    > ddl:operand abstract
+[oracleddl:diskgroupOperand]    > ddl:operand abstract
+[oracleddl:functionOperand]     > ddl:operand abstract
+[oracleddl:indexOperand]        > ddl:operand abstract
+[oracleddl:indextypeOperand]    > ddl:operand abstract
+[oracleddl:javaOperand]         > ddl:operand abstract
+[oracleddl:libraryOperand]      > ddl:operand abstract
+[oracleddl:materializedOperand] > ddl:operand abstract
+[oracleddl:operatorOperand]     > ddl:operand abstract
+[oracleddl:outlineOperand]      > ddl:operand abstract
+[oracleddl:packageOperand]      > ddl:operand abstract
+[oracleddl:parameterOperand]    > ddl:operand abstract
+[oracleddl:pfileOperand]        > ddl:operand abstract
+[oracleddl:procedureOperand]    > ddl:operand abstract
+[oracleddl:profileOperand]      > ddl:operand abstract
+[oracleddl:resourceOperand]     > ddl:operand abstract
+[oracleddl:roleOperand]         > ddl:operand abstract
+[oracleddl:rollbackOperand]     > ddl:operand abstract
+[oracleddl:sequenceOperand]     > ddl:operand abstract
+[oracleddl:sessionOperand]      > ddl:operand abstract
+[oracleddl:spfileOperand]       > ddl:operand abstract
+[oracleddl:systemOperand]       > ddl:operand abstract
+[oracleddl:synonymOperand]      > ddl:operand abstract
+[oracleddl:tablespaceOperand]   > ddl:operand abstract
+[oracleddl:triggerOperand]      > ddl:operand abstract
+[oracleddl:typeOperand]         > ddl:operand abstract
+[oracleddl:userOperand]         > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[oracleddl:columnDefinition] > ddl:columnDefinition
+  - oracleddl:dropDefault (boolean)
+
+//
+
+[oracleddl:functionParameter]     > oracleddl:parameterOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  - oracleddl:default (STRING)
+  - oracleddl:defaultExpresssion (STRING)
+  - oracleddl:inOutNoCopy (STRING)
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[oracleddl:alterClusterStatement]       > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:alterDatabaseStatement]      > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:alterDimensionStatement]     > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:alterDiskgroupStatement]     > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:alterFunctionStatement]      > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:alterIndexStatement]         > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:alterIndextypeStatement]     > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:alterJavaStatement]          > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:alterMaterializedStatement]  > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:alterOperatorStatement]      > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:alterOutlineStatement]       > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:alterPackageStatement]       > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:alterProcedureStatement]     > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:alterProfileStatement]       > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:alterResourceStatement]      > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
+[oracleddl:alterRoleStatement]          > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:alterRollbackStatement]      > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:alterSequenceStatement]      > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:alterSessionStatement]       > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
+[oracleddl:alterSystemStatement]        > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
+[oracleddl:alterTablespaceStatement]    > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:alterTriggerStatement]       > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:alterTypeStatement]          > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:alterUserStatement]          > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
+[oracleddl:alterViewStatement]          > ddl:alterable, ddl:statement,       ddl:viewOperand mixin
+
+[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
+  - oracleddl:newTableName (STRING)
+  + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
+  + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[oracleddl:createClusterStatement]      > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:createContextStatement]      > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:createControlfileStatement]  > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
+[oracleddl:createDatabaseStatement]     > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:createDimensionStatement]    > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:createDirectoryStatement]    > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:createDiskgroupStatement]    > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:createFunctionStatement]     > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+  - ddl:datatypeName (STRING) mandatory
+  - ddl:datatypeLength (LONG)
+  - ddl:datatypePrecision (LONG)
+  - ddl:datatypeScale (LONG)
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createIndexStatement]        > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
+  - oracleddl:tableName (string) mandatory
+  - oracleddl:unique (boolean)
+  - oracleddl:bitmap (boolean)
+  + * (ddl:columnReference) = ddl:columnReference multiple
+[oracleddl:createIndexTypeStatement]    > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:createJavaStatement]         > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:createLibraryStatement]      > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:createOperatorStatement]     > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:createOutlineStatement]      > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:createPackageStatement]      > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:createPfileStatement]        > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
+[oracleddl:createProcedureStatement]    > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+  + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createRoleStatement]         > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:createRollbackStatement]     > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:createSequenceStatement]     > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:createSpfileStatement]       > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
+[oracleddl:createSynonymStatement]      > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:createTablespaceStatement]   > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:createTriggerStatement]      > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:createTypeStatement]         > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:createUserStatement]         > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[oracleddl:dropClusterStatement]        > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:dropContextStatement]        > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:dropDatabaseStatement]       > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:dropDimensionStatement]      > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:dropDirectoryStatement]      > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:dropDiskgroupStatement]      > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:dropFunctionStatement]       > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:dropIndexStatement]          > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:dropIndextypeStatement]      > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:dropJavaStatement]           > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:dropLibraryStatement]        > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:dropMaterializedStatement]   > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:dropOperatorStatement]       > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:dropOutlineStatement]        > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:dropPackageStatement]        > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:dropProcedureStatement]      > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:dropProfileStatement]        > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:dropRoleStatement]           > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:dropRollbackStatement]       > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:dropSequenceStatement]       > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:dropSynonymStatement]        > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:dropTablespaceStatement]     > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:dropTriggerStatement]        > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:dropTypeStatement]           > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:dropUserStatement]           > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[oracleddl:analyzeStatement]         > ddl:statement mixin
+[oracleddl:associateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:auditStatement]           > ddl:statement mixin
+[oracleddl:commitStatement]          > ddl:statement mixin
+[oracleddl:commentOnStatement]       > ddl:statement, oracleddl:commentOperand mixin
+  - oracleddl:targetObjectType (STRING) mandatory
+  - oracleddl:targetObjectName (STRING)
+  - oracleddl:comment (STRING) mandatory
+[oracleddl:disassociateStatisticsStatement]     > ddl:statement mixin
+[oracleddl:explainPlanStatement]     > ddl:statement mixin
+[oracleddl:flashbackStatement]       > ddl:statement mixin
+[oracleddl:lockTableStatement]       > ddl:statement mixin
+[oracleddl:mergeStatement]           > ddl:statement mixin
+[oracleddl:nestedTableStatement]     > ddl:statement mixin
+[oracleddl:noauditStatement]         > ddl:statement mixin
+[oracleddl:purgeStatement]           > ddl:statement mixin
+[oracleddl:renameStatement]          > ddl:statement mixin
+[oracleddl:revokeStatement]          > ddl:statement mixin
+[oracleddl:rollbackStatement]        > ddl:statement mixin
+[oracleddl:setConstraintsStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:setRoleStatement]         > ddl:statement, ddl:settable mixin
+[oracleddl:setTransactionStatement]  > ddl:statement, ddl:settable mixin
+[oracleddl:truncateStatement]        > ddl:statement mixin


Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-07 19:11:34 UTC (rev 1553)
@@ -303,6 +303,95 @@
 		assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_FUNCTION_STATEMENT));
     }
     
+    @Test
+    public void shouldParseCreateProcedure_1() {
+        printTest("shouldParseCreateProcedure_1()");
+        String content = "CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;" + NEWLINE
+                               + "BEGIN" + NEWLINE
+                               + "   DELETE FROM employees" + NEWLINE
+                               + "   WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+                               + "tot_emps := tot_emps - 1;" + NEWLINE
+                               + "END;" + NEWLINE
+                               + "/";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseCreateProcedure_2() {
+        printTest("shouldParseCreateProcedure_2()");
+        String content = "CREATE OR REPLACE PROCEDURE add_emp (employee_id NUMBER, employee_age NUMBER) AS tot_emps NUMBER;" + NEWLINE
+                               + "BEGIN" + NEWLINE
+                               + "   INSERT INTO employees" + NEWLINE
+                               + "   WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+                               + "tot_emps := tot_emps + 1;" + NEWLINE
+                               + "END;" + NEWLINE
+                               + "/";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+        assertEquals(2, childNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseOracleProceduresAndFunctions() {
+        printTest("shouldParseOracleProceduresAndFunctions()");
+        String content = getFileContent(DDL_FILE_PATH + "create_procedure_statements.ddl");
+
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(4, rootNode.getChildCount());
+    }
+    
+    @Test
+    public void shouldParseCreateMaterializedView() {
+        setPrintToConsole(true);
+        parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateMaterializedView()");
+        String content = " CREATE MATERIALIZED VIEW sales_mv" + NEWLINE
+                                + "BUILD IMMEDIATE" + NEWLINE
+                                + "REFRESH FAST ON COMMIT" + NEWLINE
+                                + "AS SELECT t.calendar_year, p.prod_id, " + NEWLINE
+                                + "   SUM(s.amount_sold) AS sum_sales" + NEWLINE
+                                + "   FROM times t, products p, sales s" + NEWLINE
+                                + "   WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id" + NEWLINE
+                                + "   GROUP BY t.calendar_year, p.prod_id;" + NEWLINE;
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT));
+    }
+    
+    @Test
+    public void shouldParseCreateMaterializedViewLog() {
+        setPrintToConsole(true);
+        parser.setTestMode(isPrintToConsole());
+        printTest("shouldParseCreateMaterializedViewLog()");
+        String content = "CREATE MATERIALIZED VIEW LOG ON products" + NEWLINE
+                                + "WITH ROWID, SEQUENCE (prod_id)" + NEWLINE
+                                + "INCLUDING NEW VALUES;";
+        
+        boolean success = parser.parse(content, rootNode);
+        
+        assertEquals(true, success);
+        assertEquals(1, rootNode.getChildCount());
+        AstNode childNode = rootNode.getChildren().get(0);
+        assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT));
+    }
+    
 	@Test
 	public void shouldParseOracleStatements_1() {
 		printTest("shouldParseOracleStatements_1()");

Added: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl	                        (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+    BEGIN
+       DELETE FROM employees
+       WHERE employees.employee_id = remove_emp.employee_id;
+    tot_emps := tot_emps - 1;
+    END;
+/
+
+CREATE PROCEDURE find_root
+   ( x IN REAL ) 
+   IS LANGUAGE C
+   NAME c_find_root
+   LIBRARY c_utils
+   PARAMETERS ( x BY REFERENCE );
+   
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB) 
+   RETURN NUMBER DETERMINISTIC IS
+    BEGIN 
+      RETURN DBMS_LOB.GETLENGTH(a);
+    END;
+/
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl	2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl	2010-01-07 19:11:34 UTC (rev 1553)
@@ -72,7 +72,7 @@
 
 COMMIT WORK; 
 
-COMMIT  COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
+COMMIT COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637'; 
 
 CREATE CLUSTER personnel
    (department NUMBER(4))


From dna-commits at lists.jboss.org  Thu Jan  7 14:12:35 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 14:12:35 -0500
Subject: [dna-commits] DNA SVN: r1554 - in trunk:
	dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby
	and 7 other directories.
Message-ID: <201001071912.o07JCZIp006627@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-07 14:12:33 -0500 (Thu, 07 Jan 2010)
New Revision: 1554

Added:
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
   trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java
   trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl
Log:
DNA-49 Beefed up integration tests.  Added parsing methods for Domain, Collation, etc.. Misc. fixes/tweaks.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.test.integration.sequencer.ddl;
 
+import static org.junit.Assert.assertNotNull;
 import java.io.IOException;
 import java.net.URL;
 import java.util.Calendar;
@@ -53,7 +54,17 @@
     public JcrTools tools;
     public static final String ddlTestResourceRootFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
     
+    protected URL getUrl(String urlStr) {
+        return this.getClass().getClassLoader().getResource(urlStr);
+    }
     
+    public void uploadFile(String folder, String fileName, String testMethod) throws RepositoryException, IOException {
+        printStart(fileName, testMethod);
+
+        URL url = getUrl(folder + fileName);
+        uploadFile(url);
+    }
+    
     public void uploadFile(URL url) throws RepositoryException, IOException {
         // Grab the last segment of the URL path, using it as the filename
         String filename = url.getPath().replaceAll("([^/]*/)*", "");
@@ -316,6 +327,29 @@
         return null;
     }
     
+    public Node assertNode(Node node, String name, String type) throws Exception {
+        Node existingNode = findNode(node, name, type);
+        assertNotNull(node);
+        
+        return existingNode;
+    }
+    
+    public void printPropertiesRecursive( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+        printProperties(node);
+        
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            printPropertiesRecursive(iter.nextNode());
+        }
+        
+    }
+    
+    public void printChildProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            printProperties(iter.nextNode());
+        }
+        
+    }
+    
     public void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
         
         System.out.println("\n >>>  NODE PATH: " + node.getPath() );
@@ -345,4 +379,12 @@
             //props.put(name, stringValue);
         }
     }
+    
+    public void printStart(String fileName, String testMethod) {
+        System.out.println("STARTED:  " + testMethod + "(" + fileName +")");
+    }
+    
+    public void printEnd(String fileName, String testMethod) {
+        System.out.println("ENDED:    " + testMethod + "(" + fileName +")");
+    }
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -24,8 +24,6 @@
 package org.jboss.dna.test.integration.sequencer.ddl;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -85,9 +83,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
 
     @After
     public void afterEach() throws Exception {
@@ -101,9 +96,8 @@
     
     @Test
     public void shouldSequenceCreateSchemaDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "create_schema.ddl");
-        uploadFile(url);
+
+        uploadFile(ddlTestResourceRootFolder, "create_schema.ddl", "shouldSequenceCreateSchemaDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -126,15 +120,12 @@
             }
         }
         
-        System.out.println("FINISHED:  shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
     }
     
     @Test
     public void shouldSequenceStandardDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "standard_test_statements.ddl");
-        uploadFile(url);
-        
+        uploadFile(ddlTestResourceRootFolder, "standard_test_statements.ddl", "shouldSequenceStandardDdlFile");
+
         waitUntilSequencedNodesIs(1);
         
         // Find the node ...
@@ -147,22 +138,70 @@
                 for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
                     Node ddlNode = iter.nextNode();
 
-                    //printNodeProperties(ddlNode);
+                    //printPropertiesRecursive(ddlNode);
                     
+                   // printChildProperties(ddlNode.getNodes().nextNode());
+                    
                     long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
-                    assertEquals(numStatements, 7);
+                    assertEquals(44, numStatements);
+
+                    
+                  // assertNotNull <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE, ns001:startCharIndex = 1400, ns001:searchCondition =  value ! = null>
+                  //       CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = NOT DEFERRABLE>
+                  // assertIsZero <ns001:startLineNumber = 42, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED, ns001:startCharIndex = 1469, ns001:searchCondition =  value ! = null and value = = 0>
+                  //       CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY DEFERRED>
+                    Node stmtNode = assertNode(ddlNode, "assertNotNull", "ddl:createAssertionStatement");
+                    Node constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "NOT DEFERRABLE");
+                    
+                    stmtNode = assertNode(ddlNode, "assertIsZero", "ddl:createAssertionStatement");
+                    constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY DEFERRED");
+                    //          employee <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createTableStatement, ns001:expression = CREATE TABLE employee (
+                    //                 empno NUMBER(4) NOT NULL, 
+                    //                 empname CHAR(10), 
+                    //                 job CHAR(9), 
+                    //                 deptno NUMBER(2) NOT NULL,
+                    //                 CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE, 
+                    //                 CONSTRAINT emp_pk PRIMARY KEY (empno));, ns001:startCharIndex = 1404>
+                    //             empno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 4, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+                    //             empname <ns001:datatypeName = CHAR, ns001:datatypeLength = 10, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+                    //             job <ns001:datatypeName = CHAR, ns001:datatypeLength = 9, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+                    //             deptno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 2, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+                    //             emp_fk1 <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 1>
+                    //                 deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+                    //                 dept <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableReference>
+                    //                 deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:fkColumnReference>
+                    //                 CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY IMMEDIATE>
+                    //             emp_pk <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 2>
+                    //                 empno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+
+                    Node tbleNode   = assertNode(ddlNode, "employee", "ddl:createTableStatement");
+                    Node columnNode = assertNode(ddlNode, "empname", "ddl:columnDefinition");
+                    verifySingleValueProperty(columnNode, "ddl:datatypeName", "CHAR");
+                    verifySingleValueProperty(columnNode, "ddl:datatypeLength", 10);
+                    Node constraintNode = assertNode(tbleNode, "emp_fk1", "ddl:tableConstraint");
+                    constraintAttribute  = assertNode(constraintNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+                    verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY IMMEDIATE");
+                    assertNode(constraintNode, "deptno", "ddl:columnReference");
+                    assertNode(constraintNode, "dept", "ddl:tableReference");
+                    assertNode(constraintNode, "deptno", "ddl:fkColumnReference");
+                    
+                    Node viewNode = assertNode(ddlNode, "view_1", "ddl:createViewStatement");
+                    assertNode(viewNode, "col1", "ddl:columnReference");
+                    
+                    Node tableNode = assertNode(ddlNode, "table_5", "ddl:createTableStatement");
+                    printChildProperties(tableNode);
+                    assertEquals(18, tableNode.getNodes().getSize());
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
     }
     
     @Test
     public void shouldSequenceStandardDdlGrantStatements() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "grant_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(ddlTestResourceRootFolder, "grant_test_statements.ddl", "shouldSequenceStandardDdlGrantStatements");
         
         waitUntilSequencedNodesIs(1);
         
@@ -182,35 +221,27 @@
                     assertEquals(numStatements, 4);
                     
                     //GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
-                    Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
-                    assertNotNull(granteeNode);
-                    Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    Node grantNode = assertNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
+                    assertNode(grantNode, "maria", "ddl:grantee");
+                    Node privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
                     //GRANT UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi;
-                    grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
-                    assertNotNull(grantNode);
-                    privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    grantNode = assertNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
+                    privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
-                    granteeNode = findNode(grantNode, "anita", "ddl:grantee");
-                    assertNotNull(granteeNode);
+                    assertNode(grantNode, "anita", "ddl:grantee");
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
+
     }
     
     @Test
     public void shouldSequenceStandardDdlRevokeStatements() throws Exception {
-        System.out.println("STARTED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
-        URL url = getUrl(ddlTestResourceRootFolder + "revoke_test_statements.ddl");
-        uploadFile(url);
         
+        uploadFile(ddlTestResourceRootFolder, "revoke_test_statements.ddl", "shouldSequenceStandardDdlRevokeStatements");
+        
         waitUntilSequencedNodesIs(1);
         
         // Find the node ...
@@ -229,27 +260,86 @@
                     assertEquals(numStatements, 4);
                     
                     //REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;
-                    Node revokeNode = findNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
-                    assertNotNull(revokeNode);
-                    Node granteeNode = findNode(revokeNode, "maria", "ddl:grantee");
-                    assertNotNull(granteeNode);
-                    Node privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    Node revokeNode = assertNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
+                    assertNode(revokeNode, "maria", "ddl:grantee");
+                    Node privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "SELECT");
                     
                     //REVOKE UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi CASCADE;
-                    revokeNode = findNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
-                    assertNotNull(revokeNode);
-                    privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
-                    assertNotNull(privNode);
+                    revokeNode = assertNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
+                    privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
                     verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
-                    granteeNode = findNode(revokeNode, "anita", "ddl:grantee");
-                    assertNotNull(granteeNode);
+                    assertNode(revokeNode, "anita", "ddl:grantee");
                 }
             }
         }
+    }
+    
+    @Test
+    public void shouldSequenceStandardAlterTableStatements() throws Exception {
+
+        uploadFile(ddlTestResourceRootFolder, "alter_table_statements.ddl", "shouldSequenceStandardAlterTableStatements");
         
-        System.out.println("FINISHED:  shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
+        waitUntilSequencedNodesIs(1);
+        
+        // Find the node ...
+        Node root = session.getRootNode();
+
+        if (root.hasNode("ddls") ) {
+            if (root.hasNode("ddls")) {
+                Node ddlsNode = root.getNode("ddls");
+                //System.out.println("   | NAME: " + ddlsNode.getName() + "  PATH: " + ddlsNode.getPath());
+                for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+                    Node ddlNode = iter.nextNode();
+
+                    //printNodeProperties(ddlNode);
+                    
+                    long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+                    assertEquals(numStatements, 14);
+                    
+                    // ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+                    Node alterNode = assertNode(ddlNode, "table_name_1", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node addColumnNode = assertNode(alterNode, "column_name", "ddl:columnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "VARCHAR");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeLength", 25);
+                    verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+                    
+                    // ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+                    alterNode = assertNode(ddlNode, "schema_2.table_name_2", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    addColumnNode = assertNode(alterNode, "schema_2.table_name_2.column_name", "ddl:columnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "INTEGER");
+                    verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+                    verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "25");
+                    
+                    // ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+                    alterNode = assertNode(ddlNode, "table_name_4", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    addColumnNode = assertNode(alterNode, "column_name", "ddl:alterColumnDefinition");
+                    verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "0");
+                    
+                    // ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+                    alterNode = assertNode(ddlNode, "table_name_7", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node dropColumnNode = assertNode(alterNode, "column_name", "ddl:dropColumnDefinition");
+                    verifySingleValueProperty(dropColumnNode, "ddl:dropBehavior", "RESTRICT");
+                    
+                    // ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+                    alterNode = assertNode(ddlNode, "table_name_10", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node constraintNode = assertNode(alterNode, "pk_name", "ddl:addTableConstraintDefinition");
+                    verifySingleValueProperty(constraintNode, "ddl:constraintType", "PRIMARY KEY");
+                    assertNode(constraintNode, "column_name", "ddl:columnReference");
+                    
+                    // ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
+                    alterNode = assertNode(ddlNode, "table_name_14", "ddl:alterTableStatement");
+                    assertEquals(alterNode.getNodes().getSize(), 1);
+                    Node dropConstraintNode = assertNode(alterNode, "fk_name", "ddl:dropTableConstraintDefinition");
+                    verifySingleValueProperty(dropConstraintNode, "ddl:dropBehavior", "RESTRICT");
+                }
+            }
+        }
     }
 
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -87,10 +86,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -103,9 +98,8 @@
     
     @Test
     public void shouldSequenceDerbyDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "derby_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "derby_test_statements.ddl", "shouldSequenceDerbyDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -214,7 +208,5 @@
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
     }
 }

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import java.net.URL;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -86,10 +85,6 @@
 
     }
 
-    private URL getUrl(String urlStr) {
-        return this.getClass().getClassLoader().getResource(urlStr);
-    }
-
     @After
     public void afterEach() throws Exception {
         if (this.session != null) {
@@ -102,9 +97,8 @@
     
     @Test
     public void shouldSequencePostgresDdlFile() throws Exception {
-        System.out.println("STARTED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
-        URL url = getUrl(resourceFolder + "postgres_test_statements.ddl");
-        uploadFile(url);
+
+        uploadFile(resourceFolder, "postgres_test_statements.ddl", "shouldSequencePostgresDdlFile");
         
         waitUntilSequencedNodesIs(1);
         
@@ -155,7 +149,5 @@
                 }
             }
         }
-        
-        System.out.println("FINISHED:  shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
     }
 }

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd	2010-01-07 19:12:33 UTC (rev 1554)
@@ -81,7 +81,29 @@
 [ddl:tableConstraintOperand]    > ddl:operand abstract
 [ddl:referenceOperand]          > ddl:operand abstract
 
+
 // =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+  - ddl:propValue (STRING) mandatory
+
+[ddl:constraintAttribute]       > ddl:simpleProperty mixin
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+  - ddl:value (STRING) mandatory
+  
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+  - ddl:problemLevel (LONG) mandatory
+  - ddl:message (STRING) mandatory
+
+// =============================================================================
 // COLUMN
 // =============================================================================
 [ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
@@ -101,7 +123,7 @@
 // =============================================================================
 // TABLE CONSTRAINT
 // =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+[ddl:tableConstraint] > ddl:creatable, ddl:tableConstraintOperand mixin
   - ddl:constraintType (STRING) mandatory
       < 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
   - ddl:deferrable (STRING)
@@ -111,7 +133,7 @@
   + * (ddl:columnReference) = ddl:columnReference multiple
   + * (ddl:tableReference) = ddl:tableReference
   + * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
   
 // =============================================================================
 // REFERENCE
@@ -122,25 +144,6 @@
 [ddl:grantee]               > ddl:referenceOperand mixin
 
 // =============================================================================
-// SIMPLE STRING PROPERTY
-// =============================================================================
-[ddl:simpleProperty] mixin
-  - ddl:propValue (STRING) mandatory
-
-// =============================================================================
-// STATEMENT OPTION
-// =============================================================================
-[ddl:statementOption] mixin
-  - ddl:value (STRING) mandatory
-  
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
-  - ddl:problemLevel (LONG) mandatory
-  - ddl:message (STRING) mandatory
-
-// =============================================================================
 // CREATE SCHEMA
 // =============================================================================
 [ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand  mixin
@@ -156,7 +159,7 @@
   - ddl:onCommitValue (STRING)
     < 'DELETE ROWS', 'PRESERVE ROWS'
   + * (ddl:columnDefinition) = ddl:columnDefinition multiple
-  + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + * (ddl:tableConstraint) = ddl:tableConstraint multiple
   + * (ddl:statementOption) = ddl:statementOption multiple 
 
 // =============================================================================
@@ -181,15 +184,14 @@
   - ddl:defaultValue (STRING)
   - ddl:defaultPrecision (LONG)
   - ddl:collationName (STRING)
-  + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+  + ddl:domainConstraintDefinition (ddl:tableConstraint) = ddl:tableConstraint multiple
 
 // =============================================================================
 // CREATE ASSERTION
 // =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
-  - ddl:constraintName (STRING) mandatory
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:tableConstraintOperand mixin
   - ddl:searchCondition (STRING) mandatory
-  + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+  + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
 
 // =============================================================================
 // CREATE CHARACTER SET
@@ -248,8 +250,8 @@
 [ddl:alterColumnDefinition]         > ddl:columnDefinition, ddl:alterable mixin
 [ddl:addColumnDefinition]           > ddl:columnDefinition, ddl:creatable mixin
 [ddl:dropColumnDefinition]          > ddl:columnDefinition, ddl:droppable mixin
-[ddl:addTableConstraintDefinition]  > ddl:tableConstraintDefinition, ddl:creatable mixin
-[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
+[ddl:addTableConstraintDefinition]  > ddl:tableConstraint, ddl:creatable mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraint, ddl:droppable mixin
 
 // =============================================================================
 // MISC STATEMENTS

Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -0,0 +1,74 @@
+-- ==================================================================
+--      ALTER TABLE Statement
+-- ==================================================================
+--<alter table statement> ::=
+--    ALTER TABLE <table name> <alter table action>
+--
+--<alter table action> ::=
+--      <add column definition>
+--    | <alter column definition>
+--    | <drop column definition>
+--    | <add table constraint definition>
+--    | <drop table constraint definition>
+--
+--<add column definition> ::=
+--    ADD [ COLUMN ] <column definition>
+--
+--<column definition> ::=
+--    <column name> { <data type> | <domain name> }
+--    [ <default clause> ]
+--    [ <column constraint definition>... ]
+--    [ <collate clause> ]
+
+ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+
+ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+
+--<alter column definition> ::=
+--    ALTER [ COLUMN ] <column name> <alter column action>
+--
+--<alter column action> ::=
+--      <set column default clause>
+--    | <drop column default clause>
+--
+--<set column default clause> ::=
+--    SET <default clause>
+--
+--<drop column default clause> ::=
+--    DROP DEFAULT
+--
+
+ALTER TABLE table_name_3 ALTER column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_5 ALTER column_name DROP DEFAULT;
+
+--<drop column definition> ::=
+--    DROP [ COLUMN ] <column name> <drop behavior>
+--
+ALTER TABLE table_name_6 DROP COLUMN column_name CASCADE;
+
+ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+
+ALTER TABLE table_name_8 DROP column_name CASCADE;
+
+ALTER TABLE table_name_9 DROP column_name RESTRICT;
+
+--<add table constraint definition> ::=
+--    ADD <table constraint definition>
+--
+
+ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+
+ALTER TABLE table_name_11 ADD CONSTRAINT pk_name PRIMARY KEY (column1_name, schema_name_11.table_name_11.column2_name);
+
+ALTER TABLE table_name_12 ADD CONSTRAINT fk_name FOREIGN KEY (ref_col_name) REFERENCES ref_table_name(ref_table_column_name);
+
+--<drop table constraint definition> ::=
+--    DROP CONSTRAINT <constraint name> <drop behavior>
+--
+
+ALTER TABLE table_name_13 DROP CONSTRAINT fk_name CASCADE;
+
+ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
\ No newline at end of file

Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -1,28 +1,28 @@
-CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
-    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
-
 CREATE SCHEMA AUTHORIZATION oe
    CREATE TABLE new_product 
       (color VARCHAR(10)  PRIMARY KEY, quantity NUMERIC) 
    CREATE VIEW new_product_view 
       AS SELECT color, quantity FROM new_product WHERE color = 'RED' 
    GRANT select ON new_product_view TO hr;
-    
+
+CREATE SCHEMA schema_name_1
+    CREATE TABLE table_name_15 (
+        column_name_1 VARCHAR(255) 
+            REFERENCES ref_table_name (ref_column_name_1) 
+            ON UPDATE NO ACTION )
+    CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
+        AS SELECT COMM + BONUS, COMM - BONUS
+           FROM SAMP.EMPLOYEE
+    CREATE TABLE table_name26 (
+        column_name_1 VARCHAR(255),
+        UNIQUE (ref_column_name_1));
+   
+CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
+    SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
+
 CREATE TABLE PEOPLE
     (PERSON_ID INT NOT NULL CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
-
-CREATE SCHEMA schema_name_1
-	CREATE TABLE table_name_15 (
-	    column_name_1 VARCHAR(255) 
-	        REFERENCES ref_table_name (ref_column_name_1) 
-	        ON UPDATE NO ACTION )
-	CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
-	    AS SELECT COMM + BONUS, COMM - BONUS
-	       FROM SAMP.EMPLOYEE
-	CREATE TABLE table_name26 (
-	    column_name_1 VARCHAR(255),
-	    UNIQUE (ref_column_name_1));
-      
+ 
 CREATE TABLE table_name29 (
     column_name_1 VARCHAR(255),
     CONSTRAINT fk_name FOREIGN KEY (ref_column_name_1, ref_column_name_2)
@@ -36,3 +36,68 @@
 CREATE TABLE HOTELAVAILABILITY
      (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
     ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+    
+CREATE TABLE employee (
+    empno NUMBER(4) NOT NULL, 
+    empname CHAR(10), 
+    job CHAR(9), 
+    deptno NUMBER(2) NOT NULL,
+    CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE, 
+    CONSTRAINT emp_pk PRIMARY KEY (empno));
+
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE;
+
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED;
+
+CREATE ASSERTION Avgs CHECK( 3.0 < (SELECT avg(GPA) FROM Student) AND 1000 > (SELECT avg(sizeHS) FROM Student));
+
+CREATE DOMAIN full_domain CHAR DEFAULT null;
+
+CREATE DOMAIN partial_domain AS INTEGER DEFAULT (25);
+
+create domain mydecimal decimal(10) default 1 check (mydecimal>=0) initially immediate not deferrable;
+create domain myinteger as integer constraint myintegconstr1 check(myinteger is not null);
+create domain mynchar as nchar(100) collate schema1.collation2;
+create character set cs1 get WIN1250 collation from desc(collation1);
+create character set cs2 as get unicode collate collation2;
+create character set cs3 as get WIN1250;
+create character set cs4 get WIN1250 collation from external('externcollat2');
+create character set cs5 get WIN1250 collation from translation tn1 then collation collation1;
+create collation collation1 for cs1 from default no pad;
+create collation collation2 for cs2 from translation tn1 then collation collation1;
+create collation collation3 for cs3 from external('externcollat2') pad space;
+create translation tn1 for cs1 to cs2 from external('externtransl2');
+create translation tn2 for cs2 to cs3 from identity;
+create translation tn3 for cs3 to cs4 from tn2;
+create assertion assertconstr1 check(1=(select count(*) from a)) initially immediate not deferrable;
+create assertion assertconstr2 check((select max(b) from c)>0);
+
+create schema schema_1 authorization ADM default character set UNICODE 
+    create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)
+    create view view_1 (col1, col2) as select*from a with check option
+;
+create schema schema_2;
+create global temporary table table_3 (col1 dec(10,2) default 0) on commit delete rows;
+create local temporary table table_4 (col1 dec default null primary key) on commit preserve rows;
+create table table_5 (
+    col1 integer unique, col2 smallint unique,
+    col3 numeric(5,0) references table_3(col1) match full on delete cascade,
+    col4 numeric(5,0) references table_4(col1) match partial on delete set default on update set null,
+    col5 numeric(5,0) references table_1(col1) on update no action on delete cascade check (col5<col4),
+    col6 date not null check (col5<col4 and col6<=date'2003-12-31') unique,
+    unique (col1,col4) initially immediate not deferrable,
+    constraint pk5 primary key (col1) initially deferred,
+    foreign key (col4,col5) references table_7(col2,col3) not deferrable initially immediate,
+    constraint ck2 check (col5 is not null)
+);
+create view view_1 (col1,col2) as values (1,2);
+create view view_1 (col1,col2) as values (1,2) with check option;
+create view view_1 (col1,col2) as select a,b from c with local check option;
+create view view_1 (col1,col2) as table c with cascaded check option;
+grant all privileges on table_1 to public with grant option;
+grant delete,insert(col1,col2),update, references on table table_1 to user1, user1;
+grant usage on domain dom1 to user3;
+grant usage on collation col1 to user4, user5;
+grant usage on character set cs1 to user6;
+grant usage on translation tn1 to user7;
+

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,6 +25,9 @@
     public static final int CONSTRAINT_FK = 1;
     public static final int CONSTRAINT_PK = 2;
     public static final int CONSTRAINT_C = 3;
+    
+    public static final String PRIMARY_KEY = "PRIMARY KEY";
+    public static final String FOREIGN_KEY = "FOREIGN KEY";
 
     /*
      * Common DDL Keywords

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -43,10 +43,10 @@
     public static I18n alterTableOptionNotFound;
     public static I18n unusedTokensParsingCreateIndex;
     public static I18n missingReturnTypeForFunction;
+    public static I18n unsupportedProcedureParameterDeclaration;
 //    public static I18n 
 //    public static I18n 
 //    public static I18n 
-//    public static I18n 
     
 
     static {

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -150,7 +150,6 @@
     public static final Name SQL = new BasicName(Namespace.URI, "sql");
     public static final Name TEMPORARY = new BasicName(Namespace.URI, "temporary");
     public static final Name ON_COMMIT_VALUE = new BasicName(Namespace.URI, "onCommitValue");
-    public static final Name COLUMN_DEFINITIONS = new BasicName(Namespace.URI, "datatypeScale");
     public static final Name NULLABLE = new BasicName(Namespace.URI, "nullable");
     public static final Name DEFAULT_OPTION = new BasicName(Namespace.URI, "defaultOption");
     public static final Name COLLATION_NAME = new BasicName(Namespace.URI, "collationName");

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -482,15 +482,15 @@
         } else if (tokens.matches(STMT_CREATE_VIEW) || tokens.matches(STMT_CREATE_OR_REPLACE_VIEW)) {
             stmtNode = parseCreateViewStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_ASSERTION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_ASSERTION, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+            stmtNode = parseCreateAssertionStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_CHARACTER_SET)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_CHARACTER_SET, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+            stmtNode = parseCreateCharacterSetStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_COLLATION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_COLLATION, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+            stmtNode = parseCreateCollationStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_TRANSLATION)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_TRANSLATION, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+            stmtNode = parseCreateTranslationStatement(tokens, parentNode);
         } else if (tokens.matches(STMT_CREATE_DOMAIN)) {
-            stmtNode = parseStatement(tokens, STMT_CREATE_DOMAIN, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+            stmtNode = parseCreateDomainStatement(tokens, parentNode);
         } else {
             markStartOfStatement(tokens);
 
@@ -766,7 +766,7 @@
     }
 
     /**
-     * Parses DDL INSERT {@link AstNode} based on SQL 92 specifications.
+     * Parses DDL GRANT statement {@link AstNode} based on SQL 92 specifications.
      * 
      * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
      * @param parentNode the parent {@link AstNode} node; may not be null
@@ -997,7 +997,127 @@
         return revokeNode;
     }
     
+    
     /**
+     * Parses DDL CREATE DOMAIN {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateDomainStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        //<domain definition> ::=
+        //    CREATE DOMAIN <domain name>
+        //        [ AS ] <data type>
+        //      [ <default clause> ]
+        //      [ <domain constraint>... ]
+        //      [ <collate clause> ]
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_DOMAIN);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE COLLATION {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateCollationStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_COLLATION);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE TRANSLATION {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateTranslationStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_TRANSLATION);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
+     * Parses DDL CREATE CHARACTER SET {@link AstNode} based on SQL 92 specifications.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed statement node {@link AstNode}
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateCharacterSetStatement( DdlTokenStream tokens,
+                                            AstNode parentNode ) throws ParsingException {
+        assert tokens != null;
+        assert parentNode != null;
+        
+        markStartOfStatement(tokens);
+
+        tokens.consume(STMT_CREATE_CHARACTER_SET);
+        
+        String name = parseName(tokens);
+
+        AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+
+        parseUntilTerminator(tokens);
+
+        markEndOfStatement(tokens, node);
+        
+        return node;
+    }
+    
+    /**
      * Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
      * 
      * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
@@ -1377,7 +1497,7 @@
                 // CONSTRAINT P_KEY_2a UNIQUE (PERMISSIONUID)
                 tokens.consume("UNIQUE"); // UNIQUE
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+                constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1388,7 +1508,7 @@
                 tokens.consume("PRIMARY"); // PRIMARY
                 tokens.consume("KEY"); // KEY
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1400,7 +1520,7 @@
                 // COLUMN_NAME DATATYPE NOT NULL DEFAULT (0) CONSTRAINT SOME_FK_NAME REFERENCES SOME_TABLE_NAME (SOME_COLUMN_NAME,
                 // ...)
 
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
                 nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1416,7 +1536,7 @@
 
             AstNode constraintNode = nodeFactory().node(uc_name, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+            constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1428,7 +1548,7 @@
 
             AstNode constraintNode = nodeFactory().node(pk_name, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1444,7 +1564,7 @@
 
             AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1461,7 +1581,7 @@
 
             AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
 
@@ -1475,7 +1595,7 @@
 
             AstNode constraintNode = nodeFactory().node(ck_name, columnNode.getParent(), mixinType);
             constraintNode.setProperty(NAME, ck_name);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+            constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
 
             String clause = consumeParenBoundedTokens(tokens, true);
             constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1552,7 +1672,7 @@
                 tokens.consume(); // UNIQUE
 
                 AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+                constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1565,7 +1685,7 @@
                 tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
 
                 AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1583,7 +1703,7 @@
                 }
 
                 AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
-                constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+                constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
                 // CONSUME COLUMNS
                 parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1602,7 +1722,7 @@
             tokens.consume("UNIQUE"); // UNIQUE
 
             AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+            constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1617,7 +1737,7 @@
             tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
 
             AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1634,7 +1754,7 @@
 
             AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
 
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+            constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
 
             // CONSUME COLUMNS
             parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1653,7 +1773,7 @@
             tokens.consume("CHECK"); // CHECK
 
             AstNode constraintNode = nodeFactory().node(ck_name, tableNode, mixinType);
-            constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+            constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
 
             String clause = consumeParenBoundedTokens(tokens, true);
             constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1867,7 +1987,45 @@
 
         return schemaNode;
     }
+    /**
+     * Parses DDL CREATE ASSERTION {@link AstNode} based on SQL 92 specifications. Initial implementation here does not parse the
+     * statement's search condition in detail.
+     * 
+     * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+     * @param parentNode the parent {@link AstNode} node; may not be null
+     * @return the parsed schema node
+     * @throws ParsingException
+     */
+    protected AstNode parseCreateAssertionStatement( DdlTokenStream tokens,
+                                                  AstNode parentNode ) throws ParsingException {
+        markStartOfStatement(tokens);
 
+        //      <assertion definition> ::=
+        //      CREATE ASSERTION <constraint name> CHECK <left paren> <search condition> <right paren>  [ <constraint attributes> ]         
+        
+        AstNode node = null;
+
+        tokens.consume("CREATE", "ASSERTION");
+
+        String name = parseName(tokens);
+                
+        // Must have one or the other or both
+
+        node = nodeFactory().node(name, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+        
+        tokens.consume("CHECK");
+        
+        String searchCondition = consumeParenBoundedTokens(tokens, false);
+        
+        node.setProperty(CHECK_SEARCH_CONDITION, searchCondition);
+
+        parseConstraintAttributes(tokens, node);
+
+        markEndOfStatement(tokens, node);
+
+        return node;
+    }
+
     // ===========================================================================================================================
     // PARSING CREATE XXXXX (Typed Statements)
     // ===========================================================================================================================

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -64,6 +64,7 @@
     	basicCharStringTypes.add(DataTypes.DTYPE_CHAR_VARYING);
     	basicCharStringTypes.add(DataTypes.DTYPE_VARCHAR);
     	
+    	basicNationalCharStringTypes.add(DataTypes.DTYPE_NCHAR);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER_VARYING);
     	basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHAR);

Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -228,7 +228,7 @@
         //       | { NO SQL | CONTAINS SQL | READS SQL DATA }
         //       | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
         //        }
-        tokens.consume(CREATE, "FUNCTION"); // CREATE
+        tokens.consume(CREATE, "FUNCTION");
 
         String functionName = parseName(tokens);
 
@@ -330,11 +330,11 @@
     }
 
     /**
-     * Parses DDL CREATE FUNCTION statement
+     * Parses DDL CREATE PROCEDURE statement
      * 
      * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
      * @param parentNode the parent {@link AstNode} node; may not be null
-     * @return the parsed CREATE FUNCTION statement node
+     * @return the parsed CREATE PROCEDURE statement node
      * @throws ParsingException
      */
     protected AstNode parseCreateProcedure( DdlTokenStream tokens,
@@ -344,7 +344,7 @@
 
         markStartOfStatement(tokens);
         
-        tokens.consume(CREATE, "PROCEDURE"); // CREATE
+        tokens.consume(CREATE, "PROCEDURE");
 
         String functionName = parseName(tokens);
 

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -340,7 +340,7 @@
         SubgraphNode pk_1_Node = tableNode.getNode(path("PK_1"));
         assertNotNull(pk_1_Node);
         assertThat(verifyPrimaryType(pk_1_Node, "nt:unstructured"), is(true));
-        assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "2"), is(true));
+        assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "PRIMARY KEY"), is(true));
         assertThat(verifyMixinType(pk_1_Node, "ddl:tableConstraint"), is(true));
         
         // One column reference
@@ -597,7 +597,7 @@
         // <name = "CREATE OR REPLACE DIRECTORY" startLineNumber = "164" primaryType = "nt:unstructured" uuid = "c45eb2bb-1b85-469d-9dfc-0012fdfd8ac4" startColumnNumber = "1" mixinTypes = "oracleddl:createDirectoryStatement" expression = "CREATE OR REPLACE DIRECTORY bfile_dir AS '/private1/LOB/files';" startCharIndex = "3887">
         SubgraphNode createOrReplDirNode = statementsNode.getNode(path("CREATE OR REPLACE DIRECTORY"));
         assertNotNull(createOrReplDirNode);
-        verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3887", 0);
+        verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3886", 0);
         assertThat(verifyMixinType(createOrReplDirNode, "oracleddl:createDirectoryStatement"), is(true));
         
         // <name = "countries" startLineNumber = "9" primaryType = "nt:unstructured" uuid = "70f45acc-57b0-41c9-b166-bcba4f8c75b8" startColumnNumber = "1" mixinTypes = "ddl:alterTableStatement" expression = "ALTER TABLE countries 
@@ -623,7 +623,7 @@
         SubgraphNode check_1_node = countriesNode.getNode(path("CHECK_1"));
         assertNotNull(check_1_node);
         assertThat(verifyPrimaryType(check_1_node, "nt:unstructured"), is(true));
-        assertThat(verifyProperty(check_1_node, "ddl:constraintType", "3"), is(true));
+        assertThat(verifyProperty(check_1_node, "ddl:constraintType", "CHECK"), is(true));
         assertThat(verifyMixinType(check_1_node, "ddl:addTableConstraintDefinition"), is(true));
         assertThat(verifyProperty(check_1_node, "ddl:searchCondition", "( duty_pct < 10 . 5 )"), is(true));
         

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java	2010-01-07 19:12:33 UTC (rev 1554)
@@ -256,7 +256,7 @@
         assertEquals(1, alterTableNode.getChildCount());
         AstNode constraintNode = alterTableNode.getChild(0); // / FOREIGN KEY
         assertEquals("fk_name", constraintNode.getName().getString());
-        assertEquals(DdlConstants.CONSTRAINT_FK, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+        assertEquals(DdlConstants.FOREIGN_KEY, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
         assertTrue(hasMixinType(constraintNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_ADD_TABLE_CONSTRAINT_DEFINITION));
 
         // Expect 3 references: COLUMN REFERENCE for this table, External Table reference and column reference in external table
@@ -298,7 +298,7 @@
         String content = getFileContent(DDL_FILE_PATH + "schema_definition.ddl");
         parser.parse(content, rootNode);
 
-        assertEquals(11, rootNode.getChildCount());
+        assertEquals(13, rootNode.getChildCount());
 
         List<AstNode> schemaNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_CREATE_SCHEMA_STATEMENT);
 
@@ -600,7 +600,7 @@
 
         AstNode foreignKeyNode = parser.nodeFactory().getChildforNameAndType(tableNode, "FK_SUPPLIER", TYPE_TABLE_CONSTRAINT);
 
-        assertEquals(DdlConstants.CONSTRAINT_FK, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+        assertEquals(DdlConstants.FOREIGN_KEY, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
         assertEquals(3, foreignKeyNode.getChildCount()); // 2 COLUMN REFERENCES + 1 TABLE REFERENCE
     }
 
@@ -860,4 +860,18 @@
         assertThat(true, is(success));
         assertThat(rootNode.getChildCount(), is(4));
     }
+    
+    @Test
+    public void shouldParseSchemaWithTableAndView() {
+        printTest("shouldParseSchemaWithTableAndView()");
+        String content = 
+              "create schema schema_1 authorization ADM default character set UNICODE" + NEWLINE
+            + "     create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)" + NEWLINE
+            + "     create view view_1 (col1, col2) as select*from a with check option" + NEWLINE
+            + ";";
+
+        boolean success = parser.parse(content, rootNode);
+        assertThat(true, is(success));
+        assertThat(rootNode.getChildCount(), is(1));
+    }
 }

Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl	2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl	2010-01-07 19:12:33 UTC (rev 1554)
@@ -105,8 +105,17 @@
 	);
 
 -- ==================================================================
---      DOMAIN DEFINITION
+--      ASSERTION DEFINITION
 -- ==================================================================
 
+--<assertion definition> ::=
+--    CREATE ASSERTION <constraint name> <assertion check>
+--      [ <constraint attributes> ]
+--
+--<assertion check> ::=
+--    CHECK
+--        <left paren> <search condition> <right paren>
 
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE
 
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED


From dna-commits at lists.jboss.org  Thu Jan  7 17:24:56 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 7 Jan 2010 17:24:56 -0500
Subject: [dna-commits] DNA SVN: r1555 - in
	trunk/docs/reference/src/main/docbook/en-US/content: jcr and
	1 other directory.
Message-ID: <201001072224.o07MOu0S015353@svn01.web.mwc.hst.phx2.redhat.com>

Author: elvisisking
Date: 2010-01-07 17:24:56 -0500 (Thu, 07 Jan 2010)
New Revision: 1555

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
Log:
DNA-629 Document The REST Client API In The Reference Guide: Added new section and modified introduction. Reviewed by Brian C.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-07 19:12:33 UTC (rev 1554)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-07 22:24:56 UTC (rev 1555)
@@ -519,6 +519,14 @@
             can be consulted as a template for how to deploy the RESTful services in a custom implementation. 
           </para>
         </listitem>
+        <listitem>
+          <para>
+            <emphasis role="strong">dna-web-jcr-rest-client</emphasis>
+            is an API that uses POJOs to access the REST web service. This API eliminates the need for applications to know how
+            to create HTTP request URLs and payloads, and how to parse the JSON responses. It can be used to publish (upload) 
+            and unpublish (delete) files from DNA repositories. 
+          </para>
+        </listitem>
       </itemizedlist>
       There are also documentation modules (located in the source under the
       <code>docs/</code>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-07 19:12:33 UTC (rev 1554)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-07 22:24:56 UTC (rev 1555)
@@ -578,5 +578,66 @@
 			repository should shutdown and clean up any resources that are in use.
 		</para>
 	</sect1>
+
+    <sect1 id="dna_rest_client_api">
+        <title>DNA REST Client API</title>
+        <para>
+            The DNA REST Client API provides a POJO way of using the DNA REST web service to publish (upload) and 
+            unpublish (delete) files from DNA repositories. Java objects open the HTTP connection, create the HTTP request URLs, 
+            attach the payload associated with <code>PUT</code> and <code>POST</code> requests, parse the HTTP JSON response back 
+            into Java objects, and close the HTTP connection.
+        </para>
+        <para>
+            Here are the Java business objects you will need (all found in the <code>org.jboss.dna.web.jcr.rest.client.domain</code> 
+            package):
+
+            <itemizedlist>
+                <listitem>
+                    <para><code>Server</code> - hosts one or more DNA JCR repositories,</para>
+                </listitem>
+                <listitem>
+                    <para><code>Repository</code> - a DNA JCR repository containing one or more workspaces, and</para>
+                </listitem>
+                <listitem>
+                    <para><code>Workspace</code> - a DNA JCR repository workspace.</para>
+                </listitem>
+            </itemizedlist>
+        </para>
+        <para>
+            Along with the POJOs above, an <code>org.jboss.dna.web.jcr.rest.client.IRestClient</code> is needed. The 
+            <code>IRestClient</code> is responsible for executing the publishing and unpublishing operations. You can also use the
+            <code>IRestClient</code> to find out what repositories and workspaces are available on a DNA server.
+
+            <note>
+                <para>
+                    The only implementation of <code>IRestClient</code> is <code>JsonRestClient</code> as JSON-encoded responses are 
+                    all that are currently available.
+                </para>
+            </note>
+                
+            Here's a code snippet that publishes (uploads) a file:
+
+            <programlisting><![CDATA[
+// Setup POJOs
+Server server = new Server("http://localhost:8080", "username", "password");
+Repository repository = new Repository("repositoryName", server);
+Workspace workspace = new Workspace("workspaceName", repository);
+
+// Publish
+File file = new File("/path/to/file");
+IRestClient restClient = new JsonRestClient();
+Status status = restClient.publish(workspace, "/workspace/path/", file);
+
+if (status.isError() {
+    // Handle error here
+}
+            ]]></programlisting>
+        </para>
+        <para>
+            Results of successfully executing the above code is a JCR folder node (<code>nt:folder</code>) for each segment of the 
+            workspace path (a node is created if it doesn't already exist). Also, a JCR file node (a node with primary type <code>nt:file</code>) is 
+            created or updated under the last folder node and the file contents are encoded and uploaded into a child node of that file node.
+        </para>
+    </sect1>
 </chapter>
 


From dna-commits at lists.jboss.org  Fri Jan  8 00:45:19 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 00:45:19 -0500
Subject: [dna-commits] DNA SVN: r1556 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/query/model and 9
	other directories.
Message-ID: <201001080545.o085jJ6c011959@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-08 00:45:17 -0500 (Fri, 08 Jan 2010)
New Revision: 1556

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
DNA-613 Found several minor issues that all conspired to make this functionality not work.
1) The XPathToQueryTranslator was incorrectly translating queries that used wildcards in the path.
2) Queries that used aliases in columns, criteria, or order-by clauses were not always being resolved correctly, resulting in the inability to locate the correct column (when constraints or order-by clauses had to be evaluated after the fact.
3) The optimizer was not always pushing SELECT nodes (e.g., criteria) down below ACCESS nodes. The rule to do this was not included by default and was instead added to the rule stack only when criteria were encountered. This was changed to simply always add the rule to the stack.
4) Columns used in constraints or order-by clauses were not always being included in the PROJECT columns. Thus it was possible that the evaluation of the criteria or order-by required data that was not in the tuples, causing an error.  Note that these PROJECT columns dictate which values are included in the tuples during processing, and all of these are not necessarily included in the result columns.
5) The LuceneSearchEngine was incorrectly mapping paths into criteria values that could be applied to Lucene. If the user specified a criteria such as
            PATH(table) LIKE '/Cars/Hybrid/%'
the /Cars/Hybrid/% value was used directly as the LIKE expression. But paths are stored in the indexes so that the SNS index is always included, and thus the LIKE expressions never evaluated to return any documents. Since the SNS index in the path might include the wildcard characters (e.g., '[%]' or '[_]'), we couldn't use the standard PathFactory to convert the LIKE expression value into a Path.  The solution was to just use String manipulation to insert a '[1]' at the end of each segment that didn't already include a SNS index.
6) Lucene 'read past EOF' errors; see DNA-630.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -2666,7 +2666,8 @@
                                                     msg,
                                                     accessNode.getString(),
                                                     accessRequest.workspace(),
-                                                    graphSourceName);
+                                                    graphSourceName,
+                                                    accessRequest.getError().getLocalizedMessage());
                 return emptyTuples();
             }
             return accessRequest.getTuples();

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -134,6 +134,17 @@
     }
 
     /**
+     * Create a copy of this Column except that uses the supplied selector name instead.
+     * 
+     * @param newSelectorName the new selector name
+     * @return a new Column with the supplied selector name and the property and column names from this object; never null
+     * @throws IllegalArgumentException if the supplied selector name is null
+     */
+    public Column with( SelectorName newSelectorName ) {
+        return new Column(newSelectorName, propertyName, columnName);
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.graph.query.model.Visitable#accept(org.jboss.dna.graph.query.model.Visitor)

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -89,6 +89,11 @@
                 }
                 child.insertAsParent(project);
                 if (plan == access) return plan;
+
+                // We need to make sure we have all of the columns needed for any ancestor ...
+                List<Column> requiredColumns = PlanUtil.findRequiredColumns(context, project);
+                project.setProperty(Property.PROJECT_COLUMNS, requiredColumns);
+                project.addSelectors(getSelectorsFor(requiredColumns));
                 continue;
             }
 

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -0,0 +1,88 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.query.optimize;
+
+import java.util.LinkedList;
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.query.QueryContext;
+import org.jboss.dna.graph.query.model.SelectorName;
+import org.jboss.dna.graph.query.plan.PlanNode;
+import org.jboss.dna.graph.query.plan.PlanUtil;
+import org.jboss.dna.graph.query.plan.PlanNode.Property;
+import org.jboss.dna.graph.query.plan.PlanNode.Type;
+import org.jboss.dna.graph.query.validate.Schemata;
+import org.jboss.dna.graph.query.validate.Schemata.Table;
+
+/**
+ * An {@link OptimizerRule optimizer rule} that changes any nodes that make use of an alias for a SOURCE, including columns,
+ * including criteria, project nodes, etc. This behavior is similar to what {@link ReplaceViews} does with views that are given
+ * aliases.
+ */
+ at Immutable
+public class ReplaceAliases implements OptimizerRule {
+
+    public static final ReplaceAliases INSTANCE = new ReplaceAliases();
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.query.optimize.OptimizerRule#execute(org.jboss.dna.graph.query.QueryContext,
+     *      org.jboss.dna.graph.query.plan.PlanNode, java.util.LinkedList)
+     */
+    public PlanNode execute( QueryContext context,
+                             PlanNode plan,
+                             LinkedList<OptimizerRule> ruleStack ) {
+        // For each of the SOURCE nodes ...
+        Schemata schemata = context.getSchemata();
+        for (PlanNode sourceNode : plan.findAllAtOrBelow(Type.SOURCE)) {
+
+            // Resolve the node to find the definition in the schemata ...
+            SelectorName tableName = sourceNode.getProperty(Property.SOURCE_NAME, SelectorName.class);
+            SelectorName tableAlias = sourceNode.getProperty(Property.SOURCE_ALIAS, SelectorName.class);
+            if (tableAlias != null) {
+                Table table = schemata.getTable(tableName);
+                // We also need to replace references to the alias for the view ...
+                PlanUtil.ColumnMapping aliasMappings = PlanUtil.createMappingForAliased(tableAlias, table, sourceNode);
+                // Adjust the plan nodes above the SOURCE node ...
+                PlanUtil.replaceViewReferences(context, sourceNode.getParent(), aliasMappings);
+                // And adjust the SOURCE node ...
+                sourceNode.removeProperty(Property.SOURCE_ALIAS);
+                sourceNode.getSelectors().remove(tableAlias);
+                sourceNode.addSelector(tableName);
+            }
+        }
+        return plan;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return getClass().getSimpleName();
+    }
+
+}


Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -149,6 +149,7 @@
             // is completely done ...
             if (!(ruleStack.getFirst() instanceof RaiseSelectCriteria)) {
                 ruleStack.addFirst(RaiseSelectCriteria.INSTANCE);
+                ruleStack.addFirst(PushSelectCriteria.INSTANCE);
             }
 
             // We re-wrote at least one SOURCE, but the resulting plan tree for the view could actually reference

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -165,6 +165,16 @@
     }
 
     /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return getClass().getSimpleName();
+    }
+
+    /**
      * Rewrite the supplied comparisons, returning the new constraint and nulling in the supplied list those comparisons that were
      * rewritten (and leaving those that were not rewritten)
      * 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -69,15 +69,14 @@
      */
     protected void populateRuleStack( LinkedList<OptimizerRule> ruleStack,
                                       PlanHints hints ) {
+        ruleStack.addFirst(ReplaceAliases.INSTANCE);
         ruleStack.addFirst(RewriteAsRangeCriteria.INSTANCE);
         if (hints.hasJoin) {
             ruleStack.addFirst(ChooseJoinAlgorithm.USE_ONLY_NESTED_JOIN_ALGORITHM);
             ruleStack.addFirst(RewriteIdentityJoins.INSTANCE);
         }
         ruleStack.addFirst(PushProjects.INSTANCE);
-        if (hints.hasCriteria) {
-            ruleStack.addFirst(PushSelectCriteria.INSTANCE);
-        }
+        ruleStack.addFirst(PushSelectCriteria.INSTANCE);
         ruleStack.addFirst(AddAccessNodes.INSTANCE);
         ruleStack.addFirst(RightOuterToLeftOuterJoins.INSTANCE);
         ruleStack.addFirst(CopyCriteria.INSTANCE);

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -69,6 +69,7 @@
 import org.jboss.dna.graph.query.model.Visitors.AbstractVisitor;
 import org.jboss.dna.graph.query.plan.PlanNode.Property;
 import org.jboss.dna.graph.query.plan.PlanNode.Type;
+import org.jboss.dna.graph.query.validate.Schemata.Table;
 import org.jboss.dna.graph.query.validate.Schemata.View;
 
 /**
@@ -98,13 +99,11 @@
                                                     PlanNode planNode ) {
         List<Column> columns = null;
         PlanNode node = planNode;
-        PlanNode projectNode = null;
         // First find the columns from the nearest PROJECT ancestor ...
         do {
             switch (node.getType()) {
                 case PROJECT:
                     columns = node.getPropertyAsList(Property.PROJECT_COLUMNS, Column.class);
-                    projectNode = node;
                     node = null;
                     break;
                 default:
@@ -113,14 +112,12 @@
             }
         } while (node != null);
 
-        // If the supplied node is a PROJECT, just return the PROJECT node's column list ...
-        if (projectNode == planNode) return columns;
-
         // Find the names of the selectors ...
         Set<SelectorName> names = new HashSet<SelectorName>();
         for (PlanNode source : planNode.findAllAtOrBelow(Type.SOURCE)) {
             names.add(source.getProperty(Property.SOURCE_NAME, SelectorName.class));
-            names.add(source.getProperty(Property.SOURCE_ALIAS, SelectorName.class));
+            SelectorName alias = source.getProperty(Property.SOURCE_ALIAS, SelectorName.class);
+            if (alias != null) names.add(alias);
         }
 
         // Add the PROJECT columns first ...
@@ -131,7 +128,7 @@
             }
         }
 
-        // Now add the columns from the JOIN and SELECT ancestors ...
+        // Now add the columns from the JOIN, SELECT, PROJECT and SORT ancestors ...
         node = planNode;
         do {
             switch (node.getType()) {
@@ -145,9 +142,23 @@
                     criteria = node.getProperty(Property.SELECT_CRITERIA, Constraint.class);
                     Visitors.visitAll(criteria, collectionVisitor);
                     break;
+                case SORT:
+                    List<Object> orderBys = node.getPropertyAsList(Property.SORT_ORDER_BY, Object.class);
+                    if (orderBys != null && !orderBys.isEmpty()) {
+                        if (orderBys.get(0) instanceof Ordering) {
+                            for (int i = 0; i != orderBys.size(); ++i) {
+                                Ordering ordering = (Ordering)orderBys.get(i);
+                                Visitors.visitAll(ordering, collectionVisitor);
+                            }
+                        }
+                    }
+                    break;
                 case PROJECT:
-                    // Already handled above, but we can stop looking for columns ...
-                    return collectionVisitor.getRequiredColumns();
+                    if (node != planNode) {
+                        // Already handled above, but we can stop looking for columns ...
+                        return collectionVisitor.getRequiredColumns();
+                    }
+                    break;
                 default:
                     break;
             }
@@ -203,16 +214,28 @@
          */
         @Override
         public void visit( Column column ) {
-            requireColumn(column.getSelectorName(), column.getPropertyName());
+            requireColumn(column.getSelectorName(), column.getPropertyName(), column.getColumnName());
         }
 
         protected void requireColumn( SelectorName selector,
                                       String propertyName ) {
+            requireColumn(selector, propertyName, null);
+        }
+
+        protected void requireColumn( SelectorName selector,
+                                      String propertyName,
+                                      String alias ) {
             if (names.contains(selector)) {
                 // The column is part of the table we're interested in ...
-                if (requiredColumnNames.add(propertyName)) {
-                    String alias = propertyName;
-                    columns.add(new Column(selector, propertyName, alias));
+                if (alias != null && !alias.equals(propertyName)) {
+                    if (requiredColumnNames.add(propertyName) && requiredColumnNames.add(alias)) {
+                        columns.add(new Column(selector, propertyName, alias));
+                    }
+                } else {
+                    if (requiredColumnNames.add(propertyName)) {
+                        alias = propertyName;
+                        columns.add(new Column(selector, propertyName, alias));
+                    }
                 }
             }
         }
@@ -558,7 +581,10 @@
                         }
                         break;
                     case ACCESS:
-                        // Nothing to do here, as the selector names are fixed elsewhere
+                        // Add all the selectors used by the subnodes ...
+                        for (PlanNode child : node) {
+                            node.addSelectors(child.getSelectors());
+                        }
                         break;
                     case SORT:
                         // The selector names and Ordering objects needs to be changed ...
@@ -886,6 +912,31 @@
         return mapping;
     }
 
+    public static ColumnMapping createMappingForAliased( SelectorName tableAlias,
+                                                         Table table,
+                                                         PlanNode tableSourceNode ) {
+        ColumnMapping mapping = new ColumnMapping(tableAlias);
+
+        // Find the projected columns on the nearest PROJECT ...
+        PlanNode project = tableSourceNode.findAncestor(Type.PROJECT);
+        assert project != null;
+
+        // Get the Columns from the PROJECT in the plan node ...
+        List<Column> projectedColumns = project.getPropertyAsList(Property.PROJECT_COLUMNS, Column.class);
+
+        for (int i = 0; i != projectedColumns.size(); ++i) {
+            Column projectedColumn = projectedColumns.get(i);
+            Column projectedColumnInTable = projectedColumns.get(i).with(table.getName());
+            org.jboss.dna.graph.query.validate.Schemata.Column column = table.getColumn(projectedColumnInTable.getPropertyName());
+            mapping.map(column.getName(), projectedColumnInTable);
+            if (projectedColumn.getColumnName() != null) {
+                // The projected column has an alias, so add a mapping for it, too
+                mapping.map(projectedColumn.getColumnName(), projectedColumnInTable);
+            }
+        }
+        return mapping;
+    }
+
     /**
      * Defines how the view columns are mapped (or resolved) into the columns from the source tables.
      */

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -49,6 +49,7 @@
 import org.jboss.dna.graph.query.model.NodePath;
 import org.jboss.dna.graph.query.model.PropertyExistence;
 import org.jboss.dna.graph.query.model.PropertyValue;
+import org.jboss.dna.graph.query.model.Query;
 import org.jboss.dna.graph.query.model.SameNode;
 import org.jboss.dna.graph.query.model.SameNodeJoinCondition;
 import org.jboss.dna.graph.query.model.SelectorName;
@@ -66,6 +67,7 @@
     private final Problems problems;
     private final Map<SelectorName, Table> selectorsByNameOrAlias;
     private final Map<SelectorName, Table> selectorsByName;
+    private final Map<String, Schemata.Column> columnsByAlias;
 
     /**
      * @param context the query context
@@ -80,6 +82,7 @@
         for (Table table : selectorsByName.values()) {
             this.selectorsByName.put(table.getName(), table);
         }
+        this.columnsByAlias = new HashMap<String, Schemata.Column>();
     }
 
     /**
@@ -340,6 +343,28 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.Query)
+     */
+    @Override
+    public void visit( Query obj ) {
+        // Collect the map of columns by alias for this query ...
+        this.columnsByAlias.clear();
+        for (Column column : obj.getColumns()) {
+            // Find the schemata column ...
+            Table table = tableWithNameOrAlias(column.getSelectorName());
+            if (table != null) {
+                Schemata.Column tableColumn = table.getColumn(column.getPropertyName());
+                if (tableColumn != null) {
+                    this.columnsByAlias.put(column.getColumnName(), tableColumn);
+                }
+            }
+        }
+        super.visit(obj);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.SameNode)
      */
     @Override
@@ -392,7 +417,11 @@
         }
         Schemata.Column column = table.getColumn(propertyName);
         if (column == null) {
-            problems.addError(GraphI18n.columnDoesNotExistOnTable, propertyName, selectorName.getName());
+            // Maybe the supplied property name is really an alias ...
+            column = this.columnsByAlias.get(propertyName);
+            if (column == null) {
+                problems.addError(GraphI18n.columnDoesNotExistOnTable, propertyName, selectorName.getName());
+            }
         }
         return column;
     }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -74,7 +74,7 @@
     private List<Integer> ruleExecutionOrder;
     private QueryContext context;
     private PlanNode node;
-    private final boolean print = false;
+    private boolean print;
 
     @Before
     public void beforeEach() {
@@ -124,6 +124,7 @@
                 ruleStack.addAll(rules);
             }
         };
+        print = false;
     }
 
     // ----------------------------------------------------------------------------------------------------------------
@@ -193,12 +194,11 @@
     public void shouldOptimizePlanForSimpleQueryWithSelectStarWithAlias() {
         node = optimize("SELECT * FROM t1 AS x1");
         // Create the expected plan ...
-        PlanNode expected = new PlanNode(Type.ACCESS, selector("x1"));
-        PlanNode project = new PlanNode(Type.PROJECT, expected, selector("x1"));
-        project.setProperty(Property.PROJECT_COLUMNS, columns(column("x1", "c11"), column("x1", "c12"), column("x1", "c13")));
-        PlanNode source = new PlanNode(Type.SOURCE, project, selector("x1"));
+        PlanNode expected = new PlanNode(Type.ACCESS, selector("t1"));
+        PlanNode project = new PlanNode(Type.PROJECT, expected, selector("t1"));
+        project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11"), column("t1", "c12"), column("t1", "c13")));
+        PlanNode source = new PlanNode(Type.SOURCE, project, selector("t1"));
         source.setProperty(Property.SOURCE_NAME, selector("t1"));
-        source.setProperty(Property.SOURCE_ALIAS, selector("x1"));
         source.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
         // Compare the expected and actual plan ...
         assertThat(node.isSameAs(expected), is(true));
@@ -208,15 +208,14 @@
     public void shouldOptimizePlanForSimpleQueryWithSelectStarFromTableWithAliasAndValueCriteria() {
         node = optimize("SELECT * FROM t1 AS x1 WHERE c13 < CAST('3' AS LONG)");
         // Create the expected plan ...
-        PlanNode expected = new PlanNode(Type.ACCESS, selector("x1"));
-        PlanNode project = new PlanNode(Type.PROJECT, expected, selector("x1"));
-        project.setProperty(Property.PROJECT_COLUMNS, columns(column("x1", "c11"), column("x1", "c12"), column("x1", "c13")));
-        PlanNode select = new PlanNode(Type.SELECT, project, selector("x1"));
-        select.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("x1"), "c13"), Operator.LESS_THAN,
+        PlanNode expected = new PlanNode(Type.ACCESS, selector("t1"));
+        PlanNode project = new PlanNode(Type.PROJECT, expected, selector("t1"));
+        project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11"), column("t1", "c12"), column("t1", "c13")));
+        PlanNode select = new PlanNode(Type.SELECT, project, selector("t1"));
+        select.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c13"), Operator.LESS_THAN,
                                                                     new Literal(3L)));
-        PlanNode source = new PlanNode(Type.SOURCE, select, selector("x1"));
+        PlanNode source = new PlanNode(Type.SOURCE, select, selector("t1"));
         source.setProperty(Property.SOURCE_NAME, selector("t1"));
-        source.setProperty(Property.SOURCE_ALIAS, selector("x1"));
         source.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
         // Compare the expected and actual plan ...
         assertThat(node.isSameAs(expected), is(true));
@@ -348,7 +347,7 @@
 
         PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
         PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
-        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
         PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
         leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
                                                                          Operator.EQUAL_TO, new Literal('x')));
@@ -451,7 +450,7 @@
 
         PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("all"));
         PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("all"));
-        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a1"), column("all", "a2")));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a1"), column("all", "a2"), column("all", "a3")));
         PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("all"));
         leftSelect1.setProperty(Property.SELECT_CRITERIA, new SetCriteria(new PropertyValue(selector("all"), "primaryType"),
                                                                           new Literal("t1"), new Literal("t0")));
@@ -464,7 +463,7 @@
 
         PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("all"));
         PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("all"));
-        rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a3"), column("all", "a4")));
+        rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a3"), column("all", "a4"), column("all", "a2")));
         PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("all"));
         rightSelect1.setProperty(Property.SELECT_CRITERIA, new SetCriteria(new PropertyValue(selector("all"), "primaryType"),
                                                                            new Literal("t2"), new Literal("t0")));
@@ -514,7 +513,83 @@
     }
 
     @Test
-    public void shouldOptimizePlanForQueryWithOrderByClause() {
+    public void shouldOptimizePlanForQueryUsingTableAndOrderByClause() {
+        print = true;
+        node = optimize("SELECT t1.c11 AS c1 FROM t1 WHERE t1.c11 = 'x' AND t1.c12 = 'y' ORDER BY t1.c11, t1.c12 DESC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
+    @Test
+    public void shouldOptimizePlanForQueryUsingTableWithAliasAndOrderByClause() {
+        print = true;
+        node = optimize("SELECT X.c11 AS c1 FROM t1 AS X WHERE X.c11 = 'x' AND X.c12 = 'y' ORDER BY X.c11, X.c12 DESC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
+    @Test
+    public void shouldOptimizePlanForQueryUsingTableWithAliasAndOrderByClauseUsingAliasedColumn() {
+        print = true;
+        node = optimize("SELECT X.c11 AS c1 FROM t1 AS X WHERE X.c11 = 'x' AND X.c12 = 'y' ORDER BY X.c1, X.c12 DESC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
+    @Test
+    public void shouldOptimizePlanForQueryUsingViewAndOrderByClause() {
+        print = true;
         node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY v2.c11, v2.c12 DESC");
 
         // Create the expected plan ...
@@ -529,7 +604,7 @@
 
         PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
         PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
-        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
         PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
         leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
                                                                          Operator.EQUAL_TO, new Literal("x")));
@@ -555,6 +630,48 @@
     }
 
     @Test
+    public void shouldOptimizePlanForQueryUsingViewWithAliasAndOrderByClause() {
+        print = true;
+        node = optimize("SELECT Q.c11 AS c1 FROM v2 AS Q WHERE Q.c11 = 'x' AND Q.c12 = 'y' ORDER BY Q.c11, Q.c12 DESC");
+
+        // Create the expected plan ...
+        PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+        sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+        PlanNode project = new PlanNode(Type.PROJECT, sort, selector("t1"));
+        project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+        PlanNode join = new PlanNode(Type.JOIN, project, selector("t2"), selector("t1"));
+        join.setProperty(Property.JOIN_ALGORITHM, JoinAlgorithm.NESTED_LOOP);
+        join.setProperty(Property.JOIN_TYPE, JoinType.INNER);
+        join.setProperty(Property.JOIN_CONDITION, new EquiJoinCondition(selector("t1"), "c11", selector("t2"), "c21"));
+
+        PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
+        PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+        PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+        leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+                                                                         Operator.EQUAL_TO, new Literal("x")));
+        PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+        leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+                                                                         Operator.EQUAL_TO, new Literal("y")));
+        PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+        leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+        PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("t2"));
+        PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("t2"));
+        rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t2", "c21")));
+        PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("t2"));
+        rightSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t2"), "c21"),
+                                                                          Operator.EQUAL_TO, new Literal("x")));
+        PlanNode rightSource = new PlanNode(Type.SOURCE, rightSelect1, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_NAME, selector("t2"));
+        rightSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t2")).getColumns());
+
+        // Compare the expected and actual plan ...
+        assertThat(node.isSameAs(sort), is(true));
+    }
+
+    @Test
     public void shouldOptimizePlanForQueryWithOrderByClauseThatUsesScoreFunction() {
         node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY SCORE(v2) ASC");
 
@@ -570,7 +687,7 @@
 
         PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
         PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
-        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+        leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
         PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
         leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
                                                                          Operator.EQUAL_TO, new Literal("x")));
@@ -656,9 +773,9 @@
         PlanNode optimized = new RuleBasedOptimizer().optimize(context, plan);
         assertThat("Problems optimizing query: " + sql + "\n" + problems, problems.hasErrors(), is(false));
         if (print) {
-            System.out.println();
             System.out.println(sql);
             System.out.println(optimized);
+            System.out.println();
         }
         return optimized;
     }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -494,7 +494,8 @@
                                                         msg,
                                                         accessNode.getString(),
                                                         accessRequest.workspace(),
-                                                        sourceName);
+                                                        sourceName,
+                                                        accessRequest.getError().getLocalizedMessage());
                     return emptyTuples();
                 }
                 return accessRequest.getTuples();

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -24,9 +24,11 @@
 package org.jboss.dna.jcr.xpath;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -157,12 +159,16 @@
                 AxisStep axis = (AxisStep)step;
                 NodeTest nodeTest = axis.getNodeTest();
                 if (nodeTest instanceof NameTest) {
-                    NameTest nameTest = (NameTest)nodeTest;
-                    if (!nameTest.isWildcard()) {
+                    if (appliesToPathConstraint(axis.getPredicates())) {
+                        // Everything in this axis/step applies to the path, so add it and we'll translate it below ...
                         path.add(step);
-                    }
-                    if (!appliesToPathConstraint(axis.getPredicates())) {
-                        // The constraints are more complicated, so we need to define a new source/table ...
+                    } else {
+                        // The constraints are more complicated than can be applied to the path ...
+                        // if (!nameTest.isWildcard()) {
+                        // There is a non-wildcard name test that we still need to add to the path ...
+                        path.add(step);
+                        // }
+                        // We need to define a new source/table ...
                         tableName = translateSource(tableName, path, where);
                         translatePredicates(axis.getPredicates(), tableName, where);
                         path.clear();
@@ -464,6 +470,9 @@
             // This adds the criteria that the attribute exists, and adds it to the select ...
             AttributeNameTest attribute = (AttributeNameTest)predicate;
             String propertyName = nameFrom(attribute.getNameTest());
+            // There is nothing in the JCR 1.0 spec that says that a property constrain implies it should be included in the
+            // result columns
+            // builder.select(tableName + "." + propertyName);
             where.hasProperty(tableName, propertyName);
         } else if (predicate instanceof NameTest) {
             // This adds the criteria that the child node exists ...
@@ -679,17 +688,28 @@
     protected boolean translatePathExpressionConstraint( PathExpression pathExrp,
                                                          ConstraintBuilder where,
                                                          String tableName ) {
-        String[] paths = relativePathLikeExpressions(pathExrp);
-        if (paths == null || paths.length == 0) return false;
+        RelativePathLikeExpressions expressions = relativePathLikeExpressions(pathExrp);
+        if (expressions.isEmpty()) return false;
         where = where.openParen();
         boolean first = true;
         int number = 0;
-        for (String path : paths) {
-            if (path == null || path.length() == 0 || path.equals("%/")) continue;
+        for (String path : expressions) {
+            if (path == null || path.length() == 0 || path.equals("%/") || path.equals("%/%") || path.equals("%//%")) continue;
             if (first) first = false;
             else where.or();
             if (path.indexOf('%') != -1) {
                 where.path(tableName).isLike(path);
+                switch (expressions.depthMode) {
+                    case AT_LEAST:
+                        where.and().depth(tableName).isGreaterThanOrEqualTo().cast(expressions.depth).asLong();
+                        break;
+                    case EXACT:
+                        where.and().depth(tableName).isEqualTo().cast(expressions.depth).asLong();
+                        break;
+                    case DEFAULT:
+                        // don't have to add the DEPTH criteria ...
+                        break;
+                }
             } else {
                 where.path(tableName).isEqualTo(path);
             }
@@ -699,19 +719,59 @@
         return true;
     }
 
-    protected String[] relativePathLikeExpressions( PathExpression pathExpression ) {
+    protected static enum DepthMode {
+        DEFAULT,
+        EXACT,
+        AT_LEAST;
+    }
+
+    protected static class RelativePathLikeExpressions implements Iterable<String> {
+        protected final List<String> paths;
+        protected final int depth;
+        protected final DepthMode depthMode;
+
+        protected RelativePathLikeExpressions() {
+            this.paths = null;
+            this.depth = 0;
+            this.depthMode = DepthMode.DEFAULT;
+        }
+
+        protected RelativePathLikeExpressions( String[] paths,
+                                               int depth,
+                                               DepthMode depthMode ) {
+            this.paths = Arrays.asList(paths);
+            this.depth = depth;
+            this.depthMode = depthMode;
+        }
+
+        protected boolean isEmpty() {
+            return paths == null || paths.isEmpty();
+        }
+
+        public Iterator<String> iterator() {
+            return paths.iterator();
+        }
+    }
+
+    protected RelativePathLikeExpressions relativePathLikeExpressions( PathExpression pathExpression ) {
         List<StepExpression> steps = pathExpression.getSteps();
-        if (steps.isEmpty()) return new String[] {};
-        if (steps.size() == 1 && steps.get(0) instanceof DescendantOrSelf) return new String[] {};
+        if (steps.isEmpty()) return new RelativePathLikeExpressions();
+        if (steps.size() == 1 && steps.get(0) instanceof DescendantOrSelf) return new RelativePathLikeExpressions();
         PathLikeBuilder builder = new SinglePathLikeBuilder();
-        for (StepExpression step : steps) {
+        int depth = 0;
+        DepthMode depthMode = DepthMode.EXACT;
+        for (Iterator<StepExpression> iterator = steps.iterator(); iterator.hasNext();) {
+            StepExpression step = iterator.next();
             if (step instanceof DescendantOrSelf) {
+                ++depth;
+                depthMode = DepthMode.DEFAULT;
                 if (builder.isEmpty()) {
                     builder.append("%/");
                 } else {
                     builder = new DualPathLikeBuilder(builder.clone(), builder.append("/%"));
                 }
             } else if (step instanceof AxisStep) {
+                ++depth;
                 AxisStep axis = (AxisStep)step;
                 NodeTest nodeTest = axis.getNodeTest();
                 assert !(nodeTest instanceof ElementTest);
@@ -764,7 +824,7 @@
                 }
             }
         }
-        return builder.getPaths();
+        return new RelativePathLikeExpressions(builder.getPaths(), depth, depthMode);
     }
 
     protected static interface PathLikeBuilder {

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -42,6 +42,7 @@
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.property.Name;
@@ -130,9 +131,9 @@
 
             // Create a branch that contains some same-name-siblings ...
             Node other = session.getRootNode().addNode("Other", "nt:unstructured");
-            other.addNode("NodeA", "nt:unstructured");
-            other.addNode("NodeA", "nt:unstructured");
-            other.addNode("NodeA", "nt:unstructured");
+            other.addNode("NodeA", "nt:unstructured").setProperty("something", "value3");
+            other.addNode("NodeA", "nt:unstructured").setProperty("something", "value2");
+            other.addNode("NodeA", "nt:unstructured").setProperty("something", "value1");
             session.save();
 
             // Prime creating a first XPath query and SQL query ...
@@ -258,8 +259,12 @@
 
     @Test
     public void shouldBeAbleToCreateXPathQuery() throws RepositoryException {
-        Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured)", Query.XPATH);
+        Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,car:Car)", Query.XPATH);
         assertThat(query, is(notNullValue()));
+        assertResults(query, query.execute(), 12);
+
+        query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured)", Query.XPATH);
+        assertThat(query, is(notNullValue()));
         assertResults(query, query.execute(), 21);
     }
 
@@ -284,18 +289,91 @@
 
     @Test
     public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByPropertyValue() throws RepositoryException {
+        QueryManager manager = session.getWorkspace().getQueryManager();
+        Query query = manager.createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        print = true;
+        assertResults(query, result, 21);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+
+        query = manager.createQuery("//element(*,car:Car) order by @car:year", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        result = query.execute();
+        print = true;
+        assertResults(query, result, 12);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNode() throws RepositoryException {
+        Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        print = true;
+        assertResults(query, result, 3);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNodeAndWithProperty() throws RepositoryException {
+        Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*[@car:year]", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        assertResults(query, result, 3);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNodeAndWithPropertyOrderedByProperty() throws RepositoryException {
         Query query = session.getWorkspace()
                              .getQueryManager()
-                             .createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
+                             .createQuery(" /jcr:root/Cars/Hybrid/*[@car:year] order by @car:year ascending", Query.XPATH);
         assertThat(query, is(notNullValue()));
         QueryResult result = query.execute();
+        assertResults(query, result, 3);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPath() throws RepositoryException {
+        Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars//*", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
         print = true;
-        assertResults(query, result, 21);
+        assertResults(query, result, 16);
         assertThat(result, is(notNullValue()));
         assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
     }
 
     @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPathAndWithProperty() throws RepositoryException {
+        Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars//*[@car:year]", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        assertResults(query, result, 16);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+    }
+
+    @Test
+    public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPathAndWithPropertyOrderedByProperty() throws RepositoryException {
+        Query query = session.getWorkspace()
+                             .getQueryManager()
+                             .createQuery(" /jcr:root/Cars//*[@car:year] order by @car:year ascending", Query.XPATH);
+        assertThat(query, is(notNullValue()));
+        QueryResult result = query.execute();
+        assertResults(query, result, 16);
+        assertThat(result, is(notNullValue()));
+        assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+    }
+
+    @Test
     public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByScore() throws RepositoryException {
         Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured) order by jcr:score()",
                                                                            Query.XPATH);

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -189,6 +189,23 @@
                                                                                                         literal("3")))));
     }
 
+    @Test
+    public void shouldParsePathExpressionWithNameTestsAndWildcard() {
+        assertThat(parser.parsePathExpr(tokenize("/jcr:root/a/b/*")), is(pathExpr(axisStep(nameTest("jcr", "root")),
+                                                                                  axisStep(nameTest("a")),
+                                                                                  axisStep(nameTest("b")),
+                                                                                  axisStep(wildcard()))));
+    }
+
+    @Test
+    public void shouldParsePathExpressionWithNameTestsAndWildcardAndPropertyExistence() {
+        assertThat(parser.parsePathExpr(tokenize("/jcr:root/a/b/*[@prop]")),
+                   is(pathExpr(axisStep(nameTest("jcr", "root")),
+                               axisStep(nameTest("a")),
+                               axisStep(nameTest("b")),
+                               axisStep(wildcard(), attributeNameTest(nameTest("prop"))))));
+    }
+
     // ----------------------------------------------------------------------------------------------------------------
     // Relative path expression
     // ----------------------------------------------------------------------------------------------------------------

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -112,6 +112,18 @@
     }
 
     @Test
+    public void shouldTranslateFromXPathUsingNameTestsAndWildcardWithNoPredicates() {
+        assertThat(xpath("/jcr:root/testroot/*"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ as nodeSet1 WHERE PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)"));
+    }
+
+    @Test
+    public void shouldTranslateFromXPathUsingNameTestsAndWildcardWithPredicates() {
+        assertThat(xpath("/jcr:root/testroot/*[@prop1]"),
+                   isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ as nodeSet1 WHERE (PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)) AND nodeSet1.prop1 IS NOT NULL"));
+    }
+
+    @Test
     public void shouldTranslateFromXPathContainingPathWithDescendantOrSelf() {
         assertThat(xpath("/jcr:root/a/b//c"),
                    isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c' OR PATH(nodeSet1) LIKE '/a/b/%/c'"));
@@ -272,11 +284,15 @@
     }
 
     @Test
-    public void shouldTranslateFromXPathUsingOrderBy() {
+    public void shouldTranslateFromXPathUsingElementWildcardAndOrderBy() {
         assertThat(xpath("//element(*,*) order by @title"),
                    isSql("SELECT nodeSet1.title FROM __ALLNODES__ AS nodeSet1 ORDER BY nodeSet1.title"));
+    }
+
+    @Test
+    public void shouldTranslateFromXPathUsingNameTestsAndWildcardOrderBy() {
         assertThat(xpath("/jcr:root/testroot/*[@prop1] order by @prop1 ascending"),
-                   isSql("SELECT nodeSet1.prop1 FROM __ALLNODES__ as nodeSet1 WHERE PATH(nodeSet1) = '/testroot' AND nodeSet1.prop1 IS NOT NULL ORDER BY nodeSet1.prop1"));
+                   isSql("SELECT nodeSet1.prop1 FROM __ALLNODES__ as nodeSet1 WHERE (PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)) AND nodeSet1.prop1 IS NOT NULL ORDER BY nodeSet1.prop1"));
     }
 
     @Test

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-08 05:45:17 UTC (rev 1556)
@@ -441,8 +441,8 @@
             for (Object value : property) {
                 if (value == null) continue;
                 stringValue = processor.stringFactory.create(value);
-                // Add a separate field for each property value ...
-                doc.add(new Field(nameString, stringValue, rule.getStoreOption(), rule.getIndexOption()));
+                // Add a separate field for each property value in exact form (not analyzed) ...
+                doc.add(new Field(nameString, stringValue, rule.getStoreOption(), Field.Index.NOT_ANALYZED));
 
                 if (rule.getIndexOption() != Field.Index.NO) {
                     // This field is to be full-text searchable ...
@@ -463,6 +463,7 @@
         if (fullTextSearchValue != null && fullTextSearchValue.length() != 0) {
             doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
         }
+        // System.out.println("Replaced " + doc);
         getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);
     }
 
@@ -883,6 +884,22 @@
         return new MatchNoneQuery();
     }
 
+    protected String likeExpresionForWildcardPath( String path ) {
+        if (path.equals("/") || path.equals("%")) return path;
+        StringBuilder sb = new StringBuilder();
+        for (String segment : path.split("/")) {
+            if (segment.length() == 0) continue;
+            sb.append("/");
+            sb.append(segment);
+            if (segment.equals("%") || segment.equals("_")) continue;
+            if (!segment.endsWith("]")) {
+                sb.append("[1]");
+            }
+        }
+        if (path.endsWith("/")) sb.append("/");
+        return sb.toString();
+    }
+
     public Query findNodesWith( NodePath nodePath,
                                 Operator operator,
                                 Object value,
@@ -897,6 +914,7 @@
                 return new NotQuery(findNodeAt(pathValue));
             case LIKE:
                 String likeExpression = processor.stringFactory.create(value);
+                likeExpression = likeExpresionForWildcardPath(likeExpression);
                 query = findNodesLike(ContentIndex.PATH, likeExpression, caseSensitive);
                 break;
             case GREATER_THAN:


From dna-commits at lists.jboss.org  Fri Jan  8 00:45:55 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 00:45:55 -0500
Subject: [dna-commits] DNA SVN: r1557 - in trunk:
	extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query
	and 1 other directory.
Message-ID: <201001080545.o085jt6h012013@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-08 00:45:54 -0500 (Fri, 08 Jan 2010)
New Revision: 1557

Modified:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java
Log:
DNA-630 DNA-613 This was found while trying to fix DNA-613.

I logged this because this was so tricky. LuceneSearchEngine works by building up a (complex) Lucene Query object and executing that, then collecting the tuples from the Lucene documents that are returned in the results.

In this case, the AQM query included a constraint (among others) that LuceneSearchEngine converted into a custom HasValueQuery class (which extends Query). HasValueQuery creates a custom ExistsScorer class (which subclasses org.apache.lucene.search.Scorer), and the problem was that the 'nextDoc()' method was implemented incorrectly. It uses an internal counter to walk through the documents (handed to it in the constructor), and was not (correctly) checking whether the docId was less than the maxDoc, which is obtained from the IndexReader.maxDoc().

Essentially, the ExistsScorer was iterating through more documents than in the reader, and thus the 'read past EOF'. (The IndexReader uses a random-access mechanism to seek to the desired document, but if the document ID is too big, the seek goes beyond the EOF.)

I checked the other Query subclasses in org.jboss.dna.search.lucene.query, and found a few other classes that were also implemented incorrectly. These were fixed as well, and all tests pass.

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-08 05:45:54 UTC (rev 1557)
@@ -177,7 +177,7 @@
             // These might not all be level one tests
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathPosIndexTest.class);
             // addTestSuite(org.apache.jackrabbit.test.api.query.XPathDocOrderTest.class);
-            // addTestSuite(org.apache.jackrabbit.test.api.query.XPathOrderByTest.class);
+            addTestSuite(org.apache.jackrabbit.test.api.query.XPathOrderByTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathJcrPathTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.DerefQueryLevel1Test.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.GetLanguageTest.class);

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java	2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java	2010-01-08 05:45:54 UTC (rev 1557)
@@ -267,14 +267,14 @@
         public int nextDoc() throws IOException {
             do {
                 ++docId;
+                if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
                 if (reader.isDeleted(docId)) {
                     // We should skip this document ...
                     continue;
                 }
                 ValueType value = readFromDocument(reader, docId);
                 if (evaluator.satisfiesConstraint(value, constraintValue)) return docId;
-            } while (docId < maxDocId);
-            return Scorer.NO_MORE_DOCS;
+            } while (true);
         }
 
         /**

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java	2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java	2010-01-08 05:45:54 UTC (rev 1557)
@@ -219,13 +219,13 @@
         public int nextDoc() throws IOException {
             do {
                 ++docId;
+                if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
                 if (reader.isDeleted(docId)) {
                     // We should skip this document ...
                     continue;
                 }
                 if (hasValue(reader, docId)) return docId;
-            } while (docId < maxDocId);
-            return Scorer.NO_MORE_DOCS;
+            } while (true);
         }
 
         /**

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java	2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java	2010-01-08 05:45:54 UTC (rev 1557)
@@ -221,13 +221,13 @@
         public int nextDoc() throws IOException {
             do {
                 ++docId;
+                if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
                 if (reader.isDeleted(docId)) {
                     // We should skip this document ...
                     continue;
                 }
                 if (includeDocument(reader, docId)) return docId;
-            } while (docId < maxDocId);
-            return Scorer.NO_MORE_DOCS;
+            } while (true);
         }
 
         /**


From dna-commits at lists.jboss.org  Fri Jan  8 00:46:51 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 00:46:51 -0500
Subject: [dna-commits] DNA SVN: r1558 - in trunk:
	dna-integration-tests/src/test/resources/tck/filesystem and 4
	other directories.
Message-ID: <201001080546.o085kpgL012063@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-08 00:46:48 -0500 (Fri, 08 Jan 2010)
New Revision: 1558

Added:
   trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java
   trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
DNA-613 minor changes to get the FileSystemRepositoryTckTest to run with the newly-added XPath TCK tests.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java	2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java	2010-01-08 05:46:48 UTC (rev 1558)
@@ -64,10 +64,17 @@
         try {
             return new JodaDateTime(value.trim());
         } catch (IllegalArgumentException err) {
-            throw new ValueFormatException(value, getPropertyType(),
-                                           GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
-                                                                              DateTime.class.getSimpleName(),
-                                                                              value), err);
+            // See if this string represents a LONG value ...
+            try {
+                Long longValue = Long.parseLong(value);
+                return new JodaDateTime(longValue);
+            } catch (NumberFormatException e) {
+                // Guess it wasn't a long value ...
+                throw new ValueFormatException(value, getPropertyType(),
+                                               GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
+                                                                                  DateTime.class.getSimpleName(),
+                                                                                  value), err);
+            }
         }
     }
 

Added: trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode	                        (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode	2010-01-08 05:46:48 UTC (rev 1558)
@@ -0,0 +1 @@
+Test content

Modified: trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties	2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties	2010-01-08 05:46:48 UTC (rev 1558)
@@ -1,6 +1,7 @@
 # Placeholder for any overlaid properties for this repo configuration
 
 javax.jcr.tck.dnaSkipImport=true
+query.xpath.pos.index=false
 
 
 javax.jcr.tck.nodetype=nt\:folder

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2010-01-08 05:46:48 UTC (rev 1558)
@@ -392,13 +392,13 @@
      * @throws IllegalArgumentException If <code>executionContext</code>, <code>connectionFactory</code>,
      *         <code>repositorySourceName</code>, or <code>repositoryObservable</code> is <code>null</code>.
      */
-    public JcrRepository( ExecutionContext executionContext,
-                          RepositoryConnectionFactory connectionFactory,
-                          String repositorySourceName,
-                          Observable repositoryObservable,
-                          RepositorySourceCapabilities repositorySourceCapabilities,
-                          Map<String, String> descriptors,
-                          Map<Option, String> options ) throws RepositoryException {
+    JcrRepository( ExecutionContext executionContext,
+                   RepositoryConnectionFactory connectionFactory,
+                   String repositorySourceName,
+                   Observable repositoryObservable,
+                   RepositorySourceCapabilities repositorySourceCapabilities,
+                   Map<String, String> descriptors,
+                   Map<Option, String> options ) throws RepositoryException {
         CheckArg.isNotNull(executionContext, "executionContext");
         CheckArg.isNotNull(connectionFactory, "connectionFactory");
         CheckArg.isNotNull(repositorySourceName, "repositorySourceName");
@@ -415,11 +415,17 @@
         modifiableDescriptors.put(Repository.LEVEL_2_SUPPORTED, "true");
         modifiableDescriptors.put(Repository.OPTION_LOCKING_SUPPORTED, "true");
         modifiableDescriptors.put(Repository.OPTION_OBSERVATION_SUPPORTED, "true");
-        modifiableDescriptors.put(Repository.OPTION_QUERY_SQL_SUPPORTED, "false");
+        modifiableDescriptors.put(Repository.OPTION_QUERY_SQL_SUPPORTED, "false"); // not JCR 1.0 SQL
         modifiableDescriptors.put(Repository.OPTION_TRANSACTIONS_SUPPORTED, "false");
         modifiableDescriptors.put(Repository.OPTION_VERSIONING_SUPPORTED, "false");
-        modifiableDescriptors.put(Repository.QUERY_XPATH_DOC_ORDER, "true");
-        modifiableDescriptors.put(Repository.QUERY_XPATH_POS_INDEX, "true");
+        if (!modifiableDescriptors.containsKey(Repository.QUERY_XPATH_DOC_ORDER)) {
+            // don't override what was supplied ...
+            modifiableDescriptors.put(Repository.QUERY_XPATH_DOC_ORDER, "true");
+        }
+        if (!modifiableDescriptors.containsKey(Repository.QUERY_XPATH_POS_INDEX)) {
+            // don't override what was supplied ...
+            modifiableDescriptors.put(Repository.QUERY_XPATH_POS_INDEX, "true");
+        }
         // Vendor-specific descriptors (REP_XXX) will only be initialized if not already present, allowing for customer branding.
         if (!modifiableDescriptors.containsKey(Repository.REP_NAME_DESC)) {
             modifiableDescriptors.put(Repository.REP_NAME_DESC, JcrI18n.REP_NAME_DESC.text());

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java	2010-01-08 05:46:48 UTC (rev 1558)
@@ -293,7 +293,6 @@
         Query query = manager.createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
         assertThat(query, is(notNullValue()));
         QueryResult result = query.execute();
-        print = true;
         assertResults(query, result, 21);
         assertThat(result, is(notNullValue()));
         assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
@@ -301,7 +300,6 @@
         query = manager.createQuery("//element(*,car:Car) order by @car:year", Query.XPATH);
         assertThat(query, is(notNullValue()));
         result = query.execute();
-        print = true;
         assertResults(query, result, 12);
         assertThat(result, is(notNullValue()));
         assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
@@ -312,7 +310,6 @@
         Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*", Query.XPATH);
         assertThat(query, is(notNullValue()));
         QueryResult result = query.execute();
-        print = true;
         assertResults(query, result, 3);
         assertThat(result, is(notNullValue()));
         assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
@@ -389,7 +386,6 @@
         Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root/Other/NodeA", Query.XPATH);
         assertThat(query, is(notNullValue()));
         QueryResult result = query.execute();
-        print = true;
         assertResults(query, result, 1);
         assertThat(result, is(notNullValue()));
         assertThat(result.getNodes().nextNode().getIndex(), is(1));
@@ -398,7 +394,6 @@
         query = session.getWorkspace().getQueryManager().createQuery("/jcr:root/Other/NodeA[2]", Query.XPATH);
         assertThat(query, is(notNullValue()));
         result = query.execute();
-        print = true;
         assertResults(query, result, 1);
         assertThat(result, is(notNullValue()));
         assertThat(result.getNodes().nextNode().getIndex(), is(2));

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-08 05:46:48 UTC (rev 1558)
@@ -463,7 +463,6 @@
         if (fullTextSearchValue != null && fullTextSearchValue.length() != 0) {
             doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
         }
-        // System.out.println("Replaced " + doc);
         getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);
     }
 


From dna-commits at lists.jboss.org  Fri Jan  8 00:47:10 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 00:47:10 -0500
Subject: [dna-commits] DNA SVN: r1559 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <201001080547.o085lAFM012075@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-08 00:47:10 -0500 (Fri, 08 Jan 2010)
New Revision: 1559

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
Log:
Removed warnings about unused exceptions in throws-clauses.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-08 05:46:48 UTC (rev 1558)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java	2010-01-08 05:47:10 UTC (rev 1559)
@@ -159,7 +159,7 @@
                                    QueryCommand query,
                                    Schemata schemata,
                                    PlanHints hints,
-                                   Map<String, Object> variables ) throws InvalidQueryException {
+                                   Map<String, Object> variables ) {
             Graph.BuildQuery builder = workspaceGraph(workspaceName).query(query, schemata);
             if (variables != null) builder.using(variables);
             if (hints != null) builder.using(hints);
@@ -170,7 +170,7 @@
         public QueryResults search( String workspaceName,
                                     String searchExpression,
                                     int maxRowCount,
-                                    int offset ) throws InvalidQueryException {
+                                    int offset ) {
             return workspaceGraph(workspaceName).search(searchExpression, maxRowCount, offset);
         }
 
@@ -364,7 +364,7 @@
         public QueryResults search( String workspaceName,
                                     String searchExpression,
                                     int maxRowCount,
-                                    int offset ) throws InvalidQueryException {
+                                    int offset ) {
             Graph graph = Graph.create(sourceName, connectionFactory, context);
 
             if (workspaceName != null) {


From dna-commits at lists.jboss.org  Fri Jan  8 06:51:30 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 06:51:30 -0500
Subject: [dna-commits] DNA SVN: r1560 -
	trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta.
Message-ID: <201001081151.o08BpUmK026125@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-08 06:51:30 -0500 (Fri, 08 Jan 2010)
New Revision: 1560

Modified:
   trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
Log:
DNA-632


Modified: trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-08 05:47:10 UTC (rev 1559)
+++ trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties	2010-01-08 11:51:30 UTC (rev 1560)
@@ -10,4 +10,7 @@
 # There's only one workspace per repository for this connector right now
 javax.jcr.tck.workspacename=default
 
+# Need to set a real property for XPath query tests
+javax.jcr.tck.propertyname1=mj:typeName
 
+


From dna-commits at lists.jboss.org  Fri Jan  8 08:45:45 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 08:45:45 -0500
Subject: [dna-commits] DNA SVN: r1561 - in trunk:
	extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle
	and 1 other directory.
Message-ID: <201001081345.o08DjjE5019433@svn01.web.mwc.hst.phx2.redhat.com>

Author: blafond
Date: 2010-01-08 08:45:44 -0500 (Fri, 08 Jan 2010)
New Revision: 1561

Modified:
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
   trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
   trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
Log:
DNA-49 Removing System.out's in tests.

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java	2010-01-08 13:45:44 UTC (rev 1561)
@@ -59,7 +59,7 @@
     }
     
     public void uploadFile(String folder, String fileName, String testMethod) throws RepositoryException, IOException {
-        printStart(fileName, testMethod);
+        //printStart(fileName, testMethod);
 
         URL url = getUrl(folder + fileName);
         uploadFile(url);

Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java	2010-01-08 13:45:44 UTC (rev 1561)
@@ -191,7 +191,7 @@
                     assertNode(viewNode, "col1", "ddl:columnReference");
                     
                     Node tableNode = assertNode(ddlNode, "table_5", "ddl:createTableStatement");
-                    printChildProperties(tableNode);
+                    //printChildProperties(tableNode);
                     assertEquals(18, tableNode.getNodes().getSize());
                 }
             }

Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java	2010-01-08 13:45:44 UTC (rev 1561)
@@ -355,8 +355,6 @@
     
     @Test
     public void shouldParseCreateMaterializedView() {
-        setPrintToConsole(true);
-        parser.setTestMode(isPrintToConsole());
         printTest("shouldParseCreateMaterializedView()");
         String content = " CREATE MATERIALIZED VIEW sales_mv" + NEWLINE
                                 + "BUILD IMMEDIATE" + NEWLINE
@@ -377,8 +375,6 @@
     
     @Test
     public void shouldParseCreateMaterializedViewLog() {
-        setPrintToConsole(true);
-        parser.setTestMode(isPrintToConsole());
         printTest("shouldParseCreateMaterializedViewLog()");
         String content = "CREATE MATERIALIZED VIEW LOG ON products" + NEWLINE
                                 + "WITH ROWID, SEQUENCE (prod_id)" + NEWLINE


From dna-commits at lists.jboss.org  Fri Jan  8 11:01:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 11:01:34 -0500
Subject: [dna-commits] DNA SVN: r1562 -
	trunk/dna-common/src/main/java/org/jboss/dna/common/text.
Message-ID: <201001081601.o08G1Y3L015149@svn01.web.mwc.hst.phx2.redhat.com>

Author: spagop
Date: 2010-01-08 11:01:33 -0500 (Fri, 08 Jan 2010)
New Revision: 1562

Modified:
   trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java
Log:
deleted the dependency to com.sun.org.apache.xerces.internal.impl.dv.util.Base6 and replace it the one of org.jboss.dna.common.util.Base64

Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java	2010-01-08 13:45:44 UTC (rev 1561)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java	2010-01-08 16:01:33 UTC (rev 1562)
@@ -24,10 +24,10 @@
 package org.jboss.dna.common.text;
 
 import java.security.NoSuchAlgorithmException;
+import org.jboss.dna.common.util.Base64;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.SecureHash;
 import org.jboss.dna.common.util.SecureHash.Algorithm;
-import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
 
 /**
  * A text encoder that performs a secure hash of the input text and returns that hash as the encoded text. This encoder can be
@@ -88,7 +88,7 @@
     public String encode( String text ) {
         try {
             byte[] hash = SecureHash.getHash(algorithm, text.getBytes());
-            String result = Base64.encode(hash);
+            String result = Base64.encodeBytes(hash);
             return result.length() < maxLength ? result : result.substring(0, maxLength);
         } catch (NoSuchAlgorithmException e) {
             return text;


From dna-commits at lists.jboss.org  Fri Jan  8 12:18:24 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 12:18:24 -0500
Subject: [dna-commits] DNA SVN: r1563 - trunk/web/dna-web-jcr-rest-client.
Message-ID: <201001081718.o08HIOiw003905@svn01.web.mwc.hst.phx2.redhat.com>

Author: spagop
Date: 2010-01-08 12:18:23 -0500 (Fri, 08 Jan 2010)
New Revision: 1563

Modified:
   trunk/web/dna-web-jcr-rest-client/pom.xml
Log:
CLOSED - issue DNA-614: REST client osgi bundle for the Eclipse plugin 
https://jira.jboss.org/jira/browse/DNA-614

Modified: trunk/web/dna-web-jcr-rest-client/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-08 16:01:33 UTC (rev 1562)
+++ trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-08 17:18:23 UTC (rev 1563)
@@ -37,22 +37,22 @@
 			<version>${project.version}</version>
 			<scope>integration-test</scope>
 		</dependency>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxrs</artifactId>
-            <version>1.2.1.GA</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxb-provider</artifactId>
-            <version>1.2.1.GA</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jettison-provider</artifactId>
-            <version>1.2.1.GA</version>
-        </dependency>
 		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxrs</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxb-provider</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jettison-provider</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.httpcomponents</groupId>
 			<artifactId>httpclient</artifactId>
 			<version>4.0</version>
@@ -209,6 +209,32 @@
 							</execution>
 						</executions>
 					</plugin>
+
+					<!--
+						Adding OSGI metadata to the JAR without changing the packaging
+						type.
+					-->
+					<plugin>
+						<artifactId>maven-jar-plugin</artifactId>
+						<configuration>
+							<archive>
+								<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+							</archive>
+						</configuration>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.felix</groupId>
+						<artifactId>maven-bundle-plugin</artifactId>
+						<executions>
+							<execution>
+								<id>bundle-manifest</id>
+								<phase>process-classes</phase>
+								<goals>
+									<goal>manifest</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
 				</plugins>
 			</build>
 		</profile>


From dna-commits at lists.jboss.org  Fri Jan  8 12:19:03 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 12:19:03 -0500
Subject: [dna-commits] DNA SVN:  r1564 - trunk/dna-common.
Message-ID: <201001081719.o08HJ3jx003922@svn01.web.mwc.hst.phx2.redhat.com>

Author: spagop
Date: 2010-01-08 12:19:02 -0500 (Fri, 08 Jan 2010)
New Revision: 1564

Modified:
   trunk/dna-common/pom.xml
Log:
CLOSED - issue DNA-614: REST client osgi bundle for the Eclipse plugin 
https://jira.jboss.org/jira/browse/DNA-614

Modified: trunk/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2010-01-08 17:18:23 UTC (rev 1563)
+++ trunk/dna-common/pom.xml	2010-01-08 17:19:02 UTC (rev 1564)
@@ -1,66 +1,97 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-common</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Common</name>
-  <description>JBoss DNA Common Library and Utilities</description>
-  <url>http://labs.jboss.org/dna</url>
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <!-- 
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7-SNAPSHOT</version>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-common</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Common</name>
+	<description>JBoss DNA Common Library and Utilities</description>
+	<url>http://labs.jboss.org/dna</url>
+
+	<build>
+		<plugins>
+			<!--
+				Adding OSGI metadata to the JAR without changing the packaging type.
+			-->
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<configuration>
+					<archive>
+						<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>bundle-manifest</id>
+						<phase>process-classes</phase>
+						<goals>
+							<goal>manifest</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<!--
+		Define the dependencies. Note that all version and scopes default to
+		those defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<!-- 
     Testing (note the scope)
     -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
     Java Concurrency in Practice annotations
     -->
-	<dependency>
-	  <groupId>net.jcip</groupId>
-	  <artifactId>jcip-annotations</artifactId>
-	</dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
 </project>
\ No newline at end of file


From dna-commits at lists.jboss.org  Fri Jan  8 12:31:57 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 8 Jan 2010 12:31:57 -0500
Subject: [dna-commits] DNA SVN:  r1565 - trunk.
Message-ID: <201001081731.o08HVvUl005455@svn01.web.mwc.hst.phx2.redhat.com>

Author: spagop
Date: 2010-01-08 12:31:57 -0500 (Fri, 08 Jan 2010)
New Revision: 1565

Modified:
   trunk/pom.xml
Log:
DONE REST client osgi bundle for the Eclipse plugin

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-08 17:19:02 UTC (rev 1564)
+++ trunk/pom.xml	2010-01-08 17:31:57 UTC (rev 1565)
@@ -690,6 +690,12 @@
 					<artifactId>maven-jar-plugin</artifactId>
 					<version>2.2</version>
 				</plugin>
+				<plugin>
+			    	<groupId>org.apache.felix</groupId>
+			    	<artifactId>maven-bundle-plugin</artifactId>
+			    	<extensions>true</extensions>
+					<version>1.4.3</version>
+			   </plugin>
 			</plugins>
 		</pluginManagement>
 		<plugins>


From dna-commits at lists.jboss.org  Sat Jan  9 06:58:02 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 06:58:02 -0500
Subject: [dna-commits] DNA SVN: r1566 - in trunk: dna-jcr-tck and 2 other
	directories.
Message-ID: <201001091158.o09Bw2RW016301@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-09 06:58:01 -0500 (Sat, 09 Jan 2010)
New Revision: 1566

Removed:
   trunk/dna-jcr-tck/src/test/resources/repositoryForTckTests.xml
Modified:
   trunk/dna-jcr-tck/pom.xml
   trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170LevelOneTckTest.java
   trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170OptionalSqlQueryTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
Log:
DNA-639 JcrTckTest Missing Two Test Cases

Applied patch that updates the tests in JcrTckTest (and comments them out as they don't pass yet) and cleans up dna-jcr-tck, which had some misclassified test cases and some out-of-date dependencies,

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-08 17:31:57 UTC (rev 1565)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2010-01-09 11:58:01 UTC (rev 1566)
@@ -174,7 +174,7 @@
             addTestSuite(org.apache.jackrabbit.test.api.ExportDocViewTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.RepositoryLoginTest.class);
 
-            // These might not all be level one tests
+            // addTestSuite(org.apache.jackrabbit.test.api.query.ElementTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathPosIndexTest.class);
             // addTestSuite(org.apache.jackrabbit.test.api.query.XPathDocOrderTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathOrderByTest.class);
@@ -269,6 +269,7 @@
             addTestSuite(SerializationTest.class);
 
             addTestSuite(ValueFactoryTest.class);
+            // addTestSuite(XPathQueryLevel2Test.class);
         }
     }
 

Modified: trunk/dna-jcr-tck/pom.xml
===================================================================
--- trunk/dna-jcr-tck/pom.xml	2010-01-08 17:31:57 UTC (rev 1565)
+++ trunk/dna-jcr-tck/pom.xml	2010-01-09 11:58:01 UTC (rev 1566)
@@ -18,44 +18,50 @@
   defined in the dependencyManagement section of the parent pom.
   -->
   <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-repository</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-jcr</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-jcr</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-classloader-maven</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-repository</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+		</dependency>
+		<dependency>
+            <groupId>org.jboss.dna</groupId>
+            <artifactId>dna-sequencer-ddl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+		<!-- 
+      Testing (note the scope)
+    -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
     <!-- 
     Testing (note the scope)
     -->
@@ -81,19 +87,14 @@
       <artifactId>log4j</artifactId>
       <scope>test</scope>
     </dependency>
+
     <!-- 
-    Java Concurrency in Practice annotations
-    -->
-  <dependency>
-    <groupId>net.jcip</groupId>
-    <artifactId>jcip-annotations</artifactId>
-  </dependency>
-    <!-- 
       Java Content Repository API 
     -->
     <dependency>
       <groupId>javax.jcr</groupId>
       <artifactId>jcr</artifactId>
+      <scope>test</scope>
     </dependency>
     <!-- 
       Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
@@ -101,13 +102,11 @@
     <dependency>
       <groupId>org.apache.jackrabbit</groupId>
       <artifactId>jackrabbit-jcr-tests</artifactId>
+      <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>com.google.code.google-collections</groupId>
-      <artifactId>google-collect</artifactId>
-      <version>snapshot-20080530</version>
-    </dependency>
-
+		<!-- 
+      ID Trust (JAAS Dependency)
+    -->
 	<dependency>
 		<groupId>org.jboss.security</groupId>
 		<artifactId>jboss-idtrust</artifactId>
@@ -115,27 +114,32 @@
       <scope>test</scope>
 	</dependency>
 
-	<dependency>
-		<groupId>org.jboss.security</groupId>
-		<artifactId>jboss-security-spi-bare</artifactId>
-		<version>2.0.2.SP6</version>
+		<dependency>
+			<groupId>org.jboss.security</groupId>
+			<artifactId>jboss-security-spi-bare</artifactId>
+			<version>2.0.2.SP6</version>
       <scope>test</scope>
-	</dependency>
-	<dependency>
-		<groupId>org.jboss.security</groupId>
-		<artifactId>jbosssx-bare</artifactId>
-		<version>2.0.2.SP6</version>
-		<exclusions>
-			<exclusion>
-				<groupId>apache-xalan</groupId>
-				<artifactId>xalan</artifactId>
-		 	</exclusion>
-			<exclusion>
-				<groupId>apache-xalan</groupId>
-				<artifactId>serializer</artifactId>
-			</exclusion>
-		</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.security</groupId>
+			<artifactId>jbosssx-bare</artifactId>
+			<version>2.0.2.SP6</version>
       <scope>test</scope>
-	</dependency>    
+			<exclusions>
+				<exclusion>
+					<groupId>apache-xalan</groupId>
+					<artifactId>xalan</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>apache-xalan</groupId>
+					<artifactId>serializer</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+    <dependency>
+         <groupId>com.google.collections</groupId>
+         <artifactId>google-collections</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file

Modified: trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170LevelOneTckTest.java
===================================================================
--- trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170LevelOneTckTest.java	2010-01-08 17:31:57 UTC (rev 1565)
+++ trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170LevelOneTckTest.java	2010-01-09 11:58:01 UTC (rev 1566)
@@ -99,11 +99,6 @@
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathJcrPathTest.class);
 
             addTestSuite(org.apache.jackrabbit.test.api.query.ElementTest.class);
-            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByDateTest.class);
-            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByDoubleTest.class);
-            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByLongTest.class);
-            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByMultiTypeTest.class);
-            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByStringTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.QueryResultNodeIteratorTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathDocOrderTest.class);
             addTestSuite(org.apache.jackrabbit.test.api.query.XPathJcrPathTest.class);

Modified: trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170OptionalSqlQueryTckTest.java
===================================================================
--- trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170OptionalSqlQueryTckTest.java	2010-01-08 17:31:57 UTC (rev 1565)
+++ trunk/dna-jcr-tck/src/test/java/org/jboss/dna/jcr/Jsr170OptionalSqlQueryTckTest.java	2010-01-09 11:58:01 UTC (rev 1566)
@@ -65,6 +65,12 @@
         protected OptionalSqlQueryFeatureTests() {
             super("JCR Optional Feature (JCR-SQL Query) Tests");
 
+            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByDateTest.class);
+            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByDoubleTest.class);
+            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByLongTest.class);
+            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByMultiTypeTest.class);
+            addTestSuite(org.apache.jackrabbit.test.api.query.OrderByStringTest.class);
+
             addTestSuite(SQLOrderByTest.class);
             addTestSuite(SQLQueryLevel2Test.class);
             addTestSuite(SQLJoinTest.class);

Deleted: trunk/dna-jcr-tck/src/test/resources/repositoryForTckTests.xml
===================================================================
--- trunk/dna-jcr-tck/src/test/resources/repositoryForTckTests.xml	2010-01-08 17:31:57 UTC (rev 1565)
+++ trunk/dna-jcr-tck/src/test/resources/repositoryForTckTests.xml	2010-01-09 11:58:01 UTC (rev 1566)
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ JBoss DNA (http://www.jboss.org/dna)
-  ~
-  ~ See the COPYRIGHT.txt file distributed with this work for information
-  ~ regarding copyright ownership.  Some portions may be licensed
-  ~ to Red Hat, Inc. under one or more contributor license agreements.
-  ~ See the AUTHORS.txt file in the distribution for a full listing of 
-  ~ individual contributors.
-  ~
-  ~ JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
-  ~ is licensed to you under the terms of the GNU Lesser General Public License as
-  ~ published by the Free Software Foundation; either version 2.1 of
-  ~ the License, or (at your option) any later version.
-  ~
-  ~ JBoss DNA is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
-  ~ for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with this distribution; if not, write to:
-  ~ Free Software Foundation, Inc.
-  ~ 51 Franklin Street, Fifth Floor
-  ~ Boston, MA  02110-1301  USA
-  -->
-<testroot xmlns:jcr="http://www.jcp.org/jcr/1.0" 
-            xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
-            xmlns:dna="http://www.jboss.org/dna/1.0"
-    jcr:primaryType="nt:unstructured">
-    <nt:unstructured jcr:name="node1" prop1="&lt;foo&amp;foo&gt;" >
-       <!--  
-           This stanza checks for the jcr:xmltext special case for export as per JCR 1.0.1 section 6.4.2.3
-         -->
-       <nt:unstructured jcr:name="jcr:xmltext" jcr:xmlcharacters="This is my &quot;XML&quot; text!" />
-    </nt:unstructured>
-    <nt:unstructured jcr:name="node2 has a multi-word name" multi-valued-property="bar baz blah">
-       <!--  
-           This stanza checks that consecutive jcr:xmltext elements will be merged in the export as 
-           per JCR 1.0.1 section 6.4.2.3
-         -->
-       <nt:unstructured jcr:name="jcr:xmltext" jcr:xmlcharacters="This is my &quot;XML&quot; text!" />
-       <nt:unstructured jcr:name="jcr:xmltext" jcr:xmlcharacters="This is my &quot;other&quot; text!" />
-    </nt:unstructured>
-    <!--  
-       Test of unprintable character exports.
-       Cannot test \r character here on Windows as TCK XML Parser will replace it with \n and fail the comparison 
-      -->
-    <nt:unstructured jcr:name="node3" multi-line-property="Line&#009;1&#010;Line 2"/>
-	
-	<!-- Helps test date property conversion, mandatory properties (jcr:content), and primary items -->
-	<!-- 
-	<nt:folder jcr:name="hierarchyRoot" jcr:created="+2009-03-15T12:30:00.000Z">
-	   <nt:file jcr:name="testFile" jcr:created="+2009-03-15T13:30:00.000Z">
-	       <nt:unstructured jcr:name="jcr:content" />
-	   </nt:file> 
-	</nt:folder>
-	 -->
-</testroot>
\ No newline at end of file


From dna-commits at lists.jboss.org  Sat Jan  9 11:59:11 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 11:59:11 -0500
Subject: [dna-commits] DNA SVN: r1567 - in trunk/dna-jcr/src/main:
	resources/org/jboss/dna/jcr and 1 other directory.
Message-ID: <201001091659.o09GxB2j013271@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-09 11:59:11 -0500 (Sat, 09 Jan 2010)
New Revision: 1567

Added:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
Log:
DNA-640 JNDI-Based Deployment

Applied patch adds a standalone JNDI factory for the JcrEngine class that exposes JCR repositories. Multiple JCR repositories can be exposed by the same engine by creating successive JNDI references. Only one JcrEngine will be started/loaded.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2010-01-09 11:58:01 UTC (rev 1566)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2010-01-09 16:59:11 UTC (rev 1567)
@@ -32,6 +32,12 @@
 @Immutable
 public final class JcrI18n {
 
+    public static I18n engineStarting;
+    public static I18n engineStarted;
+    public static I18n couldNotStartEngine;
+    public static I18n engineStopping;
+    public static I18n engineStopped;
+
     public static I18n cannotConvertValue;
     public static I18n credentialsMustProvideJaasMethod;
     public static I18n mustBeInPrivilegedAction;

Added: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	                        (rev 0)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	2010-01-09 16:59:11 UTC (rev 1567)
@@ -0,0 +1,181 @@
+package org.jboss.dna.jcr;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.concurrent.TimeUnit;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NamingException;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.naming.event.EventContext;
+import javax.naming.event.NamespaceChangeListener;
+import javax.naming.event.NamingEvent;
+import javax.naming.event.NamingExceptionEvent;
+import javax.naming.spi.ObjectFactory;
+import org.jboss.dna.common.collection.Problem;
+import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.common.util.Logger;
+import org.xml.sax.SAXException;
+
+/**
+ * The {@code JndiRepositoryFactory} class provides a means of initializing and accessing {@link Repository repositories} in a
+ * JNDI tree. <h2>Example JNDI Configurations</h2> <h3>Tomcat 5.5</h3>
+ * <p>
+ * The following configuration can be added to added to server.xml in Tomcat 5.5 to initialize a {@code JcrRepository} and add it
+ * to the JNDI tree.
+ * 
+ * <pre>
+ *   &lt;GlobalNamingResources&gt;
+ *         &lt;!-- Other configuration omitted --&gt;
+ *      &lt;Resource name="jcr/local" auth="Container"
+ *           type="javax.jcr.Repository"
+ *           factory="org.jboss.dna.jcr.JndiRepositoryFactory"
+ *           configFile="/tck/default/configRepository.xml"
+ *           repositoryName="Test Repository Source"
+ *           /&gt;
+ *   &lt;/GlobalNamingResources&gt;
+ * </pre>
+ * 
+ * This will create a repository loaded from the resource &quot;/tck/default/configRepository.xml&quot; (which must be accessible
+ * through the classpath) and return the JCR repository named &quot;Test Repository Source&quot;. The name of the repository is
+ * important as a single configuration file may contain configuration information for many JCR repositories.
+ * </p>
+ */
+public class JndiRepositoryFactory implements ObjectFactory {
+
+    private static final String CONFIG_FILE = "configFile";
+    private static final String REPOSITORY_NAME = "repositoryName";
+
+    private static JcrEngine engine;
+    protected static final Logger log = Logger.getLogger(JndiRepositoryFactory.class);
+
+    /**
+     * {@link JcrConfiguration#loadFrom(java.io.InputStream) Initializes} and {@link JcrEngine#start() starts} the {@code
+     * JcrEngine} managed by this factory.
+     * 
+     * @param configResourceName the fully-qualified name of the resource containing the configuration information for the {@code
+     *        JcrEngine}
+     * @throws IOException if there is an error or problem reading the configuration resource at the supplied path
+     * @throws SAXException if the contents of the configuration resource are not valid XML
+     * @throws RepositoryException if the {@link JcrEngine#start() JcrEngine could not be started}
+     * @see JcrConfiguration#loadFrom(java.io.InputStream)
+     * @see Class#getResourceAsStream(String)
+     */
+    private static synchronized void initializeEngine( String configResourceName )
+        throws IOException, SAXException, RepositoryException {
+        if (engine != null) return;
+
+        log.info(JcrI18n.engineStarting);
+        long start = System.currentTimeMillis();
+
+        JcrConfiguration config = new JcrConfiguration();
+        engine = config.loadFrom(JndiRepositoryFactory.class.getResourceAsStream(configResourceName)).build();
+        engine.start();
+
+        Problems problems = engine.getProblems();
+        for (Problem problem : problems) {
+            switch (problem.getStatus()) {
+                case ERROR:
+                    log.error(problem.getThrowable(), problem.getMessage(), problem.getParameters());
+                    break;
+                case WARNING:
+                    log.warn(problem.getThrowable(), problem.getMessage(), problem.getParameters());
+                    break;
+                case INFO:
+                    log.info(problem.getThrowable(), problem.getMessage(), problem.getParameters());
+                    break;
+            }
+        }
+
+        if (problems.hasErrors()) {
+            throw new RepositoryException(JcrI18n.couldNotStartEngine.text());
+        }
+        log.info(JcrI18n.engineStarted, (System.currentTimeMillis() - start));
+    }
+
+    /**
+     * Creates an {@code JcrRepository} using the reference information specified.
+     * <p>
+     * This method first attempts to convert the {@code obj} parameter into a {@link Reference reference to JNDI configuration
+     * information}. If that is successful, a {@link JcrEngine} will be created (if not previously created by a call to this
+     * method) and it will be configured from the resource at the location specified by the {@code configFile} key in the
+     * reference. After the configuration is successful, the {@link JcrEngine#getRepository(String) JcrEngine will be queried} for
+     * the repository with the name specified by the value of the @{code repositoryName} key in the reference.
+     * </p>
+     * 
+     * @param obj the reference to the JNDI configuration information; must be a non-null instance of {@link Reference}
+     * @param name ignored
+     * @param nameCtx ignored
+     * @param environment ignored
+     * @throws IOException if there is an error or problem reading the configuration resource at the supplied path
+     * @throws SAXException if the contents of the configuration resource are not valid XML
+     * @throws NamingException if there is an error registering the namespace listener
+     * @throws RepositoryException if the {@link JcrEngine#start() JcrEngine could not be started}, the named repository does not
+     *         exist in the given configuration resource, or the named repository could not be created
+     */
+    @Override
+    public JcrRepository getObjectInstance( Object obj,
+                                            Name name,
+                                            Context nameCtx,
+                                            Hashtable<?, ?> environment )
+        throws IOException, SAXException, RepositoryException, NamingException {
+        if (!(obj instanceof Reference)) return null;
+
+        Reference ref = (Reference)obj;
+
+        if (engine == null) {
+            RefAddr configFile = ref.get(CONFIG_FILE);
+            assert configFile != null;
+
+            initializeEngine(configFile.getContent().toString());
+
+            if (nameCtx instanceof EventContext) {
+                EventContext evtCtx = (EventContext)nameCtx;
+
+                NamespaceChangeListener listener = new NamespaceChangeListener() {
+
+                    public void namingExceptionThrown( NamingExceptionEvent evt ) {
+                        evt.getException().printStackTrace();
+                    }
+
+                    public void objectAdded( NamingEvent evt ) {
+                    }
+
+                    public void objectRemoved( NamingEvent evt ) {
+                        Object oldObject = evt.getOldBinding().getObject();
+                        if (!(oldObject instanceof JcrEngine)) return;
+
+                        JcrEngine engine = (JcrEngine)oldObject;
+
+                        log.info(JcrI18n.engineStopping);
+                        long start = System.currentTimeMillis();
+                        engine.shutdown();
+                        try {
+                            engine.awaitTermination(30, TimeUnit.SECONDS);
+                            log.info(JcrI18n.engineStopped, (System.currentTimeMillis() - start));
+                        } catch (InterruptedException ie) {
+                            // Thread.interrupted();
+                        }
+                    }
+
+                    public void objectRenamed( NamingEvent evt ) {
+                    }
+
+                };
+
+                evtCtx.addNamingListener(name, EventContext.OBJECT_SCOPE, listener);
+            }
+        }
+
+        assert engine != null;
+
+        RefAddr repositoryName = ref.get(REPOSITORY_NAME);
+        assert repositoryName != null;
+
+        return engine.getRepository(repositoryName.getContent().toString());
+    }
+
+}


Property changes on: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
===================================================================
--- trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2010-01-09 11:58:01 UTC (rev 1566)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2010-01-09 16:59:11 UTC (rev 1567)
@@ -21,6 +21,13 @@
 # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 #
+
+engineStarting = JcrEngine starting...
+engineStarted = JcrEngine started in {0} ms
+couldNotStartEngine = Could not start the JcrEngine
+engineStopping = JcrEngine stopping...
+engineStopped = JcrEngine stopped in {0} ms
+
 cannotConvertValue = Cannot convert {0} value to {1}
 credentialsMustProvideJaasMethod = The Credentials class "{0}" must implement "public LoginContext getLoginContext();", be an instance of "javax.jcr.SimpleCredentials", or be an instance of "org.jboss.dna.jcr.SecurityContextCredentials"
 mustBeInPrivilegedAction=login() can only be called successfully from within a java.security.PrivilegedAction or when the ANONYMOUS_USER_ROLES repository option is set


From dna-commits at lists.jboss.org  Sat Jan  9 13:49:20 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 13:49:20 -0500
Subject: [dna-commits] DNA SVN: r1568 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <201001091849.o09InKoP005070@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-09 13:49:20 -0500 (Sat, 09 Jan 2010)
New Revision: 1568

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
Log:
Removed extra @Override

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	2010-01-09 16:59:11 UTC (rev 1567)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	2010-01-09 18:49:20 UTC (rev 1568)
@@ -116,7 +116,6 @@
      * @throws RepositoryException if the {@link JcrEngine#start() JcrEngine could not be started}, the named repository does not
      *         exist in the given configuration resource, or the named repository could not be created
      */
-    @Override
     public JcrRepository getObjectInstance( Object obj,
                                             Name name,
                                             Context nameCtx,


From dna-commits at lists.jboss.org  Sat Jan  9 16:29:12 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:29:12 -0500
Subject: [dna-commits] DNA SVN: r1569 - in
	trunk/docs/examples/gettingstarted/repositories:
	src/main/assembly and 8 other directories.
Message-ID: <201001092129.o09LTCkc009151@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:29:12 -0500 (Sat, 09 Jan 2010)
New Revision: 1569

Added:
   trunk/docs/examples/gettingstarted/repositories/ufoSource/
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/README.txt
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/zzyzx.txt
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/
   trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/frobozz.txt
Removed:
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/README.txt
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/martians/zzyzx.txt
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/venutians/frobozz.txt
Modified:
   trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
Log:
Moved location of the files and folders used by the UFO source from the 'src/main/resources' directory to be right under the top of the project. This allows the configRepository.xml file to simply reference the ufoSource directory as being in the same directory from which the tests are run, which also allows the build directory (where the examples are run via the command-line, per the Getting Started guide) to directly contain the 'ufoSource' folder instead of 'src/main/resources/ufoSource' (which is a bit confusing).

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml	2010-01-09 18:49:20 UTC (rev 1568)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml	2010-01-09 21:29:12 UTC (rev 1569)
@@ -21,12 +21,12 @@
       </includes>
     </fileSet>
     <fileSet>
-      <directory>src/main/resources/security/</directory>
-      <outputDirectory/>
+      <directory>src/main/resources/security</directory>
+      <outputDirectory>security</outputDirectory>
     </fileSet>
     <fileSet>
-      <directory>src/main/resources/ufoSource</directory>
-      <outputDirectory>src/main/resources/ufoSource</outputDirectory>
+      <directory>ufoSource</directory>
+      <outputDirectory>ufoSource</outputDirectory>
     </fileSet>
   </fileSets>
   <files>

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2010-01-09 18:49:20 UTC (rev 1568)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2010-01-09 21:29:12 UTC (rev 1569)
@@ -72,7 +72,7 @@
         files and folders as JCR nodes.  It can save JCR nodes too, but only if they have certain primary types.
         -->
         <dna:source jcr:name="UFOs" dna:classname="org.jboss.dna.connector.filesystem.FileSystemSource"
-        	dna:workspaceRootPath="./src/main/resources/ufoSource"
+        	dna:workspaceRootPath="./ufoSource"
         	dna:defaultWorkspaceName="workspace1"
         	dna:creatingWorkspacesAllowed="false"
         	dna:updatesAllowed="true"/>    

Deleted: trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/README.txt
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/README.txt	2010-01-09 18:49:20 UTC (rev 1568)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/README.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -1 +0,0 @@
-This workspace contains skeletal information on unconfirmed UFOs.
\ No newline at end of file

Deleted: trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/martians/zzyzx.txt
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/martians/zzyzx.txt	2010-01-09 18:49:20 UTC (rev 1568)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/martians/zzyzx.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -1,2 +0,0 @@
-The Zzyzx is the fastest vehicle in the Martian fleet.  It has spinning lasers and can drop 
-disintegration bombs on unsuspecting targets.

Deleted: trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/venutians/frobozz.txt
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/venutians/frobozz.txt	2010-01-09 18:49:20 UTC (rev 1568)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/venutians/frobozz.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -1 +0,0 @@
-The Venutian Frobozz travels faster than the speed of light and fires a death ray.
\ No newline at end of file

Copied: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/README.txt (from rev 1568, trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/README.txt)
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/README.txt	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/README.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -0,0 +1 @@
+This workspace contains skeletal information on unconfirmed UFOs.
\ No newline at end of file


Property changes on: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/README.txt
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/zzyzx.txt (from rev 1568, trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/martians/zzyzx.txt)
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/zzyzx.txt	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/zzyzx.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -0,0 +1,2 @@
+The Zzyzx is the fastest vehicle in the Martian fleet.  It has spinning lasers and can drop 
+disintegration bombs on unsuspecting targets.


Property changes on: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/martians/zzyzx.txt
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/frobozz.txt (from rev 1568, trunk/docs/examples/gettingstarted/repositories/src/main/resources/ufoSource/workspace1/venutians/frobozz.txt)
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/frobozz.txt	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/frobozz.txt	2010-01-09 21:29:12 UTC (rev 1569)
@@ -0,0 +1 @@
+The Venutian Frobozz travels faster than the speed of light and fires a death ray.
\ No newline at end of file


Property changes on: trunk/docs/examples/gettingstarted/repositories/ufoSource/workspace1/venutians/frobozz.txt
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF


From dna-commits at lists.jboss.org  Sat Jan  9 16:29:50 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:29:50 -0500
Subject: [dna-commits] DNA SVN: r1570 - in
	trunk/docs/gettingstarted/src/main/docbook/en-US: content and
	5 other directories.
Message-ID: <201001092129.o09LTolI009165@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:29:50 -0500 (Sat, 09 Jan 2010)
New Revision: 1570

Added:
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Preview.pdf
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Thumbnail.tiff
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/data.plist
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/image1.jpg
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.png
Removed:
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.png
Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/legal_notice.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Preview.pdf
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Thumbnail.tiff
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.png
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-client.png
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-navigating.png
Log:
DNA-621 Updated the Getting Started guide to reflect the state of 0.7, including updating the repositories example with some minor improvements.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -31,8 +31,9 @@
 <chapter id="conclusion">
 	<title>Wrapping Up</title>
 	<para>
-		This document provided a very high-level overview of JBoss DNA, introducing you to what would be required to use JBoss DNA
-		in your own application.  We saw two simple examples that showed two different aspects of JBoss DNA: the sequencing system
+		This document provides a very high-level overview of JBoss DNA, introducing you to some basic concepts 
+		and showing what would be required to use JBoss DNA in your own application.  
+		We saw two simple examples that showed two different aspects of JBoss DNA: the sequencing system
 		and the connector system.  Each of these examples showed how to create a JBoss DNA configuration, how to start up
 		the JBoss DNA engine, and how to then access a <code>javax.jcr.Repository</code> instance, and after that your application
 		just uses the standard JCR API.
@@ -41,12 +42,10 @@
 		For a more in-depth description of JBoss DNA and the internal workings, see our &ReferenceGuide;.
 		This also describes how to write your own custom sequencers or connectors.
     If you have any questions or comments, please feel free to contact JBoss DNA's
-    <ulink url="mailto:dna-users at jboss.org">user mailing list</ulink>
-    or use the
-    <ulink url="http://www.jboss.com/index.html?module=bb&amp;op=viewforum&amp;f=272">user forums</ulink>
-    or (preferably) the
-    <ulink url="http://www.jboss.org/dna/lists.html">mailing lists</ulink>.  If you find a bug or have a suggestion, please
-		create a new issue in the project's
+    <ulink url="mailto:dna-users at jboss.org">user mailing list</ulink>, use our
+    <ulink url="http://community.jboss.org/community/dna">discussion forums</ulink>,
+    or chat with the developers in the <ulink url="http://www.jboss.org/dna/chat.html">IRC chat room</ulink>.
+    If you find a bug or have a suggestion, please let us know or (better yet) create a new issue in the project's
     <ulink url="http://jira.jboss.org/jira/browse/DNA">JIRA issue management system</ulink>
     . If there's something in particular you're interested in, talk with the community - there may be others interested in the
     same thing.
@@ -54,19 +53,23 @@
 	<sect1 id="future">
 		<title>Future directions</title>
 		<para>
-			What's next for JBoss DNA?  Well, the sequencing system is just the beginning.  With this release, the sequencing system
-		  is stable enough so that more <link linkend="sequencers">sequencers</link> can be developed and used within your own applications.
-			We've also established the foundation for JBoss DNA repositories, including a number of <link linkend="repository-connectors">connectors</link>.
-			We'll continue to expand our library of sequencers and connectors, as well as expand our support of JCR.
-			Other components on our roadmap include a web user interface, a REST-ful server, and a view system that allows domain-specific
-			views of information in the repository.  These components are farther out on our roadmap, and at this time have not been
-			targeted to a particular release.
+			What's next for JBoss DNA?  We're very close to passing all of the JCR Technology Compatibility Kit (TCK) Level 1, Level 2
+			tests, plus the tests for the optional features including observation and locking.  (In fact, there are just a few outstanding
+			bugs that are preventing us from passing all of these test and becoming fully JCR compliant.)  We will soon be implementing
+			versioning, which is the last optional feature of JCR. 
+			We will also be adding support for clustering multiple JBoss DNA engines spread across multiple JVM processes.
+			And each release we continue to introduce more
+			<link linkend="repository-connectors">connectors</link> and <link linkend="sequencers">sequencers</link> to our library.
+			Other items on our long-term roadmap include a web user interface, Seam integration, and integration with even more kinds of
+			information systems and repositories.
 		</para>
 	</sect1>
 	<sect1 id="get_involved">
 		<title>Getting involved</title>
 		<para>
-		  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers or connectors on our
+		  If you're interested in getting involved with the JBoss DNA project, take a look at our 
+		  <ulink url="http://www.jboss.org/dna/community.html">community pages</ulink>, 
+		  and consider picking up one of the sequencers or connectors on our
 		  <ulink url="&Roadmap;">roadmap</ulink>.
 		  Or, check out <ulink url="&JIRA;">JIRA</ulink>
 		  for the list of features we've thought of.  If you think of one that's not there, please add it to JIRA!

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -98,7 +98,7 @@
 	</note>
 	<sect1 id="downloading">
 		<title>Downloading and compiling</title>
-		<para>The next step is to <ulink url="http://www.jboss.org/file-access/default/members/dna/downloads/0.4/jboss-dna-0.4-gettingstarted-examples.zip">download</ulink>
+		<para>The next step is to <ulink url="http://downloads.jboss.org/jbossdna/0.7/jboss-dna-0.7-gettingstarted-examples.zip">download</ulink>
       the example for this Getting Started guide, and extract the contents to a convenient location on your local disk.
       You'll find the example contains the following files, which are organized according to the standard Maven directory structure:</para>
 		<programlisting><![CDATA[
@@ -210,9 +210,18 @@
 					<para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the repository example application.</para>
 				</listitem>
 				<listitem>
+					<para><emphasis role="strong"><code>run.cmd</code></emphasis> is the Windows command file that will run the repository example application.</para>
+				</listitem>
+				<listitem>
 					<para><emphasis role="strong"><code>log4j.properties</code></emphasis> is the Log4J configuration file.</para>
 				</listitem>
 				<listitem>
+					<para><emphasis role="strong"><code>configRepository.xml</code></emphasis> is an XML file containing the information that the
+					  example application loads as its configuration and which defines the sources, repositories, sequencers (if used), and other
+					  components that make up the DNA JCR engine.
+					</para>
+				</listitem>
+				<listitem>
 					<para><emphasis role="strong"><code>aircraft.xml</code></emphasis> is an XML file containing the information that the
 					  example application imports into its "Aircraft" repository.
 					</para>
@@ -223,26 +232,27 @@
 					</para>
 				</listitem>
 				<listitem>
+					<para><emphasis role="strong"><code>ufoSource</code></emphasis> subdirectory containing several folders and files used by the
+					 file system connector for the "UFOs" repository.
+				  </para>
+				</listitem>
+				<listitem>
 					<para><emphasis role="strong"><code>aircraft.cnd</code></emphasis>, <emphasis role="strong"><code>cars.cnd</code></emphasis>,
 					and <emphasis role="strong"><code>vehicles.cnd</code></emphasis> are the CND files used for the three different JCR Repositories
 					set up in the example.  The <emphasis role="strong"><code>vehicles.cnd</code></emphasis> is just a combination of the other two
-					(with duplicates removed).
+					(with duplicates removed). The UFO source doesn't need a CND file, since the file system connector uses the 
+					"nt:file" and "nt:folder" node types built into the JCR standard.
 					</para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>configRepository.xml</code></emphasis> is an XML file containing the information that the
-					  example application loads as its configuration and which defines the sources, repositories, sequencers (if used), and other
-					  components that make up the DNA JCR engine.
-					</para>
-				</listitem>
-				<listitem>
 					<para><emphasis role="strong"><code>security</code></emphasis> subdirectory containing several files related to the
-					  JAAS implementation used for authentication.
+				  JAAS implementation used for authentication and authorization.
 				  </para>
 				</listitem>
 				<listitem>
 					<para><emphasis role="strong"><code>lib</code></emphasis> subdirectory contains the JARs for all of the JBoss DNA artifacts
-					  as well as those for other libraries required by JBoss DNA and the repository example.
+					  as well as those for other libraries required by JBoss DNA and the repository example. There are a lot of libraries here,
+					  but almost all of them are from the JPA connector (which depends upon Hibernate), HSQLDB, Lucene, and the JAAS implementation.
 			      </para>
 				</listitem>
 			</itemizedlist>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -105,8 +105,8 @@
 			of where or how that information is persisted or stored.  <emphasis>This is in fact the main purpose of JBoss DNA:
 			provide a JCR implementation that provides access to content stored in many different kinds of systems.</emphasis>
 			A JBoss DNA repository isn't yet another silo of information, but rather it's a JCR view of the information you already have
-			in your environment: files systems, databases, other repositories, services, applications, etc.  JBoss DNA can 
-			help you understand the systems and information you already have.
+			in your environment: files systems, databases, other repositories, services, applications, etc. <emphasis role="strong">JBoss DNA can 
+			help you understand the systems and information you already have.</emphasis>
 		</para>
 		<para>
 			Of course when you start providing a unified view of all this information, you start recognizing the need to store more
@@ -116,8 +116,15 @@
 			images, media, documents, presentations, application components, reusable libraries, configuration files,
 			application installations, databases schemas, management scripts, and so on.  As files are loaded into the repository,
 			JBoss DNA can <emphasis>sequence</emphasis> these files to extract from their content meaningful information that
-			can be stored in the repository, where it can then be searched, accessed, and analyzed using the JCR API.
+			can be stored in the repository, where your applications can find it by using the standard JCR API to search,
+			access, and use the information.
 		</para>
+		<para>
+			So, JBoss DNA <emphasis>is</emphasis> a JCR implementation that can automatically sequence files loaded into the repository,
+			and it can be used as a traditional JCR silo repository.
+			But it <emphasis>can</emphasis> also let your applications use the JCR API to access the content in other systems, and
+			can unify the content from multiple external systems and multiple storage systems to provide a single, federated repository.
+		</para>
 	</sect1>
 	<sect1 id="introduction_whats_next">
 		<title>What's next</title>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/legal_notice.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/legal_notice.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/legal_notice.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -42,7 +42,7 @@
         </address>
     </para>
     <para>
-        Copyright <trademark class="copyright"/> 2008-2009 by Red Hat, Inc.  This copyrighted material is made available to
+        Copyright <trademark class="copyright"/> 2008-2010 by Red Hat, Inc.  This copyrighted material is made available to
         anyone wishing to use, modify, copy, or redistribute it subject to the terms and conditions of the
         GNU <ulink url="http://www.gnu.org/licenses/lgpl-2.1.html">Lesser General Public License</ulink>, as published
         by the Free Software Foundation.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -39,13 +39,14 @@
     repositories, and how to build and use custom sequencers.</para>
   <para>
     If you have any questions or comments, please feel free to contact JBoss DNA's
-    <ulink url="mailto:dna-users at jboss.org">user mailing list</ulink>
-    or use the
-    <ulink url="http://www.jboss.com/index.html?module=bb&amp;op=viewforum&amp;f=272">user forums</ulink>
+    <ulink url="mailto:dna-users at jboss.org">user mailing list</ulink>,
+    use the
+    <ulink url="http://community.jboss.org/community/dna">user forums</ulink>,
+    or chat with the developers in the <ulink url="http://www.jboss.org/dna/chat.html">IRC chat room</ulink>
     . If you'd like to get involved on the project, join the
-    <ulink url="http://www.jboss.org/dna/lists.html">mailing lists</ulink>
+    <ulink url="http://www.jboss.org/dna/mailinglists.html">mailing lists</ulink>
     ,
-    <ulink url="http://www.jboss.org/dna/subversion.html">download the code</ulink>
+    <ulink url="http://www.jboss.org/dna/sourcecode.html">download the code</ulink>
     and get it building, and visit our
     <ulink url="http://jira.jboss.org/jira/browse/DNA">JIRA issue management system</ulink>
     . If there's something in particular you're interested in, talk with the community - there may be others interested in the

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -120,16 +120,44 @@
 			system that is designed around creating and accessing graphs.  The JBoss DNA JCR implementation actually just sits on
 			top of a single repository source, which it uses to access of the repositories content.
 			<figure id="dnajcr-and-connector">
-				<title>JBoss DNA's JCR implementation delegates to a repository source</title>
+				<title>JBoss DNA's JCR implementation delegates to a repository connector</title>
 				<graphic align="center" scale="100" fileref="dnajcr-and-connector.png"/>
 			</figure>
-			That single repository source could be an in-memory repository, a JBoss Cache instance, or a federated repository.
+			That single repository connector could access:
+		</para>
+ 		<itemizedlist>
+			<listitem>
+				<para>a transient, in-memory repository</para>
+			</listitem>
+			<listitem>
+				<para>an Infinispan data grid that acts as an extremely scalable, highly-available store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a JBoss Cache instance that acts as a clustered and replicated store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a JDBC database used as a store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses existing JDBC databases to project the schema structure as read-only repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses a file systems to present the files and directory structure as (updatable) repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses an SVN repository to present the files and directory structure as (updatable) repository content</para>
+			</listitem>
+			<listitem>
+				<para>a federated repository that presents a unified, updatable view of the content in multiple other systems (which are accessed via connectors)</para>
+			</listitem>
+		</itemizedlist>
+		<para>
 			<figure id="dna-connectors-0.2">
 				<title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
-				<graphic align="center" scale="100" fileref="dna-connectors-0.2.png"/>
+				<graphic align="center" scale="100" fileref="dna-connectors.png"/>
 			</figure>
 	  	And the JBoss DNA project has plans to create other connectors, too.  For instance, we're going to build a connector 
-	    to other JCR repositories.  And another to a file system, so that the files and directories on an area of the file system
+	    to other JCR repositories.  And another to existing databases so that some or all of the existing data (in whatever structure)
 	    can be accessed through JCR.  Of course, if we don't have a connector to suit your needs, you can write your own.
 			<figure id="dna-connectors-future">
 				<title>Future JBoss DNA connectors</title>
@@ -260,8 +288,7 @@
 		The <code>startRepositories()</code> method builds the <code>JcrEngine</code> component from the configuration, starts the engine,
 		and obtains the JCR <code>javax.jcr.Repository</code> instance that the client will use.  Note that the client has not yet
 		obtained a <code>javax.jcr.Session</code> instance, since this will be done each time the client needs to access content from
-		the repository.  (This is actually a common practice according to the JCR specification, since Sessions are intended to be
-		very lightweight.)
+		the repository.  (This is actually a common practice according to the JCR specification, since Sessions are lightweight.)
    </para>
 	<programlisting role="JAVA"><![CDATA[
 public void startRepositories() throws IOException, SAXException {
@@ -283,6 +310,8 @@
     engine = configuration.build();
     engine.start();
 
+    ...
+
     // For this example, we're using a couple of in-memory repositories (including one for the configuration repository).
     // Normally, these would exist already and would simply be accessed. But in this example, we're going to
     // populate these repositories here by importing from files. First do the configuration repository ...

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -38,15 +38,45 @@
 	<sect1 id="running_sequencer_example">
 		<title>Running the sequencing example</title>
 		<para>The sequencing example consists of a client application that sets up an in-memory JCR repository and that allows a user to
-      upload files into that repository. The client also sets up the DNA services with two sequencers so that if any of the
-      uploaded files are PNG, JPEG, GIF, BMP or other images, DNA will automatically extract the image's metadata (e.g., image
-      format, physical size, pixel density, etc.) and store that in the repository.  Alternatively, if the uploaded file 
-      is an MP3 audio file, DNA will extract some of the ID3 metadata (e.g., the author, title, album, year and comment)
-      and store that in the repository.</para>
+      upload files into that repository. The client also sets up the DNA services with seven sequencers:
+	 		<itemizedlist>
+				<listitem>
+					<para>an image metadata sequencer that processes PNG, JPEG, GIF, BMP or other image filetypes to extract
+						 the image's metadata (e.g., image format, physical size, pixel density, etc.)</para>
+				</listitem>
+				<listitem>
+					<para>an MP3 sequencer that extracts the ID3 metadata (e.g., the author, title, album, year and comment)</para>
+				</listitem>
+				<listitem>
+					<para>an MP3 sequencer that extracts the ID3 metadata (e.g., the author, title, album, year and comment)</para>
+				</listitem>
+				<listitem>
+					<para>a Java source code sequencer that extracts the structure of Java classes by parsing the source code</para>
+				</listitem>
+				<listitem>
+					<para>a Java class file sequencer that extracts the structure of Java classes by analyzing the class files</para>
+				</listitem>
+				<listitem>
+					<para>a text file sequencer that extracts the comma-separated structured information contained in CSV files</para>
+				</listitem>
+				<listitem>
+					<para>a text file sequencer that extracts the structured information contained in fixed-width files</para>
+				</listitem>
+				<listitem>
+					<para>a ZIP archive sequencer that extracts the files and directory structure contained in ZIP and JAR files</para>
+				</listitem>
+			</itemizedlist>
+      These sequencers automatically extract content from the files and store that content in the repository.
+    </para>
+		<note>
+			<para>JBoss DNA includes several other sequencers, including sequencers for DDL files, Microsoft Office files, 
+				JCR Compact Node Definition (CND) files, and XML files. Feel free to experiment with the example and add these
+				or even sequencers you write.</para>
+		</note>
 		<para>
       To run the client application, go to the <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code>
       directory and type <code>./run.sh</code>. You should see the command-line client and its menus in your terminal:
-      <figure id="xample-sequencer-cli-client">
+      <figure id="example-sequencer-cli-client">
 				<title>Example client</title>
 				<graphic align="center" scale="60" fileref="example-sequencer-client.png"/>
 			</figure>
@@ -62,7 +92,8 @@
 				<graphic align="center" scale="60" fileref="example-sequencer-upload.png"/>
 			</figure>
       You can specify any fully-qualified or relative path. The application will notify you if it cannot find the file you
-      specified. The example client configures JBoss DNA to sequence MP3 audio files, Java source files, or image files with one of
+      specified. The example client configures JBoss DNA to sequence MP3 audio files, Java source files, Java class files,
+      ZIP files, text files (<code>.txt</code>), CSV files (<code>.csv</code>), or image files with one of
       the following extensions (technically, nodes that have names ending in the following):
       <code>jpg</code>, <code>jpeg</code>, <code>gif</code>, <code>bmp</code>, <code>pcx</code>, <code>png</code>,
       <code>iff</code>, <code>ras</code>, <code>pbm</code>, <code>pgm</code>, <code>ppm</code>, and <code>psd</code>.
@@ -188,6 +219,12 @@
       .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
       .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/mp3s/$1");
+// Set up the Java class file sequencer ...
+config.sequencer("Java Class Sequencer")
+      .usingClass(ClassFileSequencer.class)
+      .setDescription("Sequences Java class files to extract the structure of the classes")
+      .sequencingFrom("//*.class[*]/jcr:content[@jcr:data]")
+      .andOutputtingTo("/classes");
 // Set up the Java source file sequencer ...
 config.sequencer("Java Sequencer")
       .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
@@ -195,6 +232,22 @@
       .setDescription("Sequences Java files to extract the AST structure of the Java source code")
       .sequencingFrom("//(*.java[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/java/$1");
+// Set up the CSV file sequencer ...
+config.sequencer("CSV Sequencer")
+      .usingClass("org.jboss.dna.sequencer.text.DelimitedTextSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences CSV files to extract the contents")
+      .sequencingFrom("//(*.csv[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/csv/$1");
+// Set up the fixed width file sequencer ...
+config.sequencer("Fixed Width Sequencer")
+      .usingClass("org.jboss.dna.sequencer.text.FixedWidthTextSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences fixed width files to extract the contents")
+      .setProperty("commentMarker", "#")
+      .setProperty("columnStartPositions", new int[] { 10, 20, 30, 40})
+      .sequencingFrom("//(*.txt[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/txt/$1");
 
 // Now start the client and tell it which repository and workspace to use ...
 SequencingClient client = new SequencingClient(config, repositoryId, workspaceName);

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -70,7 +70,10 @@
 		<para>
 			Integration with a management system can be done in a similar manner.  A JBoss DNA connector could access the management system
 			to discover the servers and enable auto-discovery of the services, and "tag" the services deployments with the lifecycle phase 
-			(dev, test, production, etc.).
+			(dev, test, production, etc.). Plus, JBoss DNA sequencers can automatically process the uploaded artifacts to extract a useful
+			structured representation of their content, and can then store that additional information in the repository. So not only are
+			the original artifacts stored in the repository, but a structured representation of their content is also stored. And all of
+			it can be accessed, navigated, searched, and even updated.
 		</para>
 		<para>
 			By using JBoss DNA, a service repository could manage the wide range of artifacts required in a SOA or web-oriented architecture,
@@ -89,12 +92,17 @@
 		<para>
 			Some of this information may actually be defined or controlled within the data sources themselves or within other systems.
 			For example, the DDL scripts used to migrate the database schemas are (hopefully) stored in a version control system,
-			and the databases themselves have the ability to describe their current schemas.  Using JBoss DNA, the repository could
-			use a connector to the version control system to expose the scripts, as well as connectors to the databases to expose
-			(and cache) the current schema of the databases.  The data repository would then be able to allow users to search over
-			this information without even touching the underlying systems.
+			and the databases themselves have the ability to describe their current schemas.
 		</para>
 		<para>
+			Using JBoss DNA, the repository could use a connector to the version control system to expose the scripts, as well as 
+			connectors to the databases to expose (and cache) the current schema of the databases as structured content.  
+			JBoss DNA sequencers can automatically process the uploaded assets and artifacts to extract a useful
+			structured representation of their content, and can then store that additional information in the repository.
+			Applications can access, search, navigate, and update all of this metadata about the databases and data services,
+			all through a single JCR repository using a standard JCR API and without having to touch the underlying systems.
+		</para>
+		<para>
 			However, the power of a data repository is really the ability to capture the relationships that otherwise were only captured
 			in people's heads or trapped in documents spread throughout the network. A data repository can capture the policies that
 			dictate how each data source should be used (which are for development purposes, or QA/testing purposes, or which are production,
@@ -102,6 +110,7 @@
 			availability and deployment.  As web services are created to provide service-based access to the data in databases,
 			the repository can be used to maintain the relationships between these <emphasis>data services</emphasis> and the underlying sources.
 			Similarly, the repository can track how the databases are used by applications, ETL processes, and reports.
+			All of this information is just content that can be stored within the same JCR repository.
 		</para>
 	</sect1>
 	<sect1 id="configuration_repository">

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:29:50 UTC (rev 1570)
@@ -80,9 +80,12 @@
 	<sect1 id="jcr_configuration">
 		<title>JcrConfiguration</title>
 		<para>
-			The previous section assumed the existence of a &JcrConfiguration;.  It's not really that creating an instance is all that difficult.
-			In fact, there's only one no-argument constructor, so actually creating the instance is a piece of cake.  What can be a little more challenging,
-			though, is setting up the &JcrConfiguration; instance, which must define the following components:
+			The previous section assumed the existence of a &JcrConfiguration;.  Obtaining an instance isn't very difficult at all.
+			In fact, there's only one no-argument constructor, so actually creating the instance is a piece of cake.  
+			It can be a little more challenging to assemble the configuration you want to use.
+		</para>
+		<para>
+			Each &JcrConfiguration; instance defines all of the components that will run inside the &JcrEngine;:
 			<itemizedlist>
 				<listitem>
 					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
@@ -117,17 +120,17 @@
 			</itemizedlist>
 		</para>
 		<para>
-			There really are three options:
+			There really are three options for setting up a &JcrConfiguration; instance:
 			<itemizedlist>
 				<listitem>
-					<para><emphasis role="strong"><code>Load from a file</code></emphasis> is conceptually the easiest and requires the least amount
-					of Java code, but it now requires a configuration file.</para>
+					<para><emphasis role="strong"><code>Loading from a file</code></emphasis> is conceptually the easiest and requires the least amount
+					of Java code, but it now requires a configuration file. More on that in a bit.</para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>Load from a configuration repository</code></emphasis> is not much more complicated than loading
+					<para><emphasis role="strong"><code>Loading from a configuration repository</code></emphasis> is not much more complicated than loading
 					from a file, but it does allow multiple &JcrEngine; instances (usually in different processes perhaps on different machines)
-					to easily access their (shared) configuration.  And technically, loading the configuration from a file really just creates an
-					&InMemoryRepositorySource;, imports the configuration file into that source, and then proceeds with this approach.</para>
+					to easily access a shared, persistent configuration.  And technically, loading the configuration from a file really just
+					imports the configuration file into	a transient &InMemoryRepositorySource;.</para>
 				</listitem>
 				<listitem>
 					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
@@ -144,23 +147,22 @@
 			<para>
 				Loading the JBoss DNA configuration from a file is actually very simple:
 			</para>
-    	<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = new JcrConfiguration();
+    	<programlisting role="JAVA"><![CDATA[JcrConfiguration config = new JcrConfiguration();
 configuration.loadFrom(file);
  ]]></programlisting>
 			<para>
 				where the <code>file</code> parameter can actually be a &File; instance, a &URL; to the file, an &InputStream; 
-				containing the contents of the file, or even a &String; containing the contents of the file.  
+				containing the contents of the file, or even a &String; containing the path to the file.  
 			</para>
 			<note>
-				<para>The <code>loadFrom(...)</code> method can be called any number of times, but each time it is called it completely wipes
+				<para>The <code>loadFrom(...)</code> methods can be called multiple times, but each time it completely wipes
 				  out any current notion of the configuration and replaces it with the configuration found in the file.
 				</para>
 			</note>
 			<para>
 				There is an optional second parameter that defines the &Path; within the configuration file identifying the parent node of the various
 				configuration nodes.  If not specified, it assumes "/".  This makes it possible for the configuration content to be
-				located at a different location in the hierarchical structure.  (This is not often required, but when it is required
+				at a different location in the hierarchical structure.  (This is not often required, but when it is required
 				this second parameter is very useful.)
 			</para>
 			<para>
@@ -176,14 +178,13 @@
 	  <dna:repositories>
 	      <!-- 
 	      Define a JCR repository that accesses the 'Cars' source directly.
-	      This of course is optional, since we could access the same content through 'vehicles'.
 	      -->
 	      <dna:repository jcr:name="car repository" dna:source="Cars">
 	          <dna:options jcr:primaryType="dna:options">
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
 	              <!--
-	              As a convenience, DNA allows guest users full access by default.  In a production system,
-	              you would want to limit this access by uncommenting one of the options below:
+	              As a convenience, DNA defaults to granting guest users full access.  
+	              In a production system, you would want to limit this access by uncommenting one of the options below:
 	              
 	              for no access:
 	              <anonymousUserRoles jcr:PrimaryType="dna:option" dna:value="" />
@@ -205,15 +206,18 @@
         </dna:source>
     </dna:sources>
     <!-- 
-    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    Define the sequencers. This is an optional section. 
     -->
     <dna:sequencers>
-        <!--dna:sequencer jcr:name="Image Sequencer" dna:classname="org.jboss.dna.sequencer.image.ImageMetadataSequencer">
+        <dna:sequencer jcr:name="Image Sequencer" dna:classname="org.jboss.dna.sequencer.image.ImageMetadataSequencer">
             <dna:description>Image metadata sequencer</dna:description>        
             <dna:pathExpression>/foo/source => /foo/target</dna:pathExpression>
             <dna:pathExpression>/bar/source => /bar/target</dna:pathExpression>
-        </dna:sequencer-->
+        </dna:sequencer>
     </dna:sequencers>
+    <!--
+	  Define how JBoss DNA will determine the MIME type of files. This is an optional section (and the default works pretty well).
+    -->
     <dna:mimeTypeDetectors>
         <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
     </dna:mimeTypeDetectors>
@@ -234,20 +238,14 @@
  ]]></programlisting>
 			<para>
 				This really is a more advanced way to define your configuration, so we won't go into how you configure a &RepositorySource;.
-				For more information, consult the &ReferenceGuide;.
+				Suffice to say that you can create a &JcrConfiguration; that uses a &RepositorySource;, programmatically define the configuration,
+				and call <code>save()</code> on the &JcrConfiguration; to store the configuration in the repository sources. To use that
+				configuration, just create &JcrConfiguration; objects using a &RepositorySource; pointed to the same persistent store,
+				and you're done.  For more information, consult the &ReferenceGuide;.
 			</para>
-			<note>
-				<para>The <code>loadFrom(...)</code> method can be called any number of times, but each time it is called it completely wipes
-				  out any current notion of the configuration and replaces it with the configuration found in the file.
-				</para>
-			</note>
 			<para>
-				There is an optional second parameter that defines the name of the workspace in the supplied source where the configuration content
-				can be found.  It is not needed if the workspace is the source's default workspace. 
-				There is an optional third parameter that defines the &Path; within the configuration repository identifying the parent node of the various
-				configuration nodes.  If not specified, it assumes "/".  This makes it possible for the configuration content to be
-				located at a different location in the hierarchical structure.  (This is not often required, but when it is required
-				this second parameter is very useful.)
+				If you use the <code>loadFrom(&RepositorySource;,&Path;)</code> form, you can control where the configuration content is
+				stored in the repository.  This is useful if you want to store multiple configurations in the same repository.
 			</para>
 		</sect2>
 		<sect2 id="programmatic_configuration">

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:29:50 UTC (rev 1570)
@@ -1,5 +1,5 @@
 <!ENTITY versionNumber "0.6">
-<!ENTITY copyrightYears "2008-2009">
+<!ENTITY copyrightYears "2008-2010">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 
 <!-- Frequently used URLs -->
@@ -7,14 +7,14 @@
 <!ENTITY Home       					"http://www.jboss.org/dna/">
 <!ENTITY Downloads  					"&Home;downloads.html">
 <!ENTITY Community  					"&Home;community.html">
-<!ENTITY DocHome    					"http://www.jboss.org/file-access/default/members/dna/freezone/">
-<!ENTITY API        					"&DocHome;docs/&versionNumber;/apidocs/org/jboss/dna/">
+<!ENTITY DocHome    					"http://docs.jboss.org/jbossdna">
+<!ENTITY API        					"&DocHome;/&versionNumber;/api/org/jboss/dna/">
 <!ENTITY JIRA       					"http://jira.jboss.org/jira/browse/DNA">
 <!ENTITY Roadmap       				"&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">
 <!ENTITY Subversion  					"http://anonsvn.jboss.org/repos/dna/">
 <!ENTITY Fisheye							"http://fisheye.jboss.org/browse/DNA/">
 <!ENTITY SecureSubversion  		"https://svn.jboss.org/repos/dna/">
-<!ENTITY Forums     					"http://www.jboss.com/index.html?module=bb&amp;op=viewforum&amp;f=272">
+<!ENTITY Forums     					"http://community.jboss.org/en/dna">
 <!ENTITY JSR170  							"http://www.jcp.org/en/jsr/detail?id=170">
 <!ENTITY JSR283  							"http://www.jcp.org/en/jsr/detail?id=283">
 <!ENTITY JSR203  							"http://www.jcp.org/en/jsr/detail?id=203">
@@ -24,8 +24,8 @@
 
 <!ENTITY Java									"http://java.sun.com/j2se/1.5.0/docs/api/">
 
-<!ENTITY GettingStarted           		"<ulink url='&DocHome;docs/&versionNumber;/manuals/gettingstarted/html/index.html'>Getting Started</ulink>">
-<!ENTITY ReferenceGuide           		"<ulink url='&DocHome;docs/&versionNumber;/manuals/reference/html/index.html'>Reference Guide</ulink>">
+<!ENTITY GettingStarted           		"<ulink url='&DocHome;/&versionNumber;/manuals/gettingstarted/html/index.html'>Getting Started</ulink>">
+<!ENTITY ReferenceGuide           		"<ulink url='&DocHome;/&versionNumber;/manuals/reference/html/index.html'>Reference Guide</ulink>">
 
 <!-- Types in JRE -->
 

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle	2010-01-09 21:29:50 UTC (rev 1570)
@@ -1,4662 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>ActiveLayerIndex</key>
-	<integer>0</integer>
-	<key>ApplicationVersion</key>
-	<array>
-		<string>com.omnigroup.OmniGraffle</string>
-		<string>136.19.0.104178</string>
-	</array>
-	<key>AutoAdjust</key>
-	<true/>
-	<key>BackgroundGraphic</key>
-	<dict>
-		<key>Bounds</key>
-		<string>{{0, 0}, {576, 733}}</string>
-		<key>Class</key>
-		<string>SolidGraphic</string>
-		<key>ID</key>
-		<integer>2</integer>
-		<key>Style</key>
-		<dict>
-			<key>shadow</key>
-			<dict>
-				<key>Draws</key>
-				<string>NO</string>
-			</dict>
-			<key>stroke</key>
-			<dict>
-				<key>Draws</key>
-				<string>NO</string>
-			</dict>
-		</dict>
-	</dict>
-	<key>CanvasOrigin</key>
-	<string>{0, 0}</string>
-	<key>ColumnAlign</key>
-	<integer>1</integer>
-	<key>ColumnSpacing</key>
-	<real>36</real>
-	<key>CreationDate</key>
-	<string>2008-09-19 10:35:27 -0500</string>
-	<key>Creator</key>
-	<string>Randall Hauch</string>
-	<key>DisplayScale</key>
-	<string>1 0/72 in = 1.0000 in</string>
-	<key>GraphDocumentVersion</key>
-	<integer>6</integer>
-	<key>GraphicsList</key>
-	<array>
-		<dict>
-			<key>Bounds</key>
-			<string>{{478.568, 405}, {55, 23}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>9</real>
-			</dict>
-			<key>ID</key>
-			<integer>233</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0, -0.5}</string>
-				<string>{-0.5, 0}</string>
-			</array>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.939516</string>
-						<key>g</key>
-						<string>0.939516</string>
-						<key>r</key>
-						<string>0.939516</string>
-					</dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.657258</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs18 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{389.068, 405}, {55, 23}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>9</real>
-			</dict>
-			<key>ID</key>
-			<integer>222</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0, -0.5}</string>
-				<string>{-0.5, 0}</string>
-			</array>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.939516</string>
-						<key>g</key>
-						<string>0.939516</string>
-						<key>r</key>
-						<string>0.939516</string>
-					</dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.657258</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs18 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{322.318, 405}, {55, 23}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>9</real>
-			</dict>
-			<key>ID</key>
-			<integer>232</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0, -0.5}</string>
-				<string>{-0.5, 0}</string>
-			</array>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.939516</string>
-						<key>g</key>
-						<string>0.939516</string>
-						<key>r</key>
-						<string>0.939516</string>
-					</dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.657258</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs18 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{255.568, 405}, {55, 23}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>9</real>
-			</dict>
-			<key>ID</key>
-			<integer>231</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0, -0.5}</string>
-				<string>{-0.5, 0}</string>
-			</array>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.939516</string>
-						<key>g</key>
-						<string>0.939516</string>
-						<key>r</key>
-						<string>0.939516</string>
-					</dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.657258</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs18 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>199</integer>
-			</dict>
-			<key>ID</key>
-			<integer>230</integer>
-			<key>Points</key>
-			<array>
-				<string>{436.068, 312}</string>
-				<string>{478.568, 312.5}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>197</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{455.818, 409.5}, {11, 14}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>YES</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>229</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs24 \cf0 ...}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-			<key>Wrap</key>
-			<string>NO</string>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>222</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>223</integer>
-			<key>Points</key>
-			<array>
-				<string>{398.235, 335}</string>
-				<string>{416.568, 405}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>197</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>232</integer>
-			</dict>
-			<key>ID</key>
-			<integer>228</integer>
-			<key>Points</key>
-			<array>
-				<string>{387.11, 335}</string>
-				<string>{349.818, 405}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>197</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>231</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>227</integer>
-			<key>Points</key>
-			<array>
-				<string>{375.985, 335}</string>
-				<string>{283.068, 405}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>197</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{463.204, 328}, {89.7277, 12}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>Vertical</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Font</key>
-				<string>Helvetica-Oblique</string>
-				<key>Size</key>
-				<real>10</real>
-			</dict>
-			<key>ID</key>
-			<integer>200</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\i\fs20 \cf0 federated cache}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{478.568, 301}, {59, 23}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>9</real>
-			</dict>
-			<key>ID</key>
-			<integer>199</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0, -0.5}</string>
-				<string>{-0.5, 0}</string>
-			</array>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.499999, -0.5}</string>
-					<string>{-0.499999, -0.5}</string>
-					<string>{0.500001, -0.5}</string>
-					<string>{0.500001, -0.5}</string>
-					<string>{0.500001, -0.5}</string>
-					<string>{0.500001, 0.499997}</string>
-					<string>{0.500001, 0.499997}</string>
-					<string>{0.166668, 0.499997}</string>
-					<string>{-0.333334, 0.500009}</string>
-					<string>{-0.499999, 0.499997}</string>
-					<string>{-0.499998, 0.499997}</string>
-					<string>{-0.499999, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.939516</string>
-						<key>g</key>
-						<string>0.939516</string>
-						<key>r</key>
-						<string>0.939516</string>
-					</dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.657258</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs18 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{353.068, 269}, {83, 29.0002}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>198</integer>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.284764</string>
-						<key>g</key>
-						<string>0.341238</string>
-						<key>r</key>
-						<string>0.527916</string>
-					</dict>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.666667</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{353.068, 298}, {83, 37}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>197</integer>
-			<key>Magnets</key>
-			<array>
-				<string>{0.5, -0.121622}</string>
-				<string>{0, 0.121622}</string>
-			</array>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.441947</string>
-						<key>g</key>
-						<string>0.595697</string>
-						<key>r</key>
-						<string>0.630182</string>
-					</dict>
-					<key>GradientCenter</key>
-					<string>{-0.0761905, -0.114286}</string>
-					<key>MiddleFraction</key>
-					<real>0.4841269850730896</real>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Federation}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>233</integer>
-				<key>Info</key>
-				<integer>1</integer>
-			</dict>
-			<key>ID</key>
-			<integer>226</integer>
-			<key>Points</key>
-			<array>
-				<string>{394.568, 321}</string>
-				<string>{506.068, 405}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>197</integer>
-				<key>Info</key>
-				<integer>2</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>ID</key>
-			<integer>221</integer>
-			<key>Points</key>
-			<array>
-				<string>{179.068, 342.06}</string>
-				<string>{179.068, 364.323}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>ID</key>
-			<integer>220</integer>
-			<key>Points</key>
-			<array>
-				<string>{64.0682, 341.62}</string>
-				<string>{64.0682, 363.883}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>HeadArrow</key>
-					<string>FilledArrow</string>
-					<key>TailArrow</key>
-					<string>0</string>
-				</dict>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{37.0682, 418.363}, {55, 28}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>Vertical</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>ID</key>
-			<integer>219</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Java Objects}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>Group</string>
-			<key>Graphics</key>
-			<array>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>212</integer>
-					</dict>
-					<key>ID</key>
-					<integer>206</integer>
-					<key>Points</key>
-					<array>
-						<string>{50.2662, 393.481}</string>
-						<string>{50.2662, 397.299}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>217</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>213</integer>
-					</dict>
-					<key>ID</key>
-					<integer>207</integer>
-					<key>Points</key>
-					<array>
-						<string>{75.1351, 393.075}</string>
-						<string>{76.8943, 397.704}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>215</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>214</integer>
-					</dict>
-					<key>ID</key>
-					<integer>208</integer>
-					<key>Points</key>
-					<array>
-						<string>{71.185, 393.075}</string>
-						<string>{69.4254, 397.705}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>215</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>215</integer>
-					</dict>
-					<key>ID</key>
-					<integer>209</integer>
-					<key>Points</key>
-					<array>
-						<string>{64.991, 376.781}</string>
-						<string>{69.9094, 383.462}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>218</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>216</integer>
-					</dict>
-					<key>ID</key>
-					<integer>210</integer>
-					<key>Points</key>
-					<array>
-						<string>{61.7402, 377.968}</string>
-						<string>{61.7402, 382.276}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>218</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>Head</key>
-					<dict>
-						<key>ID</key>
-						<integer>217</integer>
-					</dict>
-					<key>ID</key>
-					<integer>211</integer>
-					<key>Points</key>
-					<array>
-						<string>{58.4799, 376.773}</string>
-						<string>{53.5265, 383.47}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>218</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{45.9812, 398.299}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>212</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{74.5842, 398.299}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>213</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{63.1652, 398.299}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>214</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{68.8752, 383.276}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>215</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{57.4552, 383.276}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>216</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{45.9812, 383.276}, {8.57001, 9.20474}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>217</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{57.4552, 367.763}, {8.57002, 9.20475}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>218</integer>
-					<key>Shape</key>
-					<string>Circle</string>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>FillType</key>
-							<integer>3</integer>
-							<key>GradientCenter</key>
-							<string>{-0.0761905, -0.114286}</string>
-							<key>GradientColor</key>
-							<dict>
-								<key>w</key>
-								<string>0.666667</string>
-							</dict>
-							<key>MiddleFraction</key>
-							<real>0.48412701487541199</real>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-							<key>Fuzziness</key>
-							<real>5.7921171188354492</real>
-							<key>ShadowVector</key>
-							<string>{3, 4}</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>archive</key>
-								<data>
-								YnBsaXN0MDDU
-								AQIDBAUGCQpY
-								JHZlcnNpb25U
-								JHRvcFkkYXJj
-								aGl2ZXJYJG9i
-								amVjdHMSAAGG
-								oNEHCFRyb290
-								gAFfEA9OU0tl
-								eWVkQXJjaGl2
-								ZXKlCwwVGR5V
-								JG51bGzUDQ4P
-								EBESExRWJGNs
-								YXNzXE5TQ29s
-								b3JTcGFjZV8Q
-								Ek5TQ3VzdG9t
-								Q29sb3JTcGFj
-								ZVdOU1doaXRl
-								gAQQA4ACRDAu
-								NQDSDRYXGFRO
-								U0lEgAMQAtIa
-								GxwOWCRjbGFz
-								c2VzWiRjbGFz
-								c25hbWWiDh1Y
-								TlNPYmplY3TS
-								GhsfIKIgHVdO
-								U0NvbG9yCBEa
-								HykyNzo/QVNZ
-								X2hvfJGZm52f
-								pKmusLK3wMvO
-								19zfAAAAAAAA
-								AQEAAAAAAAAA
-								IQAAAAAAAAAA
-								AAAAAAAAAOc=
-								</data>
-								<key>b</key>
-								<string>0.500023</string>
-								<key>g</key>
-								<string>0.500023</string>
-								<key>r</key>
-								<string>0.500023</string>
-							</dict>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>VerticalPad</key>
-						<integer>0</integer>
-					</dict>
-				</dict>
-			</array>
-			<key>ID</key>
-			<integer>205</integer>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{152.068, 419.242}, {55, 28}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FitText</key>
-			<string>Vertical</string>
-			<key>Flow</key>
-			<string>Resize</string>
-			<key>ID</key>
-			<integer>158</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Pad</key>
-				<integer>0</integer>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 JBoss Cache}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{145.068, 368.643}, {69, 39.7404}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica-Bold</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>191</integer>
-			<key>Shape</key>
-			<string>RoundRect</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>FillType</key>
-					<integer>3</integer>
-					<key>GradientCenter</key>
-					<string>{-0.0761905, -0.114286}</string>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.666667</string>
-					</dict>
-					<key>MiddleFraction</key>
-					<real>0.48412701487541199</real>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>archive</key>
-						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
-						</data>
-						<key>b</key>
-						<string>0.500023</string>
-						<key>g</key>
-						<string>0.500023</string>
-						<key>r</key>
-						<string>0.500023</string>
-					</dict>
-					<key>Width</key>
-					<real>2</real>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{138.068, 269}, {83, 29.0002}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>47</integer>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.284764</string>
-						<key>g</key>
-						<string>0.341238</string>
-						<key>r</key>
-						<string>0.527916</string>
-					</dict>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.666667</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{138.068, 298}, {83, 37}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>46</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.441947</string>
-						<key>g</key>
-						<string>0.595697</string>
-						<key>r</key>
-						<string>0.630182</string>
-					</dict>
-					<key>GradientCenter</key>
-					<string>{-0.0761905, -0.114286}</string>
-					<key>MiddleFraction</key>
-					<real>0.4841269850730896</real>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 JBoss Cache}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{23.0682, 269}, {83, 29.0002}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>FontInfo</key>
-			<dict>
-				<key>Color</key>
-				<dict>
-					<key>w</key>
-					<string>0</string>
-				</dict>
-				<key>Font</key>
-				<string>Helvetica</string>
-				<key>NSKern</key>
-				<real>0.0</real>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>45</integer>
-			<key>Shape</key>
-			<string>Bezier</string>
-			<key>ShapeData</key>
-			<dict>
-				<key>UnitPoints</key>
-				<array>
-					<string>{-0.5, -0.5}</string>
-					<string>{-0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, -0.5}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.5, 0.499996}</string>
-					<string>{0.166667, 0.499996}</string>
-					<string>{-0.333334, 0.500008}</string>
-					<string>{-0.5, 0.499996}</string>
-					<string>{-0.499999, 0.499996}</string>
-					<string>{-0.5, -0.5}</string>
-				</array>
-			</dict>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.284764</string>
-						<key>g</key>
-						<string>0.341238</string>
-						<key>r</key>
-						<string>0.527916</string>
-					</dict>
-					<key>GradientColor</key>
-					<dict>
-						<key>w</key>
-						<string>0.666667</string>
-					</dict>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>CornerRadius</key>
-					<real>9</real>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Repository Connector}</string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{23.0682, 298}, {83, 37}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>43</integer>
-			<key>Shape</key>
-			<string>Rectangle</string>
-			<key>Style</key>
-			<dict>
-				<key>fill</key>
-				<dict>
-					<key>Color</key>
-					<dict>
-						<key>b</key>
-						<string>0.441947</string>
-						<key>g</key>
-						<string>0.595697</string>
-						<key>r</key>
-						<string>0.630182</string>
-					</dict>
-					<key>GradientCenter</key>
-					<string>{-0.0761905, -0.114286}</string>
-					<key>MiddleFraction</key>
-					<real>0.4841269850730896</real>
-				</dict>
-				<key>shadow</key>
-				<dict>
-					<key>Fuzziness</key>
-					<real>5.7921171188354492</real>
-					<key>ShadowVector</key>
-					<string>{3, 4}</string>
-				</dict>
-				<key>stroke</key>
-				<dict>
-					<key>Draws</key>
-					<string>NO</string>
-				</dict>
-			</dict>
-			<key>Text</key>
-			<dict>
-				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 In-Memory}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-	</array>
-	<key>GridInfo</key>
-	<dict/>
-	<key>GuidesLocked</key>
-	<string>NO</string>
-	<key>GuidesVisible</key>
-	<string>YES</string>
-	<key>HPages</key>
-	<integer>1</integer>
-	<key>ImageCounter</key>
-	<integer>1</integer>
-	<key>KeepToScale</key>
-	<false/>
-	<key>Layers</key>
-	<array>
-		<dict>
-			<key>Lock</key>
-			<string>NO</string>
-			<key>Name</key>
-			<string>Layer 1</string>
-			<key>Print</key>
-			<string>YES</string>
-			<key>View</key>
-			<string>YES</string>
-		</dict>
-	</array>
-	<key>LayoutInfo</key>
-	<dict>
-		<key>Animate</key>
-		<string>NO</string>
-		<key>circoMinDist</key>
-		<real>18</real>
-		<key>circoSeparation</key>
-		<real>0.0</real>
-		<key>layoutEngine</key>
-		<string>dot</string>
-		<key>neatoSeparation</key>
-		<real>0.0</real>
-		<key>twopiSeparation</key>
-		<real>0.0</real>
-	</dict>
-	<key>LinksVisible</key>
-	<string>NO</string>
-	<key>MagnetsVisible</key>
-	<string>NO</string>
-	<key>MasterSheets</key>
-	<array/>
-	<key>ModificationDate</key>
-	<string>2008-11-12 12:43:06 -0600</string>
-	<key>Modifier</key>
-	<string>Randall Hauch</string>
-	<key>NotesVisible</key>
-	<string>NO</string>
-	<key>Orientation</key>
-	<integer>2</integer>
-	<key>OriginVisible</key>
-	<string>NO</string>
-	<key>PageBreaks</key>
-	<string>YES</string>
-	<key>PrintInfo</key>
-	<dict>
-		<key>NSBottomMargin</key>
-		<array>
-			<string>float</string>
-			<string>41</string>
-		</array>
-		<key>NSLeftMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-		<key>NSPaperSize</key>
-		<array>
-			<string>size</string>
-			<string>{612, 792}</string>
-		</array>
-		<key>NSRightMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-		<key>NSTopMargin</key>
-		<array>
-			<string>float</string>
-			<string>18</string>
-		</array>
-	</dict>
-	<key>PrintOnePage</key>
-	<false/>
-	<key>QuickLookPreview</key>
-	<data>
-	JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls
-	dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1m1tzHbcNx9/3U/CxfdBmednba9xm
-	Jp7ptI0902dXkUf2SFZiuen02/cHkgB5jo50JDupp4kXZwFigT8uBJlf3T/dr27iz7wu
-	bo3Rfb5y/3Kf3DQuU/6f++C+e3Xv3eW98/nP/aW7mMa5/tr+VgUMCHjvvvvH1efLq1++
-	/Ofdjfv8gSX2tayCjH0M6zJtLm7LuO4B0bfuux9vvfvLXdamvppiezWFmF8dyqvh6NUZ
-	qTEhdt6PpcajV0WqvnokNR29itSYRNmHUuejV5Fqrx5JXcqr3/10dfPuy4ffrl7d3dx9
-	/nB79eXzh0sxDYaOk98CPhjnfV72Vf6Wkt8Tf8PYIYzzsgUX922c3cZKa7Xxq/sgbslv
-	TfjpV/wjrrzwbkmFKfkFJqz2/VvnQ/01uIuwjcuy78Gl4S3W/8GPE8xv37s//fjp4m9X
-	t3ef//dn9/aj++tbXHIKCygb1t0vomxMPsRtGqYxbGldUlYo+qqBqOJu3Y4i8hkpP984
-	P/FC3LZK8NOsv/P167QMjTLzk7uEQ1+J85j2fXc3bl3HffLz4pLS4jKmySfkFsqiBhzs
-	lWbTlEXf6CvoUhZ3AW13PqVqd/gxl8O1O6TcCuSf4w7wlDU/7ZF1W727iMcu+enql7v7
-	D1/wiWtOOeXsJ6SvI8ZfgvP+WPqru0+fri6R3mSfdvgDnOLwDqc+ruLBHqeSTJ42jF/3
-	zJRxKtF9hFN8SGAt3iV3hNPX39/d37tX7y6vr04oPrSsdQKpYLZDqk8ZmtXVty74DN36
-	fDMEiSGSVSWEgES+s2FFCRWn9oJCErDvQXCaGgb97AWnscFU7dfB1EgVpvZcYTr4hKr7
-	qjA9/JJLd+0OKedgat6oQDrhEEkcFabHHjkH0+dIbzA9ln4CplK6PKZJfhsiaSXOK4km
-	TNQKDw4rheieiLpI+lNS8GmcBKrCPJPnjZDSmLZlG0gR+k6M4+y31EkJaVz8QmLRlZRA
-	jirquKikG3y0j+tEQjKaT3NZXkUboS4vyU7fURVVjH2pLVW/8zLXbY+IHIUo4EVJikia
-	xjVNcdfa3hXnIRdnKxvqomiKUBzeXHt3f00deKRVCO6/1I7Xg3cfj0tFcK/eQNNm4c2r
-	vkZNud8g5tuXAC5K6e1gll0K5cCHhWT+oQTMKe3NYRt10kdKo5KGuAOAzYvHKhLStI1x
-	i+LVghYjNB8aifitPhyMZv5R0UZoyxtJVVQxADF/xHD85ZfuDVZ+qpKohwLrrvN2orST
-	rSJ1dT1RSErObOmyqyHPkLuSiuM6nyohh1lYcAIo13XC5HGJ47btBOZCZSa5rZDCONE7
-	GGWI8z76lQ60sc0st03iRQRM+7LCRyzMW9gd6Q/nAW6jzBsxP4UZScbH3yYMPfNWld4o
-	qoHymZosV4UTaDNFc4mdAkY5/roSfPMy7vNMnhFFYwiO4rZOU6DnpOJMaU3SuUl73YVg
-	6Y8tBBcvwUpXHFFkiWnJ7fGb63AyBlVejUHi8CtjUA3PV2Ms7w/8tU5UL1Jg8+CKU0OA
-	YoZYMZbfAaSZa4jgPnlaGjUprWulNLs3vuYdla4UJFUNGl9Vs/kLg+F6SqQp0FFMzcJG
-	fpdAE6DOcQw0GGApkRKA4K2b07gvtOKQqPxUu54SaZxxirINNL/jtqyRD6ekL4G9DXwT
-	CZ4GFZE72AWCRlnHAP6FYnyk+nkJG+BNVbpSmgap8RU1Lzvh80T0sHdrClTKoGoiSNkE
-	fsgnHwJUUcvvsQIVtytQz9cKlggLHWVEmKdHqjiNJ3Gq4r65VrQP2qjCIQ29u9hQpkBP
-	1Ry47STDOZm76E79SHFYD9wl3RmbsKG5q1JcM3vja85R6R2laDA0vqImyzXhWyB4FlBl
-	eDGKgVHZBsVpi7TqyT6hKk5bgCqSOraCN6BfE2qH0xqgHU5boDWcajji8oLToaNopNRE
-	3AGuCVecNgWMUgOUEOhxagn1EKfT+hROTydUw2meIby5Ts/B6fl8OjzS0zS7V0/27lKc
-	NndVJA2NreGtWUtR2SyqlOauyoebm3MUpx1FI8XcpYDTZA0WKiqHpoDitKlpbIrTdRk9
-	W50+n5L0KaNdPh06Ss14HZvlxZVW1i90HJY9V36jpjfKQGHwkcLPO8ZHc5XogRO0Kr2j
-	VJx2fBVwQxOuqGwKGOX460rhRz6d0YN82uFUC/XjhZ+ixzjlQT6dT+JUxX1z3Ve7D9Fw
-	2pyjOO0oNZ8qW59P1Vq02yWfumZRo5i7OnybuxSn6i6Uqjht7jLANeGKSlXAkOuamoWt
-	q/tITFvGKbuwOLPrcGsY/ZxxKtOdmU61UWTfy5CC7VRhGyIjoo1+VhqeDVQuUvcDG7u0
-	0KAutKwZp0ZhYxkyTju+QKtHg4qsKp22NFNcVA2ItMpX1WQ5E86Awc8TDaopUCkSFodf
-	V3Ea6F4Ep+wO953WtjSoHU61UHc4Pdoj0mWlWXAa6R12xiLs4NgjLidxquK+ue63D2Lj
-	s6SVum/OYY7CzgJXdBSZBpABjC1NRK64tHNXmpgeztEPZlGlSF9bzN7zqXPSVKWbu1QD
-	yd/VXUVNWc7ctZMHE9Pt5i6lmJqyU+Xr3KXV/Y20tu+eBGc43ZhIrEHyqaKkURRJja3i
-	DehvdGxhlnyqqCSwZx8knxplHjfiVyiGb+LKL2JNxenQKKoBbXzlM5w24YrTpoBR6tcN
-	+nUFp8hnv/FCnB7V/ZWgWJhwK05r3V+fg9Ovr/vN7tWTt4zsq7sUJT2lIGkwtg5vZi1D
-	pVm0UdTsyoebzTmG046ikaJ8BjgZpVcsVFQOpkBUnJqajU3rfmvMDaetDa8oGRpFcdrY
-	Gt5aX6yobL1zpXQNduNrbbhKbxTFaWvMFadd16+obAoYxRpzZcvbeOSXfdRhPu32UVqo
-	u3x6hFNai7KPOsyn20mcqrhvrvtq9zwbk4zT7aMMp+YuQ5KyMVO0fKrWYjhW8mnb6jSK
-	bl87PnOOSVcKkipOm7s0MTbhhkpVgGakZlhTs+K01v1u3mXDRzrntO47yY1mYZVdNJYg
-	YsMiI1til8OoxEmT4PyYX1JKm9cQQIypNvgrLfchMg84zS2Fk3qxMyFYmXCwumzJoe0y
-	NJAjRVldZgWP89MEMZumpsSdKZm0oLcD/CkwEs3mQPkn+ekg4izVpfDnNojEv6dAecGc
-	8Kfh8fUNvLDTcGQYKZ7hZkpZla8zzeGpw8o4ycSL4vfgGMjTt6yYg5mmnQswb5bzytfv
-	fnv39LHY42I5uGFrwaHkw1Oxv//7I4di921W6ply9+dix1io3uRYIeSZEJOR7F4hMBCM
-	4476xZBtIM7xLggor+DKyYsBabAqZRcK1gdPPQUx1yf43nO8+5r/f3yA0wPdECaqdOuY
-	craOUbp1jE8iQef9p6wgo2TUZffFmFfmaUYgn3A6Xq1gVJqfeZWGjlPwwkjphsJ7nqjI
-	oozCkZaKL3zIf/zDJUDtfbo1Wb1bx/SxdYzSrVP40K9+eG4O8p0IOdzIfx4ZAsRdD2Nk
-	npo4wGeHx1kVuWwivgsasqR8jC+yQMRMeznzD9otRrGJkwzhJSkschGB823Q5GHmXJS/
-	zgu9kxxYThJq1ye5HzeQIMPW44xo3Ng486ltPRZh3imydT1yP9mZQdrhesqNtmIoCeV8
-	r4FT4pP3GuKcLzaQZexeg+wWnj4vVos+dl4shX9LtPkPzot/uPr56jM3MO4+tZi2eH7J
-	cXEkEMr5L24S19CAtOcbjnj5PXLsUG46yHFu+ZktGfca8oFvJsghgcwF9QX+XW815LJ5
-	cFzMYcfRcbGarzsuNlKWfEPWKRbWk2oOR1C1HRcffokcFx9Szh0XmzP+kOPi50h/8XFx
-	2vIlBUa9Oaxm8IIvuF7A4w11n8KfT/p5nMt9Bn4LFHbxXEfJ4/76At0K8TxNEg+z5108
-	R4xUWuI8kIDhoJ8jRy6tcHFAklleVN8BBJU2lPyoj23tRG7EdaAK1fQr8oP47YBwW1pT
-	JErqlGVnhnqOK1QsT6tx9ghqhiWzysUGyRBs7/c/th3VDxjIGcSU+UUeO7/Io3khch9o
-	CnRujeInAkofGauUT+79YjTzi8xC8B5WVb/YO51fIqJJgfaKrm1+EdX0K5w8HPhFCCUv
-	SiM0PHJr64HhuQ2z5wJzsXNni7wy7Yx7LsJxE3Tu6sUZwdwP4Oxucfsz7gZ1Fb9IXSlK
-	tHm1aSv18AJrXZDPtnmPQLCIpbhTOqVne19y8dXP7vLw5Pi4yXpYZen6ZAmuuFkHz+SV
-	joYzOU56MHLYOSvMw9inyyw3gDhNnmX6ZmU2MKdcNym9raQGppKeo+y+9F475e6L9Hu6
-	28cbMOPoCqWt15VUXY82wUpvt17H3fcjnVuaYUh2nuNHGgQxDOdgVKBAY4Zg7oLpviDS
-	xK+eDCWGYIwpZ/VyjO7DxL4ALzIKkvrPPoFzq9kjjkaG3ZG0G6eYn243jEO+hFDztBtt
-	OTYNdPoS9Loc6iaAJPm5W06Za1TRj0pbNpw0Aw1GkIP0YoYkF3tIpcil4Fo7Kh3FtMmd
-	AqywxdwEQeJoWJou5vuRg2wyAJfDvFx1lUaMKyWl6TpmRqvOCCcwawzyHT7vFYRUVuN7
-	OVjNLZethsv8hq3ECCeYBQqSWR67D5poWqJcimKReh906O+DkkkntqHWN7GZrLE6jmNr
-	mKqZn9wISc+dME7u2/OGlhk3H8QxOnew5OKGAu9B58vlUXmRVCyVJ4QonSjMsgPHU3Lr
-	SmCQ5YkzuVxQbmJlqxwzn3eCcoheaeXr23KR2oyqAnJbLnpigUtDxQknmMULMiVgdpB7
-	PualiCT32xOwZnCS20P5kaoiP5VKJS1GJfBvMmp7kmpTGgzJGIAZWypNFlszvNk3SIMx
-	BOn/ZAOmr3ATSknI5TKVPkmBlGUDN2RyYyhKddozNyH1HHyNXB8Q/uxe2ak4BtHcBDnb
-	VQSmGQUTGKAOYykTz7hZljdc1quXC+mHN8seO4VV1ROZrDlCnjpHyKPaPbdt9BSDEejl
-	miNyK4iNxYbqCKOZIxJdZe4oqp1p6ugKha05gizUOUKXbY4QpXrtO0fQb8rXnAv5A3vX
-	8nyymTgu+ueaiTOCX9JMSLBIqc2pqQQL4a5P+IhD0bCVE7J8eaj8VFErt4lKUsvBok+K
-	eikhtNxcSW+RIIslegX6zBIspHtykmRGZcPbSsrBYk8aLHIyQgTK/hy2or0c4eWO7/Br
-	JFgifduWF3hBsMh/TZCZJF9rsDzrGubXB4uqXuAlVxTFLvLUHJEf1e6K2nzRK79bgqU6
-	wlDfOcJo6gjyeg2Wauc+WNT0JVjsSbZN0vebI0THXnsJlvr8zGA5sPfvGSxnBL84WOhl
-	chLNwSJ7f32iTsklGQYPGYuch9afarAYIVcWe1LUw87RCnWkD5baOHXBQi9cEn8tSASL
-	kkqw6JMFi8yVZeSQg6Vo34Ll4GtysMjt2Vy6XhAs0g9lpj5YTt+X1DL17POTxyqLTK3E
-	EiVY1BElWNQR+Ue1tAWLEXKw2JOWiM4RLViqI7pgKXY+CJZq+hos+mTBoo7IwdJpn4Ol
-	PD8zWA7s/XsGyxnBLw2Wuh3P0JOZQmvKGCnQ5cuoJ2Mxz30EdYpaI+RgsacWLByZHLVh
-	spi0YS1Y6rCgryxGysFiT7psHSaUYKnaW7Acfk2+xVlHPFLLnt2GzfSfOYT7YHnWpc2v
-	ryyqegkWdUQJFnVEDha1tAWLEXKw2FMLFnOEBYs6ogVLtXMfLGr6Eiz2pMFijhAde+0l
-	WOrzM4PlwN6/Z7CcEfyiYPk/UBsKbwplbmRzdHJlYW0KZW5kb2JqCjUgMCBvYmoKNDMz
-	MAplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDMgMCBSIC9SZXNv
-	dXJjZXMgNiAwIFIgL0NvbnRlbnRzIDQgMCBSIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNd
-	Cj4+CmVuZG9iago2IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCAvSW1hZ2VC
-	IC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8IC9DczIgMjAgMCBSCi9DczEg
-	NyAwIFIgPj4gL0ZvbnQgPDwgL0YxLjAgMjEgMCBSIC9GMi4wIDMxIDAgUiAvRjMuMCAz
-	MiAwIFIgPj4gL1hPYmplY3QKPDwgL0ltNiAxOCAwIFIgL0ltNCAxNCAwIFIgL0ltMyAx
-	MiAwIFIgL0ltNSAxNiAwIFIgL0ltMiAxMCAwIFIgL0ltMSA4IDAgUgo+PiAvU2hhZGlu
-	ZyA8PCAvU2g2IDI3IDAgUiAvU2g3IDI4IDAgUiAvU2g5IDMwIDAgUiAvU2gzIDI0IDAg
-	UiAvU2g4IDI5IDAgUgovU2gxMSAzNCAwIFIgL1NoNCAyNSAwIFIgL1NoMTMgMzYgMCBS
-	IC9TaDIgMjMgMCBSIC9TaDUgMjYgMCBSIC9TaDEgMjIgMCBSCi9TaDEyIDM1IDAgUiAv
-	U2gxMCAzMyAwIFIgPj4gPj4KZW5kb2JqCjI3IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcg
-	MCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAtMC43MjkxNDM5IC0xLjE2NjI1OSAw
-	IC0wLjcyOTE0MzkKLTEuMTY2MjU5IDguMzQ4NzQ0IF0gL0RvbWFpbiBbIDAgMSBdIC9F
-	eHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAzNyAwIFIKPj4KZW5kb2JqCjI4
-	IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMg
-	WyAtMC43MjkxNDM5IC0xLjE2NjI1OSAwIC0wLjcyOTE0MzkKLTEuMTY2MjU5IDguMzQ4
-	NzQ0IF0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5j
-	dGlvbiAzOCAwIFIKPj4KZW5kb2JqCjMwIDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBS
-	IC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzIuMzEwOTggXSAvRG9t
-	YWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDM5IDAg
-	UiA+PgplbmRvYmoKMjQgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdU
-	eXBlIDMgL0Nvb3JkcyBbIC0wLjcyOTE0MzkgLTEuMTY2MjU5IDAgLTAuNzI5MTQzOQot
-	MS4xNjYyNTkgOC4zNDg3NDQgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNl
-	IGZhbHNlIF0gL0Z1bmN0aW9uIDQwIDAgUgo+PgplbmRvYmoKMjkgMCBvYmoKPDwgL0Nv
-	bG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0wLjcyOTE0Mzkg
-	LTEuMTY2MjU5IDAgLTAuNzI5MTQzOQotMS4xNjYyNTkgOC4zNDg3NDQgXSAvRG9tYWlu
-	IFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDQxIDAgUgo+
-	PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBl
-	IDMgL0Nvb3JkcyBbIDAgMCAwIDAgMCAzMC40NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAv
-	RXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDIgMCBSID4+CmVuZG9iagoy
-	NSAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRz
-	IFsgLTAuNzI5MTQzOSAtMS4xNjYyNTkgMCAtMC43MjkxNDM5Ci0xLjE2NjI1OSA4LjM0
-	ODc0NCBdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVu
-	Y3Rpb24gNDMgMCBSCj4+CmVuZG9iagozNiAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAg
-	UiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgMCAwIDAgMCAwIDMwLjQ2MzA5IF0gL0Rv
-	bWFpbgpbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0NCAw
-	IFIgPj4KZW5kb2JqCjIzIDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5n
-	VHlwZSAzIC9Db29yZHMgWyAtMC43MjkxNDQ2IC0xLjE2NjI2IDAgLTAuNzI5MTQ0Ngot
-	MS4xNjYyNiA4LjM0ODc1MyBdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2Ug
-	ZmFsc2UgXSAvRnVuY3Rpb24gNDUgMCBSCj4+CmVuZG9iagoyNiAwIG9iago8PCAvQ29s
-	b3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgLTAuNzI5MTQzOSAt
-	MS4xNjYyNTkgMCAtMC43MjkxNDM5Ci0xLjE2NjI1OSA4LjM0ODc0NCBdIC9Eb21haW4g
-	WyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gNDYgMCBSCj4+
-	CmVuZG9iagoyMiAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUg
-	MyAvQ29vcmRzIFsgLTUuMzMzMzM1IC00LjY1NjA1NyAwIC01LjMzMzMzNQotNC42NTYw
-	NTcgNDcuNDY2NzQgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNl
-	IF0gL0Z1bmN0aW9uIDQ3IDAgUgo+PgplbmRvYmoKMzUgMCBvYmoKPDwgL0NvbG9yU3Bh
-	Y2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAwIDAgMCAzMC40NjMw
-	OSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rp
-	b24gNDggMCBSID4+CmVuZG9iagozMyAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAv
-	U2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgMCAwIDAgMCAwIDMwLjQ2MzA5IF0gL0RvbWFp
-	bgpbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0OSAwIFIg
-	Pj4KZW5kb2JqCjE4IDAgb2JqCjw8IC9MZW5ndGggMTkgMCBSIC9UeXBlIC9YT2JqZWN0
-	IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9IZWlnaHQgODYgL0NvbG9yU3BhY2UK
-	NTAgMCBSIC9TTWFzayA1MSAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9G
-	bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDDw
-	PjDDhAABCmVuZHN0cmVhbQplbmRvYmoKMTkgMCBvYmoKMjQwCmVuZG9iagoxNCAwIG9i
-	ago8PCAvTGVuZ3RoIDE1IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug
-	L1dpZHRoIDE5NCAvSGVpZ2h0IDg2IC9Db2xvclNwYWNlCjUwIDAgUiAvU01hc2sgNTMg
-	MCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
-	ZWFtCngB7dCBAAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw8D4ww4QAAQplbmRzdHJlYW0K
-	ZW5kb2JqCjE1IDAgb2JqCjI0MAplbmRvYmoKMTIgMCBvYmoKPDwgL0xlbmd0aCAxMyAw
-	IFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdo
-	dCAxMDIgL0NvbG9yU3BhY2UKNTUgMCBSIC9TTWFzayA1NiAwIFIgL0JpdHNQZXJDb21w
-	b25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5
-	U1/gCIVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMG/sAA5+QAAQplbmRzdHJlYW0KZW5kb2JqCjEzIDAgb2JqCjI4MwplbmRv
-	YmoKMTYgMCBvYmoKPDwgL0xlbmd0aCAxNyAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5
-	cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0NvbG9yU3BhY2UKNTUgMCBS
-	IC9TTWFzayA1OCAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURl
-	Y29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5U1/gCIVQYcCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG/sAA5+QAAQplbmRzdHJl
-	YW0KZW5kb2JqCjE3IDAgb2JqCjI4MwplbmRvYmoKMTAgMCBvYmoKPDwgL0xlbmd0aCAx
-	MSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hl
-	aWdodCA4NiAvQ29sb3JTcGFjZQo1MCAwIFIgL1NNYXNrIDYwIDAgUiAvQml0c1BlckNv
-	bXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADD
-	oPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
-	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
-	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
-	MGDAgAEDBgwYMGDAgAEDBgwYMPA+MMOEAAEKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9i
-	agoyNDAKZW5kb2JqCjggMCBvYmoKPDwgL0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVj
-	dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFj
-	ZQo1NSAwIFIgL1NNYXNrIDYyIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
-	L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADDoPlTX+AIhVBhwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
-	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
-	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
-	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwb+wADn5AAB
-	CmVuZHN0cmVhbQplbmRvYmoKOSAwIG9iagoyODMKZW5kb2JqCjYwIDAgb2JqCjw8IC9M
-	ZW5ndGggNjEgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGgg
-	MTk0IC9IZWlnaHQgODYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21w
-	b25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtW/k7W1sXNiYh
-	A4kMZNCQCGlDpEVQ2vQGpdUipPS6VUQN/bQIWqoN8Riu4OpFWq2aqqh5akPQ5/5r39on
-	QnS8X7U95/ke7y/8cs5e717D2dlrvW5uJyD2DrgTAN+5Q+7uHgienp5euAIMwAxxd/9f
-	iGDWe3p5e3uTyGQyBV+QySQwxAvx+Lcs0OaD9SQKxceXSqXR6HQ6AyfA0jQalerrQ6GQ
-	HSz+hSfAfth9MsWHSqMz/JhMFiuAjSMCAlhMpj+DQaP6IBLgiW9wgPjB7KfSGP7MADaX
-	FxjE5wsEQpwgEPD5/EAej8Nm+SMS3+YADkD7T6X7MdncQL4oWCwOlUgkUmkYLpBKpRJJ
-	aIg4WMQP4iESiIPX19wADoDw96X7sTiBApFYEhYuP61QREZFKXFCVFSkQnFaHi6ThAQL
-	ArkB/nQqhQSh9KVIQgTAAQwmJ1AolsjkCqXqXGycOj4hIREnJCTEq9WxMSpl5OlwiVgU
-	xGExaOCGL1HACPjQ/AJ4ArE0QhEdo05MvqjRalNS0/BDqlZ76WJyojpGFSkPEwt5bH+6
-	75coYAR86Ux2kEgSEalSn9do0zIys7J1utw8PU7Iy9XpsrMyr1xO0SSpz0bJJcF8DpPh
-	S/m8F1AIAQEOXyxTqNTJ2vTMHH1BYVFxSanBUFZ2BweUlRkMpSXFRYU39bprGdoL8WcV
-	MrGA+yUK7h5eZB86kysICY+KSdJmZOkLbxsq7lbfr6kzGusdaPhl2F/QaKyrram+W1FW
-	XHgj+4o2OU4pDxXygALZ28Pjo1MGECBRaEyOIEQerb6Ydl3/R2lldV3jw0ctT0ym1jaA
-	+RcDrdnaanry+FFTo/FelaHoRla6Jl4llwi5TLoPyevjggQxRKH6sflAIP5Shu73ksqa
-	hmaTuaOru8di6e3twwW9vRZLz59dHWbTo8aaKkNh7lVtokoeKuD401AqHHECiiFfRkCQ
-	ODw6/rerebfu3Gtoaevs6Rt4Ojg0bLVan+ECWHh4aPDvgX5Ll7ml8X55kT4TURDz2X5U
-	iKMjXwV3cAGNyRPJotSXruqLKmqbWjt7B4aejYyOjo2Pj0/gBFh67NXoyPPhp33dbc3G
-	quIbmdoEpexUIAvi6KgTwAUQQwLJmZiLGXlFlcZH7T0D1hevJqam38zMzs7hh9mZN9NT
-	E2MvrE8tHS31VcX6qxq1Qiri+lMpR5zg7uFNobMCxRGqpDTdrQpjS0fv4MjY1Ju5+YXF
-	pWWEFRyALby0uDA/N/N6/MVQf+fj+qqivIzkcxBHAQwfb0+XMHL3JPn6cYSSSLX2+u93
-	ah919A+PTs7MLy6vrq1vbOKKjfW1tZWl+dmpUStQMFYUZqckKMOQE8heLrns4QVZgFyQ
-	nKEvudfU3js8OjW3uLq++c5ms21tbW3jBFgaDHi3ub669Hb6lbW/o7nGkH/1YoxcHMSi
-	QxgdViMPbx8Gmy9RqLVZf1Q2tFoGgcDy2qZta9tu39nZxRE7O3a7fcv2bn15fnp0uNf8
-	4G6RLiU+SipkM3xJh2EEQUT154pk0efT9aU1LZ0DI5Nzy+vvt+w7u3sOfMAF+4vv7ti3
-	bRvLb6de/t39uK6sICNZFXGKx6SSXRhAJYIgksdczCysbGjrtY7NLK6937aD/QeW//PL
-	cbD03t7uzrZtfXl2/Fl/+4OqW1mXYs+E8lk0ymEiQBrQA7Agyrld3dw58GLq7crmlguB
-	X279/oL7JMAXO9vv1hZegxNaakpyUxOipAI2wyURoJYy2MIwZWKa3lD3pGfo1ZvFddsh
-	AbzsR+s6OezabRtLs+NWS6uxPD8jSSUTcf18D1PZw9vXjxscDpWooKLB3PdsYm55c2vH
-	GUJ4EnByQE7YXHk7OfIXhFFh5oVz8lM8fyrpoBgBA3/eKfk5SIOqhx0DI1Pzq++2dx05
-	gLP9BxR27e9RGD3tbK4uytLEnBYHMqkkT2c59SChRD4do7leVN3c9fTl9MLae7vDBfgT
-	2I+kPbttffHN6CAkQnGOVq2AVHYpRh5kKisoVBH3W/bt+y3dg6NYGmAuIAIBB4W9HUiE
-	mbHhnie1JboUdaSEH0CjHJRTTzKNhZUiXXENSuSZpQ2bnUAMUD7v7WxtQj21WkxGQ14a
-	KkYBdIqX82QEDKCYRsan6ErrTJbhsdnlDdsOYkAMF2BO2NsFBnPj1t62+jJ9WqISvsqu
-	DLDPQVRCaq7BaLJYx2exUkQcAojC3i4Uo7mJZ33mhjv6y4nKMDhXuPiAQmcLpMAgz2Bs
-	BQaOYkpEBpPP+8yN5TeAgUz0KQP4oOWV1cOZwsmAKDGE7Nj3weTzfmCQn34++gsM9CcM
-	fprbvssHP82a73qxI5O/EEXunlgmo4OdaxR910I/7aGvM4DDNdSiowx2936aMd/14g9Y
-	Nf3IB87DqbvXweH6Tn0bOpqubG7vEuZz5iD8Ydf+bvXt1Eh/e2NFAXa85sB1xf7h1JWB
-	43BNRAZ7TgYPThh8VxQf/6EPJz44/iYe8w0nPjjmBv6Ax0988AM28ZivOPHBMTfwBzx+
-	4oMfsInHfMWJD465gT/g8f9zH7h9/lfm/tU9Qf589VfmAQN044VuHWeWHA2Q/T4WIf6g
-	Fgi6N+1tQzden7sv4kui0L1p7RO4u349v7JpgzYmkbBt21xdmH411GMyYvemn9w67rfR
-	iu8/6hh4PjGzgHrJhMLmxuri7OTI066W2lKskfbRvSncvocqYjVZt/7zwGwZfDk1s7C0
-	skoorCwvQF9/uK+9qfp2NnRAoH/gene934y9kHmz3Pi4s986OjE9O/eWUJibezM5ah3o
-	NtVXFV7TONuxh/0DKpN3KkKFGuLVD1q7+4dGRscnpwiFyfFXI8N//Wluum/Iv5J8Vo76
-	aIc9HOijoZa+Mj4l51Z5TVNrF4wWWZ+PEArPnw3BkJG5ua6ySAcNEFnwkaY+9DIZMFyk
-	iNFcvVFcWfvwSXtXT28/wdBn6W43NdVVlRRcuxSnkAo5fi6DFWgwBCbUIqITU7MKiivu
-	1Te1mMztBIPZ1NJUf7+y+GZOWpJKHsJnoys7Zx5ATx+NqEkVMRfSs/JvGSqra4wNjQ8I
-	hcZGY011paGoICdDExcZBkHkOp6DZtRgOkcsU8KgZqYuv/B2aVl5BcFQXlZ6u7BAdy1N
-	E68Mdw4LOjvijjlBmPYNV8ae16RmXMvO1d8oIBjy9bk516+kXUqKU0aEwOTvkVlBGLOD
-	WU0mFxtYjk1M1mhT09IzCIb0y6laTXJinCoyPETIYzFgVPCgIe7mBroJmNpnAYUwmNk/
-	G6tOSDyfRDCcT0xQx56LjpTD7DWP5QdCBNexXw8Pb5IPEh7wRSFSmfyMIkoZrSIYopXK
-	yDPycGlIMJ/L8nPIEJxp4ObmkB4ABTaPLwwG5Yo0TEY8SCWh4lMiPo/NxOQsR3UULvob
-	Di+QLxCKCAihAOQ4XNDjgJblEz0O0nCBBMeHihRcmH6LQziApgykXf4MOgi7SJ8Kihwy
-	NFDRIREdbgq6bwn36EheR0H2f06Y5uDgTSJhMkYfAgKpKzGNI2a/80BxmM2Qz0ACpKQg
-	JAUhJCEBpmFC068JNDExLxAhKDDzXHf95P+THTjZAccO/Bf2t3JMCmVuZHN0cmVhbQpl
-	bmRvYmoKNjEgMCBvYmoKMjcwMwplbmRvYmoKNTEgMCBvYmoKPDwgL0xlbmd0aCA1MiAw
-	IFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdo
-	dCA4NiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9G
-	aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1b+TtbWxc2JiEDiQxk0JAIaUOk
-	RVDa9Aal1SKk9LpVRA39tAhaqg3xGK7g6kVarZqqqHlqQ9Dn/mvf2idCdLxftT3n+R7v
-	L/xyzl7vXsPZ2Wu9bm4nIPYOuBMA37lD7u4eCJ6enl64AgzADHF3/1+IYNZ7enl7e5PI
-	ZDIFX5DJJDDEC/H4tyzQ5oP1JArFx5dKpdHodDoDJ8DSNBqV6utDoZAdLP6FJ8B+2H0y
-	xYdKozP8mEwWK4CNIwICWEymP4NBo/ogEuCJb3CA+MHsp9IY/swANpcXGMTnCwRCnCAQ
-	8Pn8QB6Pw2b5IxLf5gAOQPtPpfsx2dxAvihYLA6VSCRSaRgukEqlEkloiDhYxA/iIRKI
-	g9fX3AAOgPD3pfuxOIECkVgSFi4/rVBERkUpcUJUVKRCcVoeLpOEBAsCuQH+dCqFBKH0
-	pUhCBMABDCYnUCiWyOQKpepcbJw6PiEhESckJMSr1bExKmXk6XCJWBTEYTFo4IYvUcAI
-	+ND8AngCsTRCER2jTky+qNFqU1LT8EOqVnvpYnKiOkYVKQ8TC3lsf7rvlyhgBHzpTHaQ
-	SBIRqVKf12jTMjKzsnW63Dw9TsjL1emyszKvXE7RJKnPRsklwXwOk+FL+bwXUAgBAQ5f
-	LFOo1Mna9MwcfUFhUXFJqcFQVnYHB5SVGQylJcVFhTf1umsZ2gvxZxUysYD7JQruHl5k
-	HzqTKwgJj4pJ0mZk6QtvGyruVt+vqTMa6x1o+GXYX9BorKutqb5bUVZceCP7ijY5TikP
-	FfKAAtnbw+OjUwYQIFFoTI4gRB6tvph2Xf9HaWV1XePDRy1PTKbWNoD5FwOt2dpqevL4
-	UVOj8V6VoehGVromXiWXCLlMug/J6+OCBDFEofqx+UAg/lKG7veSypqGZpO5o6u7x2Lp
-	7e3DBb29FkvPn10dZtOjxpoqQ2HuVW2iSh4q4PjTUCoccQKKIV9GQJA4PDr+t6t5t+7c
-	a2hp6+zpG3g6ODRstVqf4QJYeHho8O+BfkuXuaXxfnmRPhNREPPZflSIoyNfBXdwAY3J
-	E8mi1Jeu6osqaptaO3sHhp6NjI6OjY+PT+AEWHrs1ejI8+Gnfd1tzcaq4huZ2gSl7FQg
-	C+LoqBPABRBDAsmZmIsZeUWVxkftPQPWF68mpqbfzMzOzuGH2Zk301MTYy+sTy0dLfVV
-	xfqrGrVCKuL6UylHnODu4U2hswLFEaqkNN2tCmNLR+/gyNjUm7n5hcWlZYQVHIAtvLS4
-	MD8383r8xVB/5+P6qqK8jORzEEcBDB9vT5cwcvck+fpxhJJItfb673dqH3X0D49Ozswv
-	Lq+urW9s4oqN9bW1laX52alRK1AwVhRmpyQow5ATyF4uuezhBVmAXJCcoS+519TeOzw6
-	Nbe4ur75zmazbW1tbeMEWBoMeLe5vrr0dvqVtb+jucaQf/VijFwcxKJDGB1WIw9vHwab
-	L1GotVl/VDa0WgaBwPLapm1r227f2dnFETs7drt9y/ZufXl+enS41/zgbpEuJT5KKmQz
-	fEmHYQRBRPXnimTR59P1pTUtnQMjk3PL6++37Du7ew58wAX7i+/u2LdtG8tvp17+3f24
-	rqwgI1kVcYrHpJJdGEAlgiCSx1zMLKxsaOu1js0srr3ftoP9B5b/88txsPTe3u7Otm19
-	eXb8WX/7g6pbWZdiz4TyWTTKYSJAGtADsCDKuV3d3DnwYurtyuaWC4Ffbv3+gvskwBc7
-	2+/WFl6DE1pqSnJTE6KkAjbDJRGgljLYwjBlYpreUPekZ+jVm8V12yEBvOxH6zo57Npt
-	G0uz41ZLq7E8PyNJJRNx/XwPU9nD29ePGxwOlaigosHc92xibnlza8cZQngScHJATthc
-	eTs58heEUWHmhXPyUzx/KumgGAEDf94p+TlIg6qHHQMjU/Or77Z3HTmAs/0HFHbt71EY
-	Pe1sri7K0sScFgcyqSRPZzn1IKFEPh2juV5U3dz19OX0wtp7u8MF+BPYj6Q9u2198c3o
-	ICRCcY5WrYBUdilGHmQqKyhUEfdb9u37Ld2Do1gaYC4gAgEHhb0dSISZseGeJ7UluhR1
-	pIQfQKMclFNPMo2FlSJdcQ1K5JmlDZudQAxQPu/tbG1CPbVaTEZDXhoqRgF0ipfzZAQM
-	oJhGxqfoSutMluGx2eUN2w5iQAwXYE7Y2wUGc+PW3rb6Mn1aohK+yq4MsM9BVEJqrsFo
-	sljHZ7FSRBwCiMLeLhSjuYlnfeaGO/rLicowOFe4+IBCZwukwCDPYGwFBo5iSkQGk8/7
-	zI3lN4CBTPQpA/ig5ZXVw5nCyYAoMYTs2PfB5PN+YJCffj76Cwz0Jwx+mtu+ywc/zZrv
-	erEjk78QRe6eWCajg51rFH3XQj/toa8zgMM11KKjDHb3fpox3/XiD1g1/cgHzsOpu9fB
-	4fpOfRs6mq5sbu8S5nPmIPxh1/5u9e3USH97Y0UBdrzmwHXF/uHUlYHjcE1EBntOBg9O
-	GHxXFB//oQ8nPjj+Jh7zDSc+OOYG/oDHT3zwAzbxmK848cExN/AHPH7igx+wicd8xYkP
-	jrmBP+Dx/3MfuH3+V+b+1T1B/nz1V+YBA3TjhW4dZ5YcDZD9PhYh/qAWCLo37W1DN16f
-	uy/iS6LQvWntE7i7fj2/smmDNiaRsG3bXF2YfjXUYzJi96af3Drut9GK7z/qGHg+MbOA
-	esmEwubG6uLs5MjTrpbaUqyR9tG9Kdy+hypiNVm3/vPAbBl8OTWzsLSySiisLC9AX3+4
-	r72p+nY2dECgf+B6d73fjL2QebPc+Liz3zo6MT0795ZQmJt7MzlqHeg21VcVXtM427GH
-	/QMqk3cqQoUa4tUPWrv7h0ZGxyenCIXJ8Vcjw3/9aW66b8i/knxWjvpohz0c6KOhlr4y
-	PiXnVnlNU2sXjBZZn48QCs+fDcGQkbm5rrJIBw0QWfCRpj70MhkwXKSI0Vy9UVxZ+/BJ
-	e1dPbz/B0Gfpbjc11VWVFFy7FKeQCjl+LoMVaDAEJtQiohNTswqKK+7VN7WYzO0Eg9nU
-	0lR/v7L4Zk5akkoewmejKztnHkBPH42oSRUxF9Kz8m8ZKqtrjA2NDwiFxkZjTXWloagg
-	J0MTFxkGQeQ6noNm1GA6RyxTwqBmpi6/8HZpWXkFwVBeVnq7sEB3LU0Trwx3Dgs6O+KO
-	OUGY9g1Xxp7XpGZcy87V3yggGPL1uTnXr6RdSopTRoTA5O+RWUEYs4NZTSYXG1iOTUzW
-	aFPT0jMIhvTLqVpNcmKcKjI8RMhjMWBU8KAh7uYGugmY2mcBhTCY2T8bq05IPJ9EMJxP
-	TFDHnouOlMPsNY/lB0IE17FfDw9vkg8SHvBFIVKZ/IwiShmtIhiilcrIM/JwaUgwn8vy
-	c8gQnGng5uaQHgAFNo8vDAblijRMRjxIJaHiUyI+j83E5CxHdRQu+hsOL5AvEIoICKEA
-	5Dhc0OOAluUTPQ7ScIEEx4eKFFyYfotDOICmDKRd/gw6CLtInwqKHDI0UNEhER1uCrpv
-	CffoSF5HQfZ/Tpjm4OBNImEyRh8CAqkrMY0jZr/zQHGYzZDPQAKkpCAkBSEkIQGmYULT
-	rwk0MTEvECEoMPNcd/3k/5MdONkBxw78F/a3ckwKZW5kc3RyZWFtCmVuZG9iago1MiAw
-	IG9iagoyNzAzCmVuZG9iago2MiAwIG9iago8PCAvTGVuZ3RoIDYzIDAgUiAvVHlwZSAv
-	WE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDEwMiAvQ29s
-	b3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0Zs
-	YXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1c61dSaR+VO3g4R4GjKJfEQNQBQSYIxcvQKKhd
-	vBVelqWmRtbCIXEwG43EZTrjpWa8j05opVmWOsWMadZ6/7X3OZAXHNf5eNYzs87+4Jfn
-	w+/Ze/PAcq3f3nFxNGBTgAE7SARjMJgALBaLDS3A5Yg7Mhin0SCuz2JzOFwuj8eHFDwe
-	l8vhsAkW/+BA6A+uz+ML4hFEKERRDDqgqFCIIPECPi9KIpYDuD/Qn8dHhBiWKBKJJTiE
-	kIhFokQMEyICwAH4EEOBwWRxuPx4ISaS4MnSFJlMLldABrlcJkuVJuMSESaM53M5bCbz
-	2GOIEkDQRElyqlyZpjqrVmsyIINGoz6rSlPKU6W4CCNsYB03AbwBLh/BRHiqQqXOyMzW
-	6XMMRthg0Ouys7RqlTI16YDCkQngM0QQSJKlqTN1BtM5izUv3wYb8qwWs8moy9KoZMli
-	DOFz2UcmMJgcXjwKCKi0ulyztaDYXlLqhA6OkgvFhXnmXL0WUAAu8DjHGAALhIm4LE2b
-	Y7YVl5RdqqyuveaCDNdqa6oul5d+ZzMbMlWyJBEq4LIO3zKTzYvHJClpGTmWotKL1a7G
-	Gy1t7R23oEJHe1vrjUZXzSVHsdUIXMATEB77iAGwQJSsUOvMRc5KV1Or+27XPV8PZPDd
-	67rrbrteV1X+nUWvUUpFQj7nOANUnJKWabSVVtY3uz3d/gcDgcEgVBgMPPyp1+dxtzRU
-	OQtMWcAETHD0EJgcAYbLzurMxRddzW6vv39weHRsfAIqjI/9PBwc6PV2ttZftlv0akVS
-	QjyXdfCzzOQiiclKjcFaUtXk9t4PDI89+W1mdg4qzM5MPRl7/KjP626udeQbtWekIoR3
-	yIDFQ0TStEyTrczV6vEHRian5hafhZahQujZ0vzU5Oij3q72uoqib7NVKScZpKiyzxVd
-	arzV3T88Mf176MXqOmRYexFanJkcGfB1Nl2xm3XpMrGQzz74FLH4QnFq+jcWe+X1O/7B
-	sanfl1dfv93cggqb796srSxOjwfve5qrv7fq1TIJGsNAIlPrrd9Xt3geDD+ZC61ubP4Z
-	hgzvtzbWlheePu733qwtzTNo5HgMAxSXqXPySmtvegdGf1t88Xrzw98fd6HCx53w1puX
-	S1O/BHztLqfNmKHAseMeoLhcY8h3XGvvDozNPFt9++ffu5/2ocKnvZ3379ZCs+ODP7rr
-	ymy5WuUpDGxOV4dvcHw2tL4Z/vjp8xeo8Hl/N7y1vjI/GfS768sLYhkw2HwMV2QYAYNb
-	PcGJueX1rfDu/pf/QYUvn/f+2n79fGFyqPd2Q0WhSatMIn6Uo/8h0Awo8Yr2gBKZSYfQ
-	HpDKQ8kh7QElMpMOoT0glYeSQ9oDSmQmHUJ7QCoPJYe0B5TITDqE9oBUHkoOaQ8okZl0
-	CO0BqTyUHNIeUCIz6RDaA1J5KDmkPaBEZtIhtAek8lBySHtAicykQ2gPSOWh5JD2gBKZ
-	SYfQHpDKQ8kh7QElMpMOoT0glYeSQ9oDSmQmHUJ7QCoPJYe0B5TITDrkP+5BHIsf2bP7
-	926pHTIAm4I+YlNw7d37nb39z1Bhf2/nw+YrYlPQDzYFT+zZRRhEtzXbvA9Hp5ZevNkK
-	7+zuQYXdnfD2xss/psG2Zsep25qRjdmSmtaun4afzi+vbWy/D/8FFcIftt++Wln4daT/
-	XttVR75Bc2LfVCgGy/sWe9WNu73BsanF52sb77a2ocLW5sar50szE0N9npbqkn9sLYPd
-	d7A5bi6+3Oj2DTyenF1afvlq/TVUWF9fXVmafToa6LkDNscturOxm+Nft/cLyl03Pb2P
-	RienF5ZCK8+hwkroj4WZJz8H+35or7/4dXuff5g/iCYoMox5pTXX3d6+RyPjT6dn5xeg
-	wvzc9K8To8EH3Z3NtWDt+kSCgsmJx3C5Wm+2X6pr7bx3/+HQyC/jk5BhYmx0KNDXfedm
-	w5UL5/WaEykWkMORpKqycm2OqobW2109ff2B4BBkCAb6+3p+6GxtrHEWmrLTTyaJQJpL
-	qtTozcVlVfU32js9Xt+P/l6o4Pf7vJ7O9uaGmgr7+ZwMEMNBj6e52DwEw1NVWqO12Hm5
-	tr6ppa3DfRsyuDvaWpoaaq847XlGEAokEnUHi+NxcQwi1UjEMjONlgK7o+JK9VVXXQNk
-	qHddram86LxQeN6YlS5Pjk01RpKlmCgZJEv1JoutyF7icJZXQIbyMkeJvch23pSTma6Q
-	EuFYzuGXaVwciOiDdK8YUNBk643fWqz5toJCyFBgy7dazuXmZGtVcqk4ITbdG8dkcriC
-	SEBZma7RgoC1wZhrggy5RmOOLjtTk34GxJMThJGQ+FHCmki58wgKuFSmOANC7poMLXyI
-	xtxlp6bcgQls0DSAoAkiPAkUDcgVSgihkEeqBsSJKAIaH0DTwEGejrCCaHsAFAQIiiVE
-	ux6SoAPonwB9D4kYigiiVQnHCUQpEDbwicINCOs2ov0fKFG5wSfuf7Ku4sCGaOkJUXki
-	gBDEvUDvydfGkFgHom860jwT6Z3hQArQiBOpnjm9eeaABSj/Iepp4ESkmSh6U/ovrQCt
-	wHEF/g8/2JcPCmVuZHN0cmVhbQplbmRvYmoKNjMgMCBvYmoKMTkyNwplbmRvYmoKNTMg
-	MCBvYmoKPDwgL0xlbmd0aCA1NCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0lt
-	YWdlIC9XaWR0aCAxOTQgL0hlaWdodCA4NiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAv
-	Qml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
-	Ae1b+TtbWxc2JiEDiQxk0JAIaUOkRVDa9Aal1SKk9LpVRA39tAhaqg3xGK7g6kVarZqq
-	qHlqQ9Dn/mvf2idCdLxftT3n+R7vL/xyzl7vXsPZ2Wu9bm4nIPYOuBMA37lD7u4eCJ6e
-	nl64AgzADHF3/1+IYNZ7enl7e5PIZDIFX5DJJDDEC/H4tyzQ5oP1JArFx5dKpdHodDoD
-	J8DSNBqV6utDoZAdLP6FJ8B+2H0yxYdKozP8mEwWK4CNIwICWEymP4NBo/ogEuCJb3CA
-	+MHsp9IY/swANpcXGMTnCwRCnCAQ8Pn8QB6Pw2b5IxLf5gAOQPtPpfsx2dxAvihYLA6V
-	SCRSaRgukEqlEkloiDhYxA/iIRKIg9fX3AAOgPD3pfuxOIECkVgSFi4/rVBERkUpcUJU
-	VKRCcVoeLpOEBAsCuQH+dCqFBKH0pUhCBMABDCYnUCiWyOQKpepcbJw6PiEhESckJMSr
-	1bExKmXk6XCJWBTEYTFo4IYvUcAI+ND8AngCsTRCER2jTky+qNFqU1LT8EOqVnvpYnKi
-	OkYVKQ8TC3lsf7rvlyhgBHzpTHaQSBIRqVKf12jTMjKzsnW63Dw9TsjL1emyszKvXE7R
-	JKnPRsklwXwOk+FL+bwXUAgBAQ5fLFOo1Mna9MwcfUFhUXFJqcFQVnYHB5SVGQylJcVF
-	hTf1umsZ2gvxZxUysYD7JQruHl5kHzqTKwgJj4pJ0mZk6QtvGyruVt+vqTMa6x1o+GXY
-	X9BorKutqb5bUVZceCP7ijY5TikPFfKAAtnbw+OjUwYQIFFoTI4gRB6tvph2Xf9HaWV1
-	XePDRy1PTKbWNoD5FwOt2dpqevL4UVOj8V6VoehGVromXiWXCLlMug/J6+OCBDFEofqx
-	+UAg/lKG7veSypqGZpO5o6u7x2Lp7e3DBb29FkvPn10dZtOjxpoqQ2HuVW2iSh4q4PjT
-	UCoccQKKIV9GQJA4PDr+t6t5t+7ca2hp6+zpG3g6ODRstVqf4QJYeHho8O+BfkuXuaXx
-	fnmRPhNREPPZflSIoyNfBXdwAY3JE8mi1Jeu6osqaptaO3sHhp6NjI6OjY+PT+AEWHrs
-	1ejI8+Gnfd1tzcaq4huZ2gSl7FQgC+LoqBPABRBDAsmZmIsZeUWVxkftPQPWF68mpqbf
-	zMzOzuGH2Zk301MTYy+sTy0dLfVVxfqrGrVCKuL6UylHnODu4U2hswLFEaqkNN2tCmNL
-	R+/gyNjUm7n5hcWlZYQVHIAtvLS4MD8383r8xVB/5+P6qqK8jORzEEcBDB9vT5cwcvck
-	+fpxhJJItfb673dqH3X0D49OzswvLq+urW9s4oqN9bW1laX52alRK1AwVhRmpyQow5AT
-	yF4uuezhBVmAXJCcoS+519TeOzw6Nbe4ur75zmazbW1tbeMEWBoMeLe5vrr0dvqVtb+j
-	ucaQf/VijFwcxKJDGB1WIw9vHwabL1GotVl/VDa0WgaBwPLapm1r227f2dnFETs7drt9
-	y/ZufXl+enS41/zgbpEuJT5KKmQzfEmHYQRBRPXnimTR59P1pTUtnQMjk3PL6++37Du7
-	ew58wAX7i+/u2LdtG8tvp17+3f24rqwgI1kVcYrHpJJdGEAlgiCSx1zMLKxsaOu1js0s
-	rr3ftoP9B5b/88txsPTe3u7Otm19eXb8WX/7g6pbWZdiz4TyWTTKYSJAGtADsCDKuV3d
-	3DnwYurtyuaWC4Ffbv3+gvskwBc72+/WFl6DE1pqSnJTE6KkAjbDJRGgljLYwjBlYpre
-	UPekZ+jVm8V12yEBvOxH6zo57NptG0uz41ZLq7E8PyNJJRNx/XwPU9nD29ePGxwOlaig
-	osHc92xibnlza8cZQngScHJATthceTs58heEUWHmhXPyUzx/KumgGAEDf94p+TlIg6qH
-	HQMjU/Or77Z3HTmAs/0HFHbt71EYPe1sri7K0sScFgcyqSRPZzn1IKFEPh2juV5U3dz1
-	9OX0wtp7u8MF+BPYj6Q9u2198c3oICRCcY5WrYBUdilGHmQqKyhUEfdb9u37Ld2Do1ga
-	YC4gAgEHhb0dSISZseGeJ7UluhR1pIQfQKMclFNPMo2FlSJdcQ1K5JmlDZudQAxQPu/t
-	bG1CPbVaTEZDXhoqRgF0ipfzZAQMoJhGxqfoSutMluGx2eUN2w5iQAwXYE7Y2wUGc+PW
-	3rb6Mn1aohK+yq4MsM9BVEJqrsFosljHZ7FSRBwCiMLeLhSjuYlnfeaGO/rLicowOFe4
-	+IBCZwukwCDPYGwFBo5iSkQGk8/7zI3lN4CBTPQpA/ig5ZXVw5nCyYAoMYTs2PfB5PN+
-	YJCffj76Cwz0Jwx+mtu+ywc/zZrverEjk78QRe6eWCajg51rFH3XQj/toa8zgMM11KKj
-	DHb3fpox3/XiD1g1/cgHzsOpu9fB4fpOfRs6mq5sbu8S5nPmIPxh1/5u9e3USH97Y0UB
-	drzmwHXF/uHUlYHjcE1EBntOBg9OGHxXFB//oQ8nPjj+Jh7zDSc+OOYG/oDHT3zwAzbx
-	mK848cExN/AHPH7igx+wicd8xYkPjrmBP+Dx/3MfuH3+V+b+1T1B/nz1V+YBA3TjhW4d
-	Z5YcDZD9PhYh/qAWCLo37W1DN16fuy/iS6LQvWntE7i7fj2/smmDNiaRsG3bXF2YfjXU
-	YzJi96af3Drut9GK7z/qGHg+MbOAesmEwubG6uLs5MjTrpbaUqyR9tG9Kdy+hypiNVm3
-	/vPAbBl8OTWzsLSySiisLC9AX3+4r72p+nY2dECgf+B6d73fjL2QebPc+Liz3zo6MT07
-	95ZQmJt7MzlqHeg21VcVXtM427GH/QMqk3cqQoUa4tUPWrv7h0ZGxyenCIXJ8Vcjw3/9
-	aW66b8i/knxWjvpohz0c6KOhlr4yPiXnVnlNU2sXjBZZn48QCs+fDcGQkbm5rrJIBw0Q
-	WfCRpj70MhkwXKSI0Vy9UVxZ+/BJe1dPbz/B0Gfpbjc11VWVFFy7FKeQCjl+LoMVaDAE
-	JtQiohNTswqKK+7VN7WYzO0Eg9nU0lR/v7L4Zk5akkoewmejKztnHkBPH42oSRUxF9Kz
-	8m8ZKqtrjA2NDwiFxkZjTXWloaggJ0MTFxkGQeQ6noNm1GA6RyxTwqBmpi6/8HZpWXkF
-	wVBeVnq7sEB3LU0Trwx3Dgs6O+KOOUGY9g1Xxp7XpGZcy87V3yggGPL1uTnXr6RdSopT
-	RoTA5O+RWUEYs4NZTSYXG1iOTUzWaFPT0jMIhvTLqVpNcmKcKjI8RMhjMWBU8KAh7uYG
-	ugmY2mcBhTCY2T8bq05IPJ9EMJxPTFDHnouOlMPsNY/lB0IE17FfDw9vkg8SHvBFIVKZ
-	/IwiShmtIhiilcrIM/JwaUgwn8vyc8gQnGng5uaQHgAFNo8vDAblijRMRjxIJaHiUyI+
-	j83E5CxHdRQu+hsOL5AvEIoICKEA5Dhc0OOAluUTPQ7ScIEEx4eKFFyYfotDOICmDKRd
-	/gw6CLtInwqKHDI0UNEhER1uCrpvCffoSF5HQfZ/Tpjm4OBNImEyRh8CAqkrMY0jZr/z
-	QHGYzZDPQAKkpCAkBSEkIQGmYULTrwk0MTEvECEoMPNcd/3k/5MdONkBxw78F/a3ckwK
-	ZW5kc3RyZWFtCmVuZG9iago1NCAwIG9iagoyNzAzCmVuZG9iago1NiAwIG9iago8PCAv
-	TGVuZ3RoIDU3IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRo
-	IDE5NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNv
-	bXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1c61dSaR+V
-	O3g4R4GjKJfEQNQBQSYIxcvQKKhdvBVelqWmRtbCIXEwG43EZTrjpWa8j05opVmWOsWM
-	adZ6/7X3OZAXHNf5eNYzs87+4Jfnw+/Ze/PAcq3f3nFxNGBTgAE7SARjMJgALBaLDS3A
-	5Yg7Mhin0SCuz2JzOFwuj8eHFDwel8vhsAkW/+BA6A+uz+ML4hFEKERRDDqgqFCIIPEC
-	Pi9KIpYDuD/Qn8dHhBiWKBKJJTiEkIhFokQMEyICwAH4EEOBwWRxuPx4ISaS4MnSFJlM
-	LldABrlcJkuVJuMSESaM53M5bCbz2GOIEkDQRElyqlyZpjqrVmsyIINGoz6rSlPKU6W4
-	CCNsYB03AbwBLh/BRHiqQqXOyMzW6XMMRthg0Ouys7RqlTI16YDCkQngM0QQSJKlqTN1
-	BtM5izUv3wYb8qwWs8moy9KoZMliDOFz2UcmMJgcXjwKCKi0ulyztaDYXlLqhA6OkgvF
-	hXnmXL0WUAAu8DjHGAALhIm4LE2bY7YVl5RdqqyuveaCDNdqa6oul5d+ZzMbMlWyJBEq
-	4LIO3zKTzYvHJClpGTmWotKL1a7GGy1t7R23oEJHe1vrjUZXzSVHsdUIXMATEB77iAGw
-	QJSsUOvMRc5KV1Or+27XPV8PZPDd67rrbrteV1X+nUWvUUpFQj7nOANUnJKWabSVVtY3
-	uz3d/gcDgcEgVBgMPPyp1+dxtzRUOQtMWcAETHD0EJgcAYbLzurMxRddzW6vv39weHRs
-	fAIqjI/9PBwc6PV2ttZftlv0akVSQjyXdfCzzOQiiclKjcFaUtXk9t4PDI89+W1mdg4q
-	zM5MPRl7/KjP626udeQbtWekIoR3yIDFQ0TStEyTrczV6vEHRian5hafhZahQujZ0vzU
-	5Oij3q72uoqib7NVKScZpKiyzxVdarzV3T88Mf176MXqOmRYexFanJkcGfB1Nl2xm3Xp
-	MrGQzz74FLH4QnFq+jcWe+X1O/7Bsanfl1dfv93cggqb796srSxOjwfve5qrv7fq1TIJ
-	GsNAIlPrrd9Xt3geDD+ZC61ubP4ZhgzvtzbWlheePu733qwtzTNo5HgMAxSXqXPySmtv
-	egdGf1t88Xrzw98fd6HCx53w1puXS1O/BHztLqfNmKHAseMeoLhcY8h3XGvvDozNPFt9
-	++ffu5/2ocKnvZ3379ZCs+ODP7rrymy5WuUpDGxOV4dvcHw2tL4Z/vjp8xeo8Hl/N7y1
-	vjI/GfS768sLYhkw2HwMV2QYAYNbPcGJueX1rfDu/pf/QYUvn/f+2n79fGFyqPd2Q0Wh
-	SatMIn6Uo/8h0Awo8Yr2gBKZSYfQHpDKQ8kh7QElMpMOoT0glYeSQ9oDSmQmHUJ7QCoP
-	JYe0B5TITDqE9oBUHkoOaQ8okZl0CO0BqTyUHNIeUCIz6RDaA1J5KDmkPaBEZtIhtAek
-	8lBySHtAicykQ2gPSOWh5JD2gBKZSYfQHpDKQ8kh7QElMpMOoT0glYeSQ9oDSmQmHUJ7
-	QCoPJYe0B5TITDrkP+5BHIsf2bP7926pHTIAm4I+YlNw7d37nb39z1Bhf2/nw+YrYlPQ
-	DzYFT+zZRRhEtzXbvA9Hp5ZevNkK7+zuQYXdnfD2xss/psG2Zsep25qRjdmSmtaun4af
-	zi+vbWy/D/8FFcIftt++Wln4daT/XttVR75Bc2LfVCgGy/sWe9WNu73BsanF52sb77a2
-	ocLW5sar50szE0N9npbqkn9sLYPdd7A5bi6+3Oj2DTyenF1afvlq/TVUWF9fXVmafToa
-	6LkDNscturOxm+Nft/cLyl03Pb2PRienF5ZCK8+hwkroj4WZJz8H+35or7/4dXuff5g/
-	iCYoMox5pTXX3d6+RyPjT6dn5xegwvzc9K8To8EH3Z3NtWDt+kSCgsmJx3C5Wm+2X6pr
-	7bx3/+HQyC/jk5BhYmx0KNDXfedmw5UL5/WaEykWkMORpKqycm2OqobW2109ff2B4BBk
-	CAb6+3p+6GxtrHEWmrLTTyaJQJpLqtTozcVlVfU32js9Xt+P/l6o4Pf7vJ7O9uaGmgr7
-	+ZwMEMNBj6e52DwEw1NVWqO12Hm5tr6ppa3DfRsyuDvaWpoaaq847XlGEAokEnUHi+Nx
-	cQwi1UjEMjONlgK7o+JK9VVXXQNkqHddram86LxQeN6YlS5Pjk01RpKlmCgZJEv1Jout
-	yF7icJZXQIbyMkeJvch23pSTma6QEuFYzuGXaVwciOiDdK8YUNBk643fWqz5toJCyFBg
-	y7dazuXmZGtVcqk4ITbdG8dkcriCSEBZma7RgoC1wZhrggy5RmOOLjtTk34GxJMThJGQ
-	+FHCmki58wgKuFSmOANC7poMLXyIxtxlp6bcgQls0DSAoAkiPAkUDcgVSgihkEeqBsSJ
-	KAIaH0DTwEGejrCCaHsAFAQIiiVEux6SoAPonwB9D4kYigiiVQnHCUQpEDbwicINCOs2
-	ov0fKFG5wSfuf7Ku4sCGaOkJUXkigBDEvUDvydfGkFgHom860jwT6Z3hQArQiBOpnjm9
-	eeaABSj/Iepp4ESkmSh6U/ovrQCtwHEF/g8/2JcPCmVuZHN0cmVhbQplbmRvYmoKNTcg
-	MCBvYmoKMTkyNwplbmRvYmoKNTggMCBvYmoKPDwgL0xlbmd0aCA1OSAwIFIgL1R5cGUg
-	L1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0Nv
-	bG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9G
-	bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtXOtXUmkflTt4OEeBoyiXxEDUAUEmCMXL0Cio
-	XbwVXpalpkbWwiFxMBuNxGU646VmvI9OaKVZljrFjGnWev+19zmQFxzX+XjWM7PO/uCX
-	58Pv2XvzwHKt395xcTRgU4ABO0gEYzCYACwWiw0twOWIOzIYp9Egrs9iczhcLo/HhxQ8
-	HpfL4bAJFv/gQOgPrs/jC+IRRChEUQw6oKhQiCDxAj4vSiKWA7g/0J/HR4QYligSiSU4
-	hJCIRaJEDBMiAsAB+BBDgcFkcbj8eCEmkuDJ0hSZTC5XQAa5XCZLlSbjEhEmjOdzOWwm
-	89hjiBJA0ERJcqpcmaY6q1ZrMiCDRqM+q0pTylOluAgjbGAdNwG8AS4fwUR4qkKlzsjM
-	1ulzDEbYYNDrsrO0apUyNemAwpEJ4DNEEEiSpakzdQbTOYs1L98GG/KsFrPJqMvSqGTJ
-	Ygzhc9lHJjCYHF48CgiotLpcs7Wg2F5S6oQOjpILxYV55ly9FlAALvA4xxgAC4SJuCxN
-	m2O2FZeUXaqsrr3mggzXamuqLpeXfmczGzJVsiQRKuCyDt8yk82LxyQpaRk5lqLSi9Wu
-	xhstbe0dt6BCR3tb641GV80lR7HVCFzAExAe+4gBsECUrFDrzEXOSldTq/tu1z1fD2Tw
-	3eu66267XldV/p1Fr1FKRUI+5zgDVJySlmm0lVbWN7s93f4HA4HBIFQYDDz8qdfncbc0
-	VDkLTFnABExw9BCYHAGGy87qzMUXXc1ur79/cHh0bHwCKoyP/TwcHOj1drbWX7Zb9GpF
-	UkI8l3Xws8zkIonJSo3BWlLV5PbeDwyPPfltZnYOKszOTD0Ze/yoz+turnXkG7VnpCKE
-	d8iAxUNE0rRMk63M1erxB0Ymp+YWn4WWoULo2dL81OToo96u9rqKom+zVSknGaSoss8V
-	XWq81d0/PDH9e+jF6jpkWHsRWpyZHBnwdTZdsZt16TKxkM8++BSx+EJxavo3Fnvl9Tv+
-	wbGp35dXX7/d3IIKm+/erK0sTo8H73uaq7+36tUyCRrDQCJT663fV7d4Hgw/mQutbmz+
-	GYYM77c21pYXnj7u996sLc0zaOR4DAMUl6lz8kprb3oHRn9bfPF688PfH3ehwsed8Nab
-	l0tTvwR87S6nzZihwLHjHqC4XGPId1xr7w6MzTxbffvn37uf9qHCp72d9+/WQrPjgz+6
-	68psuVrlKQxsTleHb3B8NrS+Gf746fMXqPB5fze8tb4yPxn0u+vLC2IZMNh8DFdkGAGD
-	Wz3Bibnl9a3w7v6X/0GFL5/3/tp+/Xxhcqj3dkNFoUmrTCJ+lKP/IdAMKPGK9oASmUmH
-	0B6QykPJIe0BJTKTDqE9IJWHkkPaA0pkJh1Ce0AqDyWHtAeUyEw6hPaAVB5KDmkPKJGZ
-	dAjtAak8lBzSHlAiM+kQ2gNSeSg5pD2gRGbSIbQHpPJQckh7QInMpENoD0jloeSQ9oAS
-	mUmH0B6QykPJIe0BJTKTDqE9IJWHkkPaA0pkJh1Ce0AqDyWHtAeUyEw65D/uQRyLH9mz
-	+/duqR0yAJuCPmJTcO3d+529/c9QYX9v58PmK2JT0A82BU/s2UUYRLc127wPR6eWXrzZ
-	Cu/s7kGF3Z3w9sbLP6bBtmbHqduakY3ZkprWrp+Gn84vr21svw//BRXCH7bfvlpZ+HWk
-	/17bVUe+QXNi31QoBsv7FnvVjbu9wbGpxedrG++2tqHC1ubGq+dLMxNDfZ6W6pJ/bC2D
-	3XewOW4uvtzo9g08npxdWn75av01VFhfX11Zmn06Gui5AzbHLbqzsZvjX7f3C8pdNz29
-	j0YnpxeWQivPocJK6I+FmSc/B/t+aK+/+HV7n3+YP4gmKDKMeaU1193evkcj40+nZ+cX
-	oML83PSvE6PBB92dzbVg7fpEgoLJicdwuVpvtl+qa+28d//h0Mgv45OQYWJsdCjQ133n
-	ZsOVC+f1mhMpFpDDkaSqsnJtjqqG1ttdPX39geAQZAgG+vt6fuhsbaxxFpqy008miUCa
-	S6rU6M3FZVX1N9o7PV7fj/5eqOD3+7yezvbmhpoK+/mcDBDDQY+nudg8BMNTVVqjtdh5
-	uba+qaWtw30bMrg72lqaGmqvOO15RhAKJBJ1B4vjcXEMItVIxDIzjZYCu6PiSvVVV10D
-	ZKh3Xa2pvOi8UHjemJUuT45NNUaSpZgoGSRL9SaLrche4nCWV0CG8jJHib3Idt6Uk5mu
-	kBLhWM7hl2lcHIjog3SvGFDQZOuN31qs+baCQshQYMu3Ws7l5mRrVXKpOCE23RvHZHK4
-	gkhAWZmu0YKAtcGYa4IMuUZjji47U5N+BsSTE4SRkPhRwppIufMICrhUpjgDQu6aDC18
-	iMbcZaem3IEJbNA0gKAJIjwJFA3IFUoIoZBHqgbEiSgCGh9A08BBno6wgmh7ABQECIol
-	RLsekqAD6J8AfQ+JGIoIolUJxwlEKRA28InCDQjrNqL9HyhRucEn7n+yruLAhmjpCVF5
-	IoAQxL1A78nXxpBYB6JvOtI8E+md4UAK0IgTqZ45vXnmgAUo/yHqaeBEpJkoelP6L60A
-	rcBxBf4PP9iXDwplbmRzdHJlYW0KZW5kb2JqCjU5IDAgb2JqCjE5MjcKZW5kb2JqCjY0
-	IDAgb2JqCjw8IC9MZW5ndGggNjUgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3Jh
-	eSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFUk9IFFEc/s02EoSIQYV4
-	iHcKCZUprKyg2nZ1WZVtW5XSohhn37qjszPTm9k1xZMEXaI8dQ+iY3Ts0KGbl6LArEvX
-	IKkgCDx16PvN7OoohG95O9/7/f1+33tEbZ2m7zspQVRzQ5UrpaduTk2Lgx8pRR3UTlim
-	FfjpYnGMseu5kr+719Zn0tiy3se1dvv2PbWVZWAh6i22txD6IZFmAB+ZnyhlgLPAHZav
-	2D4BPFgOrBrwI6IDD5q5MNPRnHSlsi2RU+aiKCqvYjtJrvv5uca+i7WJg/5cj2bWjr2z
-	6qrRTNS090ShvA+uRBnPX1T2bDUUpw3jnEhDGinyrtXfK0zHEZErEEoGUjVkuZ9qTp11
-	4HUYu126k+P49hClPslgqIm16bKZHYV9AHYqy+wQ8AXo8bJiD+eBe2H/W1HDk8AnYT9k
-	h3nWrR/2F65T4HuEPTXgzhSuxfHaih9eLQFD91QjaIxzTcTT1zlzpIjvMdQZmPdGOaYL
-	MXeWqhM3gDthH1mqZgqxXfuu6iXuewJ30+M70Zs5C1ygHElysRXZFNA8CVgUfYuwSQ48
-	Ps4eVeB3qJjAHLmJ3M0o9x7VERtno1KBVnqNV8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV1
-	17Y+PPmNetw5rr2dG1VhVnFlC93/xzKEj9knOabB06FZWGvYduQPmsxMsAwoxH8FPpf6
-	khNV3NXu7bhFEsxQPixsJbpLVG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflN
-	V7Lrhv769nr72vIebcqoKSgTzbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTla
-	KvIUVfRWUNbEb2cOfhu2flw/pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKg
-	ioMz1E5UY40D4inx8rRbZJH9D0AZ/WYKZW5kc3RyZWFtCmVuZG9iago2NSAwIG9iago3
-	MDQKZW5kb2JqCjIwIDAgb2JqClsgL0lDQ0Jhc2VkIDY0IDAgUiBdCmVuZG9iago2NiAw
-	IG9iago8PCAvTGVuZ3RoIDY3IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAv
-	RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFlE1IFGEYx/+zjQSxBtGXCMXQ
-	wSRUJgtSAtP1K1O2ZdVMCWKdfXedHGenmd0tRSKE6Jh1jC5WRIeITuGhQ6c6RASZdYmg
-	o0UQBV4itv87k7tjVL4wM795nv/7fL3DAFWPUo5jRTRgys67yd6Ydnp0TNv8GlWoRhRc
-	KcNzOhKJAZ+plc/1a/UtFGlZapSx1vs2fKt2mRBQNCp3ZAM+LHk84OOSL+SdPDVnJBsT
-	qTTZITe4Q8lO8i3y1myIx0OcFp4BVLVTkzMcl3EiO8gtRSMrYz4g63batMnvpT3tGVPU
-	sN/INzkL2rjy/UDbHmDTi4ptzAMe3AN211Vs9TXAzhFg8VDF9j3pz0fZ9crLHGr2wynR
-	GGv6UCp9rwM23wB+Xi+VftwulX7eYQ7W8dQyCm7R17Iw5SUQ1BvsZvzkGv2Lg558VQuw
-	wDmObAH6rwA3PwL7HwLbHwOJamCoFZHLbDe48uIi5wJ05pxp18xO5LVmXT+idfBohdZn
-	G00NWsqyNN/laa7whFsU6SZMWQXO2V/beI8Ke3iQT/YXuSS87t+szKVTXZwlmtjWp7To
-	6iY3kO9nzJ4+cj2v9xm3Zzhg5YCZ7xsKOHLKtuI8F6mJ1Njj8ZNkxldUJx+T85A85xUH
-	ZUzffi51IkGupT05meuXml3c2z4zMcQzkqxYMxOd8d/8xi0kZd591Nx1LP+bZ22RZxiF
-	BQETNu82NCTRixga4cBFDhl6TCpMWqVf0GrCw+RflRYS5V0WFb1Y4Z4Vf895FLhbxj+F
-	WBxzDeUImv5O/6Iv6wv6Xf3zfG2hvuKZc8+axqtrXxlXZpbVyLhBjTK+rCmIb7DaDnot
-	ZGmd4hX05JX1jeHqMvZ8bdmjyRzianw11KUIZWrEOOPJrmX3RbLFN+HnW8v2r+lR+3z2
-	SU0l17K6eGYp+nw2XA1r/7OrYNKyq/DkjZAuPGuh7lUPqn1qi9oKTT2mtqttahffjqoD
-	5R3DnJWJC6zbZfUp9mBjmt7KSVdmi+Dfwi+G/6VeYQvXNDT5D024uYxpCd8R3DZwh5T/
-	w1+zAw3eCmVuZHN0cmVhbQplbmRvYmoKNjcgMCBvYmoKNzkyCmVuZG9iago3IDAgb2Jq
-	ClsgL0lDQ0Jhc2VkIDY2IDAgUiBdCmVuZG9iago2OCAwIG9iago8PCAvTGVuZ3RoIDY5
-	IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29k
-	ZSA+PgpzdHJlYW0KeAGFkr9PFFEQxz97xIAhUAjRmFg8EzWaoFmOKyjv3AJJDnISomJo
-	9vbW48Ldsdlb8UdFw1+goSDaEQp/1FhYXKwstDJBIjTamZhYoDR4Wefty4bqYJKX+bzZ
-	78xk5i302G4Q1DNAoxmFMxM31b25+6p3hwzDnOYSF12vFRRKpaJIutjBNpb+9OW6rrW3
-	2FmPXv49tNoDb7+v/fjZJSkND4TSECwlgeGq4ZzmsuFbmh9FQSSaec3eglsRDoRHwtkZ
-	R/iF8GDV8BvNZcPvNS97VZ37SdhuVmpN4X/C4xW/5UFG93rmBaFoMh+F843GktTv6RO+
-	qnchXuzpNhReS+7gUezOc3i1DOf1CCqRcXkRhv7Au82j2P5Osh/rbF/rwVg20Vn9W3Bq
-	LY7370LvNeh8jePDrTjubErvb9A+8B6GUtuorc9w0t3MafTweyOlbmx2kahs2GjDnFwm
-	87Au58o5OLMLJeHZPNYvJz1mbyKVQYvZ3Kg9PaUct14rh27ky+aMDVEkS45RbKaZQuHg
-	UqdGmVAowicRH1MjrXWyj/zH8n7gLAVPwlp1IVIF+RN9Ndn0boyorG2PH1/DvLnWzK/C
-	7RVNHyoXEq85tf8uOJDICmVuZHN0cmVhbQplbmRvYmoKNjkgMCBvYmoKNDYyCmVuZG9i
-	ago1MCAwIG9iagpbIC9JQ0NCYXNlZCA2OCAwIFIgXQplbmRvYmoKNzAgMCBvYmoKPDwg
-	L0xlbmd0aCA3MSAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAv
-	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZK/TxRREMc/e8SAIVAI0ZhYPBM1mqBZjiso
-	79wCSQ5yEqJiaPb21uPC3bHZW/FHRcNfoKEg2hEKf9RYWFysLLQyQSI02pmYWKA0eFnn
-	7cuG6mCSl/m82e/MZOYt9NhuENQzQKMZhTMTN9W9ufuqd4cMw5zmEhddrxUUSqWiSLrY
-	wTaW/vTluq61t9hZj17+PbTaA2+/r/342SUpDQ+E0hAsJYHhquGc5rLhW5ofRUEkmnnN
-	3oJbEQ6ER8LZGUf4hfBg1fAbzWXD7zUve1Wd+0nYblZqTeF/wuMVv+VBRvd65gWhaDIf
-	hfONxpLU7+kTvqp3IV7s6TYUXkvu4FHsznN4tQzn9QgqkXF5EYb+wLvNo9j+TrIf62xf
-	68FYNtFZ/Vtwai2O9+9C7zXofI3jw6047mxK72/QPvAehlLbqK3PcNLdzGn08HsjpW5s
-	dpGobNhow5xcJvOwLufKOTizCyXh2TzWLyc9Zm8ilUGL2dyoPT2lHLdeK4du5MvmjA1R
-	JEuOUWymmULh4FKnRplQKMInER9TI611so/8x/J+4CwFT8JadSFSBfkTfTXZ9G6MqKxt
-	jx9fw7y51syvwu0VTR8qFxKvObX/LjiQyAplbmRzdHJlYW0KZW5kb2JqCjcxIDAgb2Jq
-	CjQ2MgplbmRvYmoKNTUgMCBvYmoKWyAvSUNDQmFzZWQgNzAgMCBSIF0KZW5kb2JqCjQ0
-	IDAgb2JqCjw8IC9MZW5ndGggNzIgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNh
-	bXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEg
-	MCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ3BB1YBAAAA
-	0PvfxEq2ZFQUGrJHaRiZUY7gOYL//+Fw8q/+1F7t1K/aqo1aq5VakoX6UXM1U1M1Ud/q
-	S32qDzVW7+pNjdRQDVRf9VRXdUhbtVRTvaqGelHP6kk9qrqqqap6UPeqosrqTt2qG1VS
-	RVJQeXWtcupKZVVGpVVKJVVCxVVMXaqoulARFVYhFVSB8x0BWsK5YgplbmRzdHJlYW0K
-	ZW5kb2JqCjcyIDAgb2JqCjE1MgplbmRvYmoKNDUgMCBvYmoKPDwgL0xlbmd0aCA3MyAw
-	IFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1IF0g
-	L0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAvRmxh
-	dGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1ESyHR0KDE5wL6
-	8d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1RQM9igdUF/fo
-	TtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW7aKMS6Mdt41S
-	bsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9JgplbmRzdHJl
-	YW0KZW5kb2JqCjczIDAgb2JqCjE3NwplbmRvYmoKNDYgMCBvYmoKPDwgL0xlbmd0aCA3
-	NCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1
-	IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAv
-	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1ESyHR0KDE
-	5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1RQM9igdU
-	F/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW7aKMS6Md
-	t41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9JgplbmRz
-	dHJlYW0KZW5kb2JqCjc0IDAgb2JqCjE3NwplbmRvYmoKMzcgMCBvYmoKPDwgL0xlbmd0
-	aCA3NSAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAx
-	MzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRl
-	ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1ESyHR
-	0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1RQM9
-	igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW7aKM
-	S6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9Jgpl
-	bmRzdHJlYW0KZW5kb2JqCjc1IDAgb2JqCjE3NwplbmRvYmoKNDcgMCBvYmoKPDwgL0xl
-	bmd0aCA3NiAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUg
-	WyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0Zp
-	bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1E
-	SyHR0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1
-	RQM9igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW
-	7aKMS6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9
-	JgplbmRzdHJlYW0KZW5kb2JqCjc2IDAgb2JqCjE3NwplbmRvYmoKNDAgMCBvYmoKPDwg
-	L0xlbmd0aCA3NyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1Np
-	emUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0g
-	L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIj
-	Ku1ESyHR0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2e
-	RAs1RQM9igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze
-	5VDW7aKMS6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8E
-	nQU9JgplbmRzdHJlYW0KZW5kb2JqCjc3IDAgb2JqCjE3NwplbmRvYmoKNDIgMCBvYmoK
-	PDwgL0xlbmd0aCA3OCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDgg
-	L1NpemUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAx
-	IF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZk
-	VBQaskdpGJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv
-	6k2N1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y
-	6kplVUalVUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoK
-	NzggMCBvYmoKMTUyCmVuZG9iagozOCAwIG9iago8PCAvTGVuZ3RoIDc5IDAgUiAvRnVu
-	Y3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWlu
-	ClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29k
-	ZSA+PgpzdHJlYW0KeAGVwWdCgQEAAND7X6WiFJGmIiMq7URLIdHQoMTnAvrx3guC6cZo
-	JP7QUPyiHzFAffQtvtCn+EA98Y7exCt6EV3UEc+ojZ5ECzVFAz2KB1QX9+hO3KIbcY1q
-	qCquUEVcogtxjs7EKTpBx+7IldGhO0D7roSKbg8VXN7lUNbtooxLox23jVJuy22iDbeO
-	1twqSroVlHBxt4xiLoqW3CKKuAU078IuhObcLJr53wSdBT0mCmVuZHN0cmVhbQplbmRv
-	YmoKNzkgMCBvYmoKMTc3CmVuZG9iago0OCAwIG9iago8PCAvTGVuZ3RoIDgwIDAgUiAv
-	RnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9t
-	YWluClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURl
-	Y29kZSA+PgpzdHJlYW0KeAGdwQdWAQAAAND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv
-	/tRe7dSv2qqNWquVWpKF+lFzNVNTNVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72q
-	hnpRz+pJPaq6qqmqelD3qqLK6k7dqhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQ
-	ERVWIRVUgfMdAVrCuWIKZW5kc3RyZWFtCmVuZG9iago4MCAwIG9iagoxNTIKZW5kb2Jq
-	CjM5IDAgb2JqCjw8IC9MZW5ndGggODEgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1Bl
-	clNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAw
-	IDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ3BB1YB
-	AAAA0PvfxEq2ZFQUGrJHaRiZUY7gOYL//+Fw8q/+1F7t1K/aqo1aq5VakoX6UXM1U1M1
-	Ud/qS32qDzVW7+pNjdRQDVRf9VRXdUhbtVRTvaqGelHP6kk9qrqqqap6UPeqosrqTt2q
-	G1VSRVJQeXWtcupKZVVGpVVKJVVCxVVMXaqoulARFVYhFVSB8x0BWsK5YgplbmRzdHJl
-	YW0KZW5kb2JqCjgxIDAgb2JqCjE1MgplbmRvYmoKNDEgMCBvYmoKPDwgL0xlbmd0aCA4
-	MiAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1
-	IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAv
-	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1ESyHR0KDE
-	5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1RQM9igdU
-	F/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW7aKMS6Md
-	t41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9JgplbmRz
-	dHJlYW0KZW5kb2JqCjgyIDAgb2JqCjE3NwplbmRvYmoKNDMgMCBvYmoKPDwgL0xlbmd0
-	aCA4MyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAx
-	MzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRl
-	ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1ESyHR
-	0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1RQM9
-	igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW7aKM
-	S6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9Jgpl
-	bmRzdHJlYW0KZW5kb2JqCjgzIDAgb2JqCjE3NwplbmRvYmoKNDkgMCBvYmoKPDwgL0xl
-	bmd0aCA4NCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUg
-	WyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0Zp
-	bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQaskdp
-	GJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N1FAN
-	VF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kplVUal
-	VUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKODQgMCBv
-	YmoKMTUyCmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAg
-	MCA1NzYgNzMzXSAvQ291bnQgMSAvS2lkcyBbIDIgMCBSIF0gPj4KZW5kb2JqCjg1IDAg
-	b2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAzIDAgUiAvVmVyc2lvbiAvMS40ID4+
-	CmVuZG9iago4NiAwIG9iago8PCAvTGVuZ3RoIDg3IDAgUiAvTGVuZ3RoMSAxMTE3MiAv
-	RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9ent8VNW1/97nPc/MTOb9PpnM
-	TCbvB4QMCWQMefFIDIRHgkSTQCABogFDEFr4oaJIRBQUgmCtiIUAYoaQwgCFSxFE+hJb
-	RKXWaytYq+bDbS9aBWbmt/YJROHT9vpHP50z+73POWt999prrb3PRhghpESrEI1Cs9ub
-	OrAW/xRqfgXhF7O7Ot1P/WXsiwjhLQjRC+d2zGvXfvT6LxBiGYTkynkLl8295vu8CqEE
-	DUIme2tL05wrO/76GkK+dLg/vxUq5En8CCjPgXJya3vnQ0vWyT6E8hNQ7lj4wOymqhMV
-	n0D5ayiPbm96qENYJf8GIT/cg9z3N7W3VDzQuQzKU6Gc1PHAg53UdXoHlB+C8syOxS0d
-	P3v0/hwonwf63oI6DBf5KRGHjkPqRjNv1kjVd0TUHeV/XqQRcAw/Voo5xEupALFMysml
-	+J9FCqBHhdQoQeqgQVqkk3KJSI8MyAh5EzIjC6RWqd4GLzqBNOwxlMKuQlYmC7kQir8P
-	4SJJY9Pin7BnkCbWHv8rXQh3HCaBihUXoRPoKbQN9QH3vZBPQfeiLegsno8O41loAF3A
-	TpQJY82gCJqEfoXj8bfRXPQK9O9EJ9EmtB/oTEHtQNMktB5748uhHIJ8M1odfxklowL0
-	ODqGgvDU9Wgwvjt+AFqnoGloD9oL9/8Se6j9TGL8tfglJKDJ8MzV0PJ2fFK8D/hNRyWo
-	BmpXo+PYS1+MtwLHhUDdC+jHaDv6OfoCP4IH4q3xrvi5+B8RBa12VAvXCjyA/0j3MY/H
-	X4h/Fo8BEikoFd7aiJ5FO+D5fXCdgGEvwwtwJ34Wb6JC1CPUAPMYa4pFAYcAqoCrEj2A
-	ngAEDqNT6G/oG3yFMtMaupM+HR8Z/1+kQBOBS8JJC+qCaw1c64Gno5jD2XgcrsEr8HN4
-	E/4dlUpNo+qopdRD1Cd0NT2LXkb/jnmQ6WfXsVs4RezL+NH4mfg7MJoOdA9ajFYCdyfR
-	OXQVXcM0PMuOvbgQl+B74VqFt1GH8XZ8mKrBJ/A5ag/+b/wxvoKvUyylpAxUGtVJPUvt
-	pU5Sv6Hb6E308/R/018yY1mK3c5e5rz872PNsbWx38QL43+Mfw2zV0AijEwJqkb3oSbg
-	tgONQP8PuNgHVx+M2il0Gp2Vro+xHQ2irwEFhHXYinNxFVzV+G48F7fhF/ERuI5LtHxF
-	wUBQMkpLmSg7VUs1U+3UKuodahVto1PpCfRMug+uN+kL9HX6OsMyiYyBqWDGo3VMO7MV
-	rp1ML9PPvMUG2bFsNTudXcWuZdfRs9m32QvcSm49189d4f6HT+En8Q/w62B0zoLM/lya
-	AbciBicD9bnofjQbl+JmtBlGYztuQt0gXXPwE4BXB0qJN9Ar6QoqG6ThOPoBSOtWtAKt
-	pWeh7fH36D3oXZCUhfDAVWgXU4IcbA+MziMoG6To5hUKpAZS/D5vsidJdLucDrvNajGb
-	jAZ9ok6rUSkVcpnAcyxDUxill3nKG91hX2OY8XkqKzNI2dMEFU3fqWgMu6Gq/PY+YTe5
-	rwmabusZgp5z7+gZGuoZGu6JNe4iVJSR7i7zuMO/LvW4I3jm5DrIP1XqqXeHB6V8lZR/
-	RsqrIC+KcIO7zNxa6g7jRndZuLyrtbussTQjHR8OARzyjHSiOEJIQR4cRuOaVrSaISE9
-	ysJWT2lZ2OKBPLTR3rKmOeGayXVlpTZRrIc6qJpSB+/ISG8LA53oSeUcz5wnIyHU3Ehy
-	TbPqwnRTfZhqJM/SpoVNntKwafll87fFW7mydd9pDFPe8qaW7vJwqPFJAJcUG0mpaR2U
-	Jta64bHUY/V1YfzYTSIIjfOBUkJui6eM0NU43x2WeUo8rd3zGwFcNKWu3xqylnmaSuvD
-	qKau3xKySIWM9MPmlYUicH84466Mu0haKJpXDqV/fnSo/rcnSGpeeeojSCdOGQYAkzd5
-	xgOdYfds6SUeILaARC0FqHt2AeAEv3oMbLYBPePCFMgM7Q2z3vFN4VW1t8hoLR0irnF+
-	ab/MYiU8NJbUQ//Gbs1oGCnor/G4u79EMISewS9ur2m6WcN5NV8i0kgGelhWwrjpVr5L
-	Aga4bjV7Wsn4dkljCmWPuew7FVAm0BCaw/pw7sSaOjHsroeKCEpLnxhBspq6/Rivr4/g
-	+GMRVOo4DNaPvu9eaE4notZWCu+HQkY6VKSKkMtMd5cD1+VEVtzd7u7xc7rd5e5WECbG
-	K6XQ0NJdnwUI1tYBTmgqvDFUbxvOttTXj4bnZJHnwC3QvbsenjD/5hMglaqyotApO30i
-	jIqvpm5yXXhVqS0cKq2HUQDxPVFTFz4BkltfD71yhikFile0mW/SnAs056RCe97QU2rh
-	GfCI+u5u8szaOo8YPtHdbesm822oHMHozorQzYoIIl2A8bIIXlUD90LiEW2kwiN6RCCr
-	nmA6AkT6lkRF0Mh/jXD+MN1w5yigNl9CuODfhHDw+yA8+nshXDhM6W0IFwHNhQThMf85
-	hMfehnDxv0Y4NEw3EHkXUBuSEC75NyE87vsgXPq9EC4bpvQ2hMuB5jKCcMV/DuHK2xAe
-	/68RnjBMNxA5EaidICE86d+EcNX3Qbj6eyF89zCltyFcAzTfTRCe/J9DeMptCNf+a4Sn
-	DtMNRE4DaqdKCE//NyE84/sgXPe9EK4fpvQ2hGcCzfUE4Xv+cwjP+g7C4PCWIMScg7UX
-	Dau84giqTYsgIQuMHwRBE0HoHARShjz9QQQxEBDk+Q/QEWldOD3tCDyFRdPTsnPytKLW
-	D6GEWR+58Sf22LVxEabq+gFwvzCahj+kJlI98B53SI6yaGxlkYVhI7jkgHik0pyWVn1J
-	8wnKqhrMyU4UDeI0/FVMTvWQtR6NesgaHGiUw1otBT0SKpipmqmdT81Xzdcup5aK/HhV
-	pZZyCK4ExpXohPWx4DRRCqdfYHJsbQk5HmuqzOBNMVoCqRF83wGxay5529WiqmhRtear
-	qsGrg6g4WjyoC2ZFg1irC+Zkj1sW0pmtrGDxcj7ezKRh1iqkYZSG09LSHn4YNzTg3FH5
-	I0f4fR5R+50sLbqJH81zvHEoDWDq1Mry+5eUPBL7Ed53qDrn6UkrYktep5Ziqj10d6Bq
-	UcHs+sdiH0afpWs8o55+JtceC0Znzh9330ujXdHrbOLWe5Y+WZ/lT8tv3L3+wVcB5Znx
-	i+wi9jJ49E60P1RoY3vwZpZ2YRfzCF7Drk1kawX6cYdWa+BGO2jlaIPMSTmdFjqHKtTk
-	aK1uWY7F4nJvF+cPAVA1eJN94BwVFw9KEGgAf2B/NLKbvIk+tdfmUxhluUil1+RinTZB
-	w9uhxCI6F2OKoeVmZS5K0EEkWLlczGCIAKM0rCnSFKWlDcWk4uEG3CBgkycTe5KQVqPL
-	AwBH5XE8J7r9Pq1mVL7oYZx4hPakeLr//diXf73ywYNjnCetG/ti78bRa5dfPYIrUtjL
-	sYtH1++MvRU7HYvF/mt3/YZPf3Rs26/xq7js3J8kGesDWd4DciJDwZCZdzKMjHZiWNIJ
-	3AJsVdCCF1nkigiecUDc9IEkAzdF4BKwXyQJwJDwaUEAtZ4++vqNX1FvR7POsMcGYiV9
-	0TlEjs9CtFGaLybwE0H4yRZMZhrsMZBpQmVl5yTmaT1nz54l4g+Nnvj7dDv0T0QloSQZ
-	Z+HmKZZzPRT7EINlMkZHqTYyMq0XWQ1yL2/RGyJ48gFxXccQdUMDhGBoYIgacrIbMAiX
-	mOQbg/MMeiPBcKQ2j24fNTf2p598dnTBoh/nOE/jg0fm/ezA5ba2h5a1jztC/47QDPOH
-	M0k0/DJUX4on0hSHZbQRW+h3MZuI7bReYVPOwHX0efx7+rzi90o5I2dUZdTjFDOZ6qGo
-	gDxFVSAvUFVQM6guivfOUckpWkdjSqHU0ZxgMJmsDJnK20IquYtWcFElpqIqlw5qDiYi
-	i74L+KnWkBl3yXI1GIS/+RKZfGUtpZ+gYlNRcZHOFJw4Zdl+lTKC9wxQmCLDtKefoug1
-	bFXm8iiz4tQadijNyUYNixfhxQ2LEkUZhmHSjsgfiT0YADFoPT3YgXfiHdh6jIk1nI7N
-	ZI+zx677mIvXxtGzM84tvR5g3s3I/8OIGz+S9EpN/B32U5hPCcgG+y/dofQ1sNF0Br9O
-	vSmclXPjBMPoBNo2mpfZKbtdocuhrU5zjsLicL53xxQankDS3MlFVpUPe2Ve1mdUm3Nh
-	10uXi60C5DQc5ExKQy5OpCCyyG25SMtAJM0ZEpHfw6gBmYxaDU/dnBw6EelGahCZOXqd
-	SDPbjm7cdSq2Kbbv5L7njsM2kO3z2F8/vxT76O/YoGYvX3s9di526GIcffQenoBTz2PN
-	tZfxsi9hS6Yodib21tXYfvZe0CUDoFMfkuaKHz0X0vGq8biSrcd1bBs7R/8QKxiPwmaQ
-	BdmwPVTiEd2+Rt0i3RI9rXO69HYDLTqNesanS/Y6kUxm450Kyme3CW6vweU10jkJbTZr
-	QPB5/XJLSuCCuOl2hXt18DxcqLioqDgKyBVFi4Jak6R5g7pgsAE0cFpONgYde0vF0mIu
-	0acc78QuDKrVZAA9koV9kv710BXrdiweMzdmPUP19ra/1d48fQbL0wpd5lW5klHyc4LL
-	Y4VnaHvHxh8FnWBStufcG13dm+dZvOr01EC5Xkwsmv7lMzm2aDfYmSnxD6QdnQTYqytC
-	fwgVpGZjuQbmht2fV6lpk83X8EFBp5TRtlw+WebQKB2FaVRmoPBQIVWYm+rVaXhWsPuT
-	TPYI7g55TA4X73dkKijHSEURX1Rk1/OB1N5k61hbwD4hwV9gGTP2Z7gHNrIO483o5oS/
-	Kk35S9FTwyJVPAiKSQvzgwCTOZg5SEwU4CWJWkr+KEMSwhYvzk8QkdlpE5HRrRexmIRG
-	USKyOkwiNogQEQkDpSyJ18MgYLghWdIfY7AaJ2DQwwacT0yaz5ME5sszFucRyLVEycAr
-	1KC1/T4/SXwjR+SPSsTqxdX31W8WW3Pbm3Nq8cBYg/LR5U8VivJe9u87jnUtMXmVTm1q
-	uq8h1Sgb9Zsfbjp2pKf7rZnp43duMNg5tcqeNQ8vFNLNGbNqJ6XWvrGtsnJLtMeeRNOP
-	KbkST6hy/k+f2PRKIr6EQE674h8yXvYk7CI7UUcocye/y/6unU4SEpwUbE+bHCyvlTsd
-	CoXeL1jd1kxNJg4gLZi5NeKxBglUonUuSZaOKFL4a4PaIfTMOiMnN3J6H9bJITLwJh9O
-	lDl9ABZYMQITqHIChU6rpyQEDJ7kIZA4g95kzOvqK3yl8c1vvrq4fGpucCc1d8OGp35w
-	2Fdxkj0Z/bxqcmwwdjUWCxd6qtau+PT47g8Pvt1z737QOxSCXUz6HFMN+982tCuUtcuC
-	t5h7hT1meoKg3aanaT3nsPIqB2hl3mYzafw6TPsprdUh95ssdkcE8wfExSu+NRFFVYPB
-	IDFfd1rxEcgieJUGuQ+pEzXAJbHfFiiB/RYl+60wqnxgvyGSmTkfsd/iP7Dfkrwg45D1
-	BlEZkoo8Ig4U6KU8nrrwsalPs3jlqxOyn9jY8ailz/k/R397DevO25nq8LuzH+1tf2n7
-	B2uXvnMa530CW7CjWcCgIH6RHoRxVSAHWhrKHaWuUM9Q72J221ivoKcSHBokOBx8opxy
-	mBRsZmKmJqDVWV0Kv9XidK0RF5d8l30Y4DvH1mq2y+QIY7MCeLNDhCyUD8ltgg8YlEYX
-	uNIR8ZaEnjOAyjVpwXKPJGyhkSN0eV9t3L5i+87lT+zG3bXZY/a9XPzqAwdi1658iO/7
-	9N2zv3z93C+oUSOcEynHtbGbZtfhjGuf4RmgQyrjFxkr7Arb4QuCFytDy3qE5627XDSr
-	phJYvUGtSzDoQ8qQXghY8UTFQfoMfoM+Y3tPeF92wfWe51PTpx7FGe0ZHTVLYMXkhK1G
-	R3KQ43mj6LDzcodR4eV77Lvsh2AOMF5jgtfOWuRKXqv2Jzj8rNWfnMn7LRaf/7y4c0j4
-	QfYl0T8fJboVNAckWQ3DcgK6VzMItZIyKUcehqVhyx2zDOcCr0ynSdToNQyn9CbZkn3w
-	dcnhw06HzMT7kMKg9mGV2mMVoYqFSDCDXKk0EA0ZsyH3D/RNalrqw3hRA1rU0AAiRBxj
-	0QlTirh/agy6hpMcQpQnqfMkjsfUwIWCfJ3mxhX2mZ6npmbr9/N350xZdteUN2OfYfOf
-	sEuRMmHfD3tZ7GEqFkybvHDCyztON+RXFG7IrLFrwA/gMIVLYr4l5Y8c6MYfwHQD/2c1
-	LCKIrBlRbSgd0BRMvEnwM/7EJfwSQUhUUYkGhLQOjjco5aqA3GrGhgAyWkzmCOYOiM1D
-	sja8XgDLJWmRICbASUoCdOeQwgRvBKxSEgeuyOqBUN6MR/5Sm3HYmbOm4+AAKIUPJovB
-	HfUvRidTO7pG1W29EH2T0EcR+nAh2GKyBssP2fnLDBDN0XIZOFbAT4CnYSLL9nxLyalo
-	0anqIe8JiJHWTCC62jyDZ/Uh+DGp1y+wx8hXTSp+MVaDC6Rna4mDWgseK4FkOqzzMFnH
-	kfUdpLJz4MGqoYM26wjQgaT1HPaMzMNjMTiZWnA8Qfn7ccHAQOzlZTkDvuKwyuFiBs99
-	M4LxzGIOXh+1ZHQzRW4cwpvzMhXIhx4LFfICr+YSTIJJbUrwC34Q1UrLdMU8hdLjlVsd
-	HoucYkxe0WFyqDgecTa7l06UpwDj2oA+gnG/NQAKD8OSEWd6Az5k8adEsOq7g3JJc3Xw
-	avQmGuBLFoM6BJke8ihujZDh5giZblk2GKib4/SdEesPjahftKo6Pbno5Zb3qlOPLqia
-	//wha6Bj7q4BJmvL3cljipPLp9e+MHV9dBT16YKa9TujG6ij7bkTX3yLjKQ0jvQgzH0L
-	aPZ7QzmHuDMcxXB6zq/v4jp5Vq+k9GYNWCzEmRVyK2+1ImVAZrXjTHPAgiw2cBtuE7eh
-	qTuk14GvQW3wlshhsEyG77BCZA7mkhqD3OHVeyftab1Uk37Ikb0yFJhQkGEbwLuA/nun
-	/HjGy0T2movmqIwlIxe1Rd8CYmG0C+PvMyLYI6X0XfaZUN4WYbPmeeNPmF5hp2a3MSK8
-	KbzLXFb/Ra8cLXAOM6906BQW3mIxUP4Eq03mN1istgiWgVW6qXWGFi7DFklSL+nIxPgU
-	iTLQEFrKh3kT5FgV5OR6pQ9kESLBCEaIVkNEHBUpIt5wsk5aa8OsAsujg+UjJYKGlgzP
-	R49lTzryk82bd8DH3huxv/8hdgPr/sx14oSdm+997kb/3kv0xdgXYIajsddw2g1wdkLE
-	9nTFpjFeYF2NklBnKH23sMtEpQhuu1bNOQx8Aqd22BVJaspvtibLwaMQA0kJFk/yP/Qo
-	JJdCC1pV4tFutCHW6mN8yAaMsUaIsEXtQ7RJ4kniiPgVxIsYGjPJj4DlnCSf8AGOTDNw
-	tbQe6o1d3vIjR8u8EMcy+/JD9/zgYOxQ59ZlU7ILB5b97rerZu0/OmfrD2fspPevH59S
-	FPsL8Pjy5vtGOsdH/0Dm4FoQyI0wB7Xo7pDPT/tUo+gKhlELGkot08qUfoGIoVYuWBMx
-	sa3IokuM4DKYWCuHvaZq2JApLq4qPhU9RSzH0N4I0XeS6IEbngmmkqi6tXsNryxgzQ6N
-	TfPERpgqh/O3UfRxmupbHN1C5kVJ/F36IDMRvsZn4czQ0wWyLexm3fP6LYYtqVxKstef
-	L5aLFckV/unJM/xzk+f5limXqZapuzydyZ3eTt9OZ296Ig0mh81gMhNhpWwz2c2GDH1m
-	SoKiDVYZ+V7Km6SSM2mJ5jfsjkSecWRuTVNk8TK1huJRlphldZmNZr9pbIqP96dYc9Qu
-	v2Ys8mdasnP6h+0kqJAgsZTRoAZyhN1gFsQw5YixhL0RSaUskkZ5Es6gfAav1SeqXSKS
-	+XgR0+ngx7OpkHPooM6mN4vYnZAkIjFJrRL8chH7vDI5zmBExAUgcmrtIrYYIZLMpbRR
-	IkVDQi/56Qj2mRoSwWJKTorfJ614wP0mlob3kNUPmREmo7QmguWRpJ+vCN7S3jlbxvgf
-	fHrtXZ2/P/y3BeOoPaxv7PNz28pSqpeeLGl7/8MrZ3h8CNfMzJ4x456yZPAwklLHP7zl
-	Z+tnto7JragOladaEh1Z6WXPPX3u/Zeob0CWTPErlIydCdphyk9VmfITahzBxSEvYwya
-	aE4t11pBXcMX/wAyqA0JtIum6BtGi8V6Q5x300uNNgRPkYWeZkhNZxElHS0a1EQvwYZL
-	HrFbWuJP31pr+EaCH5bXe3DvXp8hR+XUu8b5V87csIGdGXvn2WhZQaICU+tlwsPzqNPP
-	SvZGAUrsMyYLga0MZZbg05hC81Ar1UrP49YwT7C7UC8lwKkIqoyZwD7OrGXPMG+ywviU
-	B1N4QVJb84jMw/5DJN4xAM6Pm4ngRw/RdLsOdiJgW+PRkJPj2uEQC2Y5hsaYpWiORvCN
-	XC4QxvuoI5hY8NUHcB9nsVRfNVdFP/ooapF4NRNvwVSkk2aPLshXZaZpqi9V8UNJ2sTJ
-	y0JeKqCjaQYFdBwHvtdtD4c9tj4WffvcYDAaDN7xZJbXpMEf1szgZsG2iAzngR/0AXbi
-	tNOxhSdiS5isG1vo1utvA0IUMsTG05+C7iMncH4Rur/b8IR5l5nmORNXoKvU1enm8Uvp
-	pfw6/RbUw24x9Bh7TL2o16ipRBMNFaazBqaUfYOl1rA70U68i+01sckprNlgMoK/YlAq
-	EhyCmhgGow2AIXSbDOY+5dNGsA/nRQllgKfqkhmY+JaPITMBMy/XkmWGXQEAK4hhNEI6
-	AxwXMrbrTCYzizEZAPMawG3FKSkRIMUNMCMXYWAb53E0xVPSJBhJHMz8UWPxKECCpsUz
-	vkebS15Y9YIv4MxK1eRmadix6ljnr2AzgcmaF9sQ++K12NwBTnhFxYlm4blkphrgeoTo
-	UOn3efcvF9yXUPQl0pIDUAidDp2/61YK3tV4zgs7SORk1M3+JOUCsQAcy8Jft9wYVGwY
-	biG3kZ+d1aESKgiqcQ+axk4HpM+gmczHqA/qzjIIebg9qIcLohqoH2AeRFMgdEF9IaQF
-	ECohrMZnSIhfhL6rSRkCae+CZ66FvuT5JkgVEMC7hfMxI+DMzwU49bIFh/HfqJXUDfpx
-	poY5whaxvdxi7iScTUnldwqUsFz4QpYr18mb5V8r1sOdhC87nLGh0QLwTymkgasBIf5T
-	uRLOVpFWDCeehrjnoA3VVZRUlkxMq2xZ2NXS2Ta7CXpQEOAXb4EzR//oZ4dKGu71gs8Y
-	gNNTGXBiJReNRKWoDJVLJ5rImaUq6UzVFDgnNQ1NRzNQPZqFwG0l3yzGQyiGMBJCWtpd
-	ZrQK70TPQHgJAo3a8JNoGYS1EJ6HwAzndkPpMH6ynxFCR/AyZMUTQgrGNVVvcZnlCtdv
-	wSUbeNH1vvnjo7AZpkJ/xJZ+FZLdJccv4R+jOciFfwKrvOVw4ioFbz0QWOhqhKbdqAPC
-	Kgi0FGO8u9+Z6zqO05GXwXCPDzkZfND155wM1+WcCIX7XSf9EQaSnzuhFEpwnXC86Pov
-	xzzXcQh7h5r2BKDHQddux0LXs84I3trv2kgc437XhqFkiQNuPehqD2x2zcmR2idtjlB7
-	+11BaJ8eUrjyC0TXSMclV5Y/ImAoZzgmuVJzfu1Khhuhmxse6g1pXXbHs67R0OR0lPlH
-	QziK9+BtKBVv6/dOcB2BLLB7YHygYHME/+BAZUqON4KXh/IrUzYHKv3ewCSXN1Du90N+
-	+pv8av4e/i4+l0+DQ09gJHkbrxd0gkZQC0pBLggCH8Gv9he7uKN4LyoGWPYeEDgB9O1r
-	UMkcxfukyn2HBAaEEgn6SPwj2LTECJYFewdAzDCCzEFOynERvA++M5GqfSEXiDxGjNSg
-	AcmDTwAgXiCgFBYoNAFOlzwV4dBjxq5ic7FurDZYXvrPokap5VZMrPI/+ZmxI7wZzjeE
-	9zjq4SgJZOKO+lt9wbj8H7/OJdChpUQyQge6OubPlY7GeMpaGuGETPjJLjiqtKrZ7d4/
-	v4M0kDMZjc2zW0na1BLu8LSUhud7St37u6T77mieS5q7PKX70dyyqXX754ZaSvu7Ql1l
-	5IjQgeaSxQ23vWvt8LsWl/yDd5WQhy0m72qW7rvjXQ2kuZm8q4G8q4G8qznULL2LQFDW
-	VlvyYCdIJxyfgeMrKbXh8ZNn1sEpsfrSCN5JztQsQf8fbxgh4AplbmRzdHJlYW0KZW5k
-	b2JqCjg3IDAgb2JqCjc2MDYKZW5kb2JqCjg4IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVz
-	Y3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcyNyAvRGVzY2VudCAtMjMwIC9G
-	bGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAv
-	WEdCSEJLK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgOTggL01heFdpZHRo
-	IDE1MDAgL1N0ZW1IIDg1IC9YSGVpZ2h0IDUzMSAvRm9udEZpbGUyIDg2IDAgUiA+Pgpl
-	bmRvYmoKODkgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMzMzIDAg
-	MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAo2NjcgNzIyIDAgMCA2
-	MTEgMCAwIDI3OCA1MDAgMCAwIDgzMyAwIDc3OCAwIDAgNzIyIDAgMCAwIDAgMCAwIDAg
-	MCAwIDAgMCAwCjAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDAgMCA1NTYgMjIyIDIyMiAw
-	IDAgODMzIDU1NiA1NTYgNTU2IDAgMzMzIDUwMCAyNzgKMCA1MDAgMCAwIDUwMCBdCmVu
-	ZG9iagoyMSAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jh
-	c2VGb250IC9YR0JIQksrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgo4OCAwIFIgL1dp
-	ZHRocyA4OSAwIFIgL0ZpcnN0Q2hhciAzMiAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAv
-	TWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKOTAgMCBvYmoKPDwgL0xlbmd0aCA5MSAw
-	IFIgL0xlbmd0aDEgNjM1NiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHF
-	WHtUVNe5//Z5zAwPkZcwPIYz42F4IwIRVLwy4gyCGIOgdsZoZEAQCChXkaiJlhpNFJXG
-	eFGrWVZjmqsS4xGoHfRqiNUmadrU2GrbXO9tbBL7WMny3rbelZtE5v72AYlkJVn+kZV7
-	9tpnf/vbj+/3/b7vDOxNjIiCqZ1EctQ0e1uojknQ/AJ1oKat1brzL9MPErEdRGJTXcvy
-	5rB3f/pzIuljosDg5U3r6nYHPXeWaCzWSO/W13qX3Qr5ewZRxPtYn1cPRfCnIQ1EkfHo
-	J9Y3t65NzJWeQd+BfkrTyhqvMd4Qgn49+lHN3rUtpuZA7B3Zjr51hbe5NnPO2Ar0D6Gf
-	1rJydSvtY53oc3x5LatqW/7tyRXZRONgX/wVdAyFP8FkoD60VlowrNHV/08vAXZFkkgG
-	KiLjl6AwQRcgD1CofI5S5HaKlbJIIfL/HvUd3g4u8N+UX6PQwWb/f4sFmN3PqzBYOI0G
-	aCcdoJPY+yjkFHqE9tEbrJH62WJwcI0l0ARqh3UfzaFfML//baqjFzC/lS5QF50CVynU
-	TOMw2sns/vXoOyBX02b/85RIk+kpOkdTsGsnfeQ/5u/FaAVYPU7dWP8mU4VTUoT/Zf/7
-	ZKJ52HMzRt72z/GfpHDKoCIqh3YznWd28R1/PZmpAOieox/SYXqVPmSbWJ+/3t/mv+y/
-	QQJG46kSZQPrYzfEk9JT/uf8f/UPgokUSoPVKtpNR7D/SZQBhNrFHmWtbDfrEhzCJqFP
-	2iJHD94BD6k0C6WEVtJWMNBPF+lv9L/slmAWQ8VW8ZJ/kv/vFERl8JJ7UkttKE+jdMKn
-	s8zAJrKZrJxtYP/CutivhTRhgeAWHhPWCjfFueJicZ34a2m11CPvkPcZggZv+8/6X/Nf
-	pWiy0MO0ijbCuwt0mf5BnzARe8UzOytgRewRlHZ2QOhnh1m/UM4G2GXhOPsDe4/dYp8K
-	shAsjBPShVZht9AtXBDeEhvELvEH4h/E29J0WZAPyx8Y7MZ/H6we3Db4lr/Af8P/MTLK
-	RDZEpojm0lLywtsWeoC+Cy9OoJxE1C7SJXpDL++xePqIPgYLxMJZLMthD6LMZQ+xOtbA
-	DrIzKOd1LP8jIBBCgBAmRAvxQqVQLTQL7cJVoV2ME9PE2eIi8STK6+I18VPxU0mWIqRx
-	0iyplHZIzdJ+lBelo1KP9Ct5ijxdnisvlNvlbfIOsUZ+W75m2GjoNPQYbhn+y5hinGNc
-	adyB6LyBnH111BchsUSgz6EVVMOcrJr2IBqHmZc6kF3L2Fbw1UIp/iXiRnGWMBHZcJ4e
-	R7bupw20TVxMh/2/E4/Tb5EpTdi1nf5VKiKLvBfR2UQTkUXDxZGalpqSnGRPVMfbrEqC
-	JT4uNsYcHTUuMiI8LHRMcFBggMlokCVRYJThUourrFpSlSYlqSUlmbyveqHw3qOo0qxQ
-	FY+eo1n5Oi+GRs10YGbdF2Y6hmY6RmayUOs0mpaZYXWpVu2XTtXqY4vmuSHvdKoeq/aR
-	Lj+oy8/o8hjINhsWWF3meqdVY1VWl1bcVt/hqnJmZrB+B+gIzMzgPxwOCuIbazTTu6He
-	jIbPcGmxqtOlxaiQMSbaXd5lWvk8t8sZZ7N5oIOqwg0bmRkNGnDS9uBl6rLtPgdVV3HJ
-	u9itiV6PJlTxvcLStWjVqUWv/8D8efeu5Npxz6Am2Iu9tR3FmqNqO8jl3Sre8+5Ar6zS
-	im2FLR63xrYMg+AYG4GUw61VXRxXVaNVC1CL1PqOxiqQSxXunlhHrEv1Oj0albt7Yhwx
-	eiczo9+8scAG7/szZ2TO4G2BzbxxqP3Tk0P6KwO8NW+8+C7asooRAhi3pJYCp2at0Y2o
-	ADuZv2onU0fNZPCEx8PgZgPwzNQE5Ixo12R7qVdrr7wLo945BK6q0dkTEBPLfagq8mB+
-	VUfoVEQK80NVa8dtQgjVjz4crfEOawz20NvEB3mgR3JFY967cptODLyuN6v1PL5tekzR
-	V82uexToc2o4Zi1Syykrd9s0qwcKH6VnlPkooNx9irFOj4/5t/jIaemnABKXPoLhDJ5q
-	DU7YRyczA4o0G6QJGdZieF3Mc8XaYe0oXdZhLbbWI5kku95ioLbDkwUGK93giebDosMT
-	NyLWejxTsU8W3wdLML3Dgx0ah3dAq6uy7mDSxIwyRCWp3D3PrbU74zSH04MoIH0Hyt3a
-	ADLX48Gs7BGkQLyhwTyMOQeYs9Mwnju0SyX2wBaejg6+Z6VbtWkDHR1xHfx7G+r7GH1R
-	4RhW+IhPgeMuH2svx1o0qi2OK1SbagMsD+f0AaT03Yzy0aSvZzhvBDdW5gNtns7w5G+I
-	4Sn3w/DU+2K4YATpKIanAXMBZ/ifvj2Gp49iuPDrGXaM4AbIGUDr0Bku+oYYnnk/DDvv
-	i2HXCNJRDBcDs4szPOvbY7hkFMOlX8/w7BHcAFkGtLN1hud8Qww/eD8Mz70vhh8aQTqK
-	4XJgfogzPO/bY7hiFMOVX8/w/BHcALkAaOfrDC/8hhj+zv0w7L4vhj0jSEcxvAiYPZzh
-	h789hhffwzD+4S3C+fUyzl4iTmeFPqpM95EpC3/8UE2hPqLLqLwPWbzuIwmVIBuv0xn9
-	PLcw/Qx2kWlh+sTs3DBbWDJqkdTp++yP8rlPZvqkBz/txb9fArX4r+N/5FIai3NQAbeD
-	9ck0CevO4JQTjdZHyfcY5HLaZVQYnwR5AuQJWROz7Tn5eYUshI1lBiNKFMvLR0lSx6On
-	5iXm5kRHGUVDVG5OXr4xhKnjk5PyeZOUP53ls5tLa36UmGBfkdtSm78kKmwp63UoYQGR
-	q9bvLEuLO5rFzEfO1dVZnzSMtQcr4ZaMzKQl8WPlWe8/0bXXYv2PA2sySl/cNQ7H9jHx
-	WcvnLhIiTRnmzMWVc9Iqf3agpGTfnb3x40VxS7ChSHWUNP54a9cLETiBr/HfkDZIcymW
-	koe9DsL5kHttxsmUe22Gdwy0hqMNuT4xm6nD7gx5kWuQ1PFCfjjl5kRJy0/KCze+tGLW
-	eHXRsy2Hck6WDd48e6U/expb8JsfnxNeq3nyaPOhw9e3PXb1Esu9idPOVI1zv9L/jpwk
-	X8DJz0JxOgofjc06g7hE6UjicXLk8bODNG5b5zUqOiKXqTp5Qn4erAtFG95KT39i/dar
-	6XavEJKWufrE4GvPK/NfWdn7s7xsNvk/H3/st2+8+dPLP3/pz+LehDLB8sn0rho3y/zk
-	r+w7MAUcG/zv4JQ0C2fdRFKG2TBRpI4hFic6zopFZwUsRBmjjDZOAeKbG8J4sMFDhM6D
-	mJesw5S+Z5eZ+tmthOV7dy6fpp6KbC6o+a6r4vXfTc5ni/+4amBtSMyEE0+8pYpPz2ua
-	/fyRS0vyZhXsmlAeH8pUHFAFVvTo4K41xZt6Ozg+hhsBEivkK8hGhAUZ6qNQZJ+AKoOt
-	MRQChIgR4hSObByDNvIykOYhMtHGCcgygzHXqIpqhJqfm58nsIq+sMQoNS4mqCLH3pPQ
-	d7HnYldCV2K83LZYEF4Q2IKXOz9bJj7XebQFtjfjOzyEGEWRfdh2EOyOQyXYNlCYzo6A
-	GFJY+BRYzRURrKF0VyOG+RBVdq5vTcXUmk1/mRhre7b/+zHhytMt1yas7ZMv3Lk+zzbl
-	iOfgnXnCkbZ89/5rd17nPm+Dz+sQk7DhiHCfz+B7DtZ9leGjCb6a8OWxXON0do+rMNbU
-	nWy99Khsjk8JjQ3d+pOYTX1SVn/eAUE8LwonV93Zh/1f8d8SPpQXIdvvchqG/dlw7kvY
-	X/9ZQTsOdkS00ZzTXJEzaYj+/ENOyue0sjdPO7qV7q7g8RHZYxLGJdhcyRsLo/buUnbJ
-	iwav7r7jmhwRxITOANP3lguXdsOO/ijnFn9/6dhptymMXzcRXXL8ZsZIW6R/HVeQnwF3
-	5/PWkDqYius09nHHZ5OCnzUR479jnz+BcjgVCVMQtdXUgku4NWhXom6A7hTazcJx2gb5
-	FSx5AEWjv7E89hS7iDuGiUILtBxbIO4uBGrEL6lAoShLcEn258BgsMNHGX4peAsw4I/m
-	l5ZXzl6UXlLb1Fbb2lDjzXyouqnhn9fUYlzATdk/UGtxp/NlTyCUIjmpWL8dKsUN0ALC
-	R8kzzUelqIWok1DT02eYqZ29SM+gHkIVqYFtp3Wo21B/gCqNSMfQ62fbeyST4wxbR7Fs
-	tiNIUuZHxijmwCDlio8Z+g4qvze/d5bF4Ou5wWJ6xlDAjEB2iP2QlpHCfkR2th63VSls
-	f29qk1KFoWPUgtqOKupvxo71JOQo51kG2SWGNUmUILHTyp+yM5UPsn0C61EuJPskNK8m
-	oOcYqwxYDiqvWJYr51G7h4aOp2LGaeWYpUnZneBj+3uUZy0+hjW7hpo1Fiw9rTSn7lGW
-	Zevjc/b4hO4eZQrGFzqClLzJNmWS5X0lK9lnYuhnWuYoadm/VBKxENOs2NTuCFPiLbuV
-	qRhKsLiSp6KeZcfZAUpjB3rss5UzEOFub2nq5D0+9nhvSUq23cfWO/JKUvakliTbU+co
-	9tTi5GTIC183bjY+bJxhzDGm48IoyWgzxhkjTeGmUFOIKdgUaDKZjD72Uk+hYjjLuqkQ
-	tHT3mgwm2cdehlI6y07oyhM/MUkmwUSmSJ//XVwKM4r0se6+UC5BOG3QJYOPnUBuc9UJ
-	h4JUxsepD4QiqxhPLbxJYCaBZuNkvtNnoC1RbYXmwvDpYVOKnV/1qtJH7r7Tv/oxM4u2
-	B2dD7bjFg2M4BL/Fc3e6+a7wlW3rGgzVFqWnl1Ws621raazTrxVUV20Vbhe07W245mmv
-	tlpPNbYM35kkVVXX1PNzrbdWa1FrnVqj6rSeatPXcfU9w3V8uE11nqI613z3qTpHrbOn
-	zdHm4tcrvdVFq5aMsrVtxNaqoi+xVcQ3W8VtVevrvmBrCR+u5raWcFtLuK1qR7Vuizvv
-	aqgsWt2K7MTVA47+KZVa6bxFbtyweZw+9iK/j1hD/wchkJP9CmVuZHN0cmVhbQplbmRv
-	YmoKOTEgMCBvYmoKMzcxMQplbmRvYmoKOTIgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNj
-	cmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzI3IC9EZXNjZW50IC0yMzAgL0Zs
-	YWdzIDk2Ci9Gb250QkJveCBbLTkzMyAtNDgxIDE1NzEgMTEzOF0gL0ZvbnROYW1lIC9U
-	SVBTSlorSGVsdmV0aWNhLU9ibGlxdWUgL0l0YWxpY0FuZ2xlCi0xMiAvU3RlbVYgMCAv
-	TWF4V2lkdGggMTUwMCAvWEhlaWdodCA1MzEgL0ZvbnRGaWxlMiA5MCAwIFIgPj4KZW5k
-	b2JqCjkzIDAgb2JqClsgMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
-	MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAw
-	IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDAg
-	NTAwIDU1Ngo1NTYgMjc4IDAgNTU2IDAgMCAwIDAgMCAwIDAgMCAwIDMzMyAwIDI3OCBd
-	CmVuZG9iagozMSAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUg
-	L0Jhc2VGb250IC9USVBTSlorSGVsdmV0aWNhLU9ibGlxdWUgL0ZvbnREZXNjcmlwdG9y
-	CjkyIDAgUiAvV2lkdGhzIDkzIDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMTYg
-	L0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9iago5NCAwIG9iago8PCAv
-	TGVuZ3RoIDk1IDAgUiAvTGVuZ3RoMSA1MDgwIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
-	CnN0cmVhbQp4Ab1XC3BU1Rn+//vYRwiSEJBNwnp3uZuEJLuElwmQkNyE3bAYEsMG4i4P
-	3U2yGGgC25amIgUiD5XFOjhWoBlbpDKjg0VvFsRFRieDONoqUx9FrS/U8YHSlNbyqEJy
-	+5+7YSWMw2RGhnvm3P/8j/P/3/3O2eQcQABIhU7gQWluD0XABF6yvE7d0tyxynZnZb5C
-	488B+HuXRu5sfyP81R4AoQ0gJePOttVLaw/syAK4oZNi/twaDrWcbvpvFcAIJ+nFrWQw
-	32s0kd5CuqO1fdVdJkCKH3E/6aa2lc0haISppG8j3dAeuitiCqdcJH0n6bYVofbwkePc
-	+6THSc+LrPzlKu1uCJP+Cem5kV+EI32+LUsB0qgG/zeyITX2pIKBOsAEZhF7IF08Ai5x
-	B1iFKrACaJRT+4DJ/gbttPgGpGh9Wi9PSHAc6ycu4Ch4BozwHKwDAd6CvWgGGXpxMvwD
-	rVgA70E/fACfQRZshcfo7YGTeA7M8DWOp5hi2AB/hF1aBCJQQe0kijAapsHX2hrtVe07
-	qIIoHEUjZqBVOwRFcB+1LngUU7kmrRssMBd+TSuyAf4C72sx7RvKXwxfYDoWCaXaR8CB
-	SJbpsAX2wnNoRxkLcJH2BdkthHEx7NVqtQ6ad5qiiqAO1lC1T1HCXCzELvyY79U6tQfp
-	28aSbwE0U2uHe2AnPAr79KgmYaw4mvK7oYZ8D9JeOAnfEo35WIV3ccf5b/h/C6VCl3aU
-	cCygekHYhTyx4sAF2IIR3IcH8CU8x5VwIX46f1yICLsJ2wK4H3bDC/AKvA0fwSnohe+h
-	DwXCVI634hr8A837jJvCLeHWcg9w73On+Un8x4JR2CpuFg9rgnZc+54w3wQFUAqzYR74
-	aR+EYSmsgF/BetiERtgB3fASoT0BJzAF07AIJ+FsnI+L8Ge4Gh7CPfg8foif45f4NaHL
-	4CRO5oq4Dqq3gdvC7eNi3CGul0/nV/Fr+R7+Y/6cMFpYIvRQOyG6xFWGsYYa47z+3/Wf
-	0FzaNq2L1uVGag7IBxeUo0AstsMmWsktxNmjsAeegqchBjHtAk6Ho/Am4foUTsN5WrGx
-	1Ow4GadhPc4jhG3YjutxJyHciwcJ5WE8DO/iu3iBWj9kcmbOxS3iQtxqal2wk3tb5yeV
-	t/PjeRdfwzdo/+H38d38t0KOsFD4ubBGiAo7hV3iWHGmeJu4UIyIj4gHxdfEd8TT4hmD
-	1XCfYY/hgOFto8k41bjT2I/jCIsNc+AAvEi7bjsfId0Bs3ATrWojvE67txdehgvwHfTA
-	E2iFfp6tZq62G+La/bSaL8Cz/G+gDB7iHuZu0Sr4J3kzTtbOU66JtF6XGigF+ePzcnMc
-	8ji7TbrJOjY7K9My5sbRozJGpqeNuGF46rAUs8loEAWeQ3B65OqgTc0NqkKu7PW6mC6H
-	yBC6zBBUbWSqHhyj2ti8ELkGRSoUufSKSCURqSQjMc1WBmUup80j29RjbtkWx4Xz/DT+
-	rVsO2NRefVyrj7fp4+E0tttpgs1jaXXbVAzaPGp1R2vUE3S7nHhIob9BKS4nHAJQYBhL
-	rMKs0NpWCwkW4VGzZLdHzZRpTD4+xxNqUevn+T3ubLs94HKqOKtZblJBrlJHFA5MZ/Ns
-	FOrzU22Xc5lK+GFraovcsjWuQFOQjUKL/SofCqhckNVIL1THyG51zN1fWH5QL408D1zm
-	VLmc6lA4Wq0qwa1EOlODTAs9QFpNg43ScpsDfhU3EzgGQsee+Iqw7GGW4HKbapar5Nbo
-	8iBxDvX+WJaS5ZGD7oAKPn8sU8nUFZfzkGVdqZ1IOeSqdFUyWWq3rEvIrzYm7G/1MGlZ
-	d/QTkjW+JC/IKslzCKZqa6YixAVhncZe4WkQbZ5G9NETQPrKZYRnlsrRVuJzVDFnTkjt
-	bBiAEWp1D4Bb7o6ZM7M89A3BqgDFB6NpM2gBKT5NtkXPAq2s3PvPwZbQgMWQk3YWmJOt
-	f3ILqRi6NO7QifHIoVaL3MqWr0NfatJli+cyA+kU5HbFocBZEwdzvb8b8cFAHLXNcXBb
-	D9E/GP6O28ldyDbcMjeVI8XpJEOBnUaEoJo+sprtDFvUFp3TErVV21ppSwk5uiRHOBoo
-	IsIa/EQLzPfbVSWQnRyGA4EZlGcCy0NTKDwaoAzLBzKQ1E1FfRRU5KyhRcit98/zq53u
-	bFVxB4h02sQ99X61h/ZvIEBRE5NICfHaZZYBzJMI88QC8k9OZGmgHJQiEI2ynA1+2a72
-	RKPZUfarS+hxhCsNyoAhDiyEPtwTx856mktCtmczg2yX7QQrwDidQhv40gaKw9SrM3xz
-	EjfNLCa0N+sMl1wjhqcNheHpQ2J4RhLpIIZLCfMMxnDZ9WN45iCGy6/OcEUSN4FUCG2F
-	znDlNWK4aigMzxoSw+4k0kEMewizmzFcff0Ynj2IYe/VGZ6TxE0gbyG0c3SGa64Rw3OH
-	wnDtkBiuSyIdxPCthLmOMVx//RieN4hh39UZbkjiJpDzCW2DzvCCa8Rw41AYvm1IDPuT
-	SAcxHCDMfsbwwuvH8KLLGAa6GXQB0Dn1CN1AjVCu2EWDlc5/gtHKQ4ooWHmeyzIbjFaE
-	TJN5r72tzFJYWHemrLavrC7tXFltWl8ZVJT1lbE+aeKUdHt6HvUu4fH4xWPike/L44Lv
-	wtN0CKN7YCe9nqG7Gw+5SgaO51PEMWOyMAKZghixr0/kre2r84TdX0JFbe+kiRn2dHsn
-	FvW/iQX97yRysDxgnbn+5TtGlJ2FdLp20vOy8vfKpOwc+Bqkf9aJu6g+x5Dfn0/XUjz/
-	4cUPhq1Letg09nDiK9DFTWcY6T7cSG82l4Pl1NvoTs5BGrXFAMaTKRl0I2VehJEDeQx0
-	uwSfr67Ss7DQG27rCK9a1hxyVa1sa2E59Edjt6Ufe5g/HSAOvsI4eKmXU59KvaCw26Q8
-	j9tg1JIzihklAYZJ72X+60WcAMPhS/2t4gQldTiYmzeWSc0bN3rzK81YAyUCgoQecOjS
-	HXM8JcWxPOaQScxMCC5WYiUNFHOJQ+oraZIulsRNqGRL/3M8LJ2nfs5RIZ11TJLepLg3
-	SmZLxyrJH5NeK4hzJP7qiAuojJBeddwjPVuSLx0oKZVieWSLSd2VJA5Ke0rukR7fpFv+
-	VKCL3Y44dsWkx5g4KO2i/Ns36o5HEhM3JERkk15o5X5drNgf5546KLU7cqUmmojKMGmJ
-	o01a7Jguza+MY05MqmXTDkpz845JNax0TFIShYoT2W926IgnJ8o6HYel8YkK41i0kiHZ
-	HHMlK+V3PrZdcjpulyoL4vjkc97xBQ5v3vbiOJ7RazBBQJlYkRDNeS/gE3QTzseFkIO/
-	3+/NJ8y4LSZtJNG13zu+JCfOn1RGSvvzvHmbqBdTz6G+II7zFadxh7HFuMA4xVhozDfm
-	Gu3Gm4zZxlGmkaY00w2mVFOKyWQymAQTZwLTqLj2iVLI9tsoQxoTBoG9BX2cRvsH9U1G
-	W5JDEwe3QNwAm2/sqLBUjCxPn17t/pFXUDcG3YU/PPSzTj4WtKrb6bCm7rUG1MlsoFkD
-	Se9PG4SraH6Nb/V+3+pTjfp5X/aEg3TsV7d20LWss8lm6z61mjnYyTPY1NzKZCisrpbD
-	bvWU7LZ1+/R5V7gbmdsnu7uh0TPf392ohN0xn+Jj5/nA/nqPl/6uUJFLtbYka3k9P1LL
-	w5J5Wa16fd4VteqYu57VqmO16liteqVer1VY6FnWUAX/B4CdecwKZW5kc3RyZWFtCmVu
-	ZG9iago5NSAwIG9iagoyNzg0CmVuZG9iago5NiAwIG9iago8PCAvVHlwZSAvRm9udERl
-	c2NyaXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3MzEgL0Rlc2NlbnQgLTIzMCAv
-	RmxhZ3MgMzIKL0ZvbnRCQm94IFstMTAxOCAtNDgxIDE0MzYgMTE1OV0gL0ZvbnROYW1l
-	IC9SUk5BRVorSGVsdmV0aWNhLUJvbGQgL0l0YWxpY0FuZ2xlCjAgL1N0ZW1WIDE0OSAv
-	TWF4V2lkdGggMTUwMCAvU3RlbUggMTI0IC9YSGVpZ2h0IDU0MCAvRm9udEZpbGUyIDk0
-	IDAgUiA+PgplbmRvYmoKOTcgMCBvYmoKWyAyNzggXQplbmRvYmoKMzIgMCBvYmoKPDwg
-	L1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvUlJOQUVaK0hl
-	bHZldGljYS1Cb2xkIC9Gb250RGVzY3JpcHRvcgo5NiAwIFIgL1dpZHRocyA5NyAwIFIg
-	L0ZpcnN0Q2hhciA0NiAvTGFzdENoYXIgNDYgL0VuY29kaW5nIC9NYWNSb21hbkVuY29k
-	aW5nCj4+CmVuZG9iagoxIDAgb2JqCjw8IC9UaXRsZSAoVW50aXRsZWQpIC9BdXRob3Ig
-	KFJhbmRhbGwgSGF1Y2gpIC9DcmVhdG9yIChPbW5pR3JhZmZsZSkgL1Byb2R1Y2VyCihN
-	YWMgT1MgWCAxMC41LjUgUXVhcnR6IFBERkNvbnRleHQpIC9DcmVhdGlvbkRhdGUgKEQ6
-	MjAwODExMTIxODQzMTNaMDAnMDAnKQovTW9kRGF0ZSAoRDoyMDA4MTExMjE4NDMxM1ow
-	MCcwMCcpID4+CmVuZG9iagp4cmVmCjAgOTgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAw
-	MDQ4ODcyIDAwMDAwIG4gCjAwMDAwMDQ0NDYgMDAwMDAgbiAKMDAwMDAzMjU1MiAwMDAw
-	MCBuIAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDQ0MjYgMDAwMDAgbiAKMDAwMDAw
-	NDU1MCAwMDAwMCBuIAowMDAwMDI2NzE3IDAwMDAwIG4gCjAwMDAwMDkzOTcgMDAwMDAg
-	biAKMDAwMDAwOTg2MSAwMDAwMCBuIAowMDAwMDA4OTU1IDAwMDAwIG4gCjAwMDAwMDkz
-	NzcgMDAwMDAgbiAKMDAwMDAwNzk4MyAwMDAwMCBuIAowMDAwMDA4NDQ5IDAwMDAwIG4g
-	CjAwMDAwMDc1NDEgMDAwMDAgbiAKMDAwMDAwNzk2MyAwMDAwMCBuIAowMDAwMDA4NDY5
-	IDAwMDAwIG4gCjAwMDAwMDg5MzUgMDAwMDAgbiAKMDAwMDAwNzA5OSAwMDAwMCBuIAow
-	MDAwMDA3NTIxIDAwMDAwIG4gCjAwMDAwMjU3NjUgMDAwMDAgbiAKMDAwMDA0MDkwNyAw
-	MDAwMCBuIAowMDAwMDA2NjM4IDAwMDAwIG4gCjAwMDAwMDYyODYgMDAwMDAgbiAKMDAw
-	MDAwNTQ2OSAwMDAwMCBuIAowMDAwMDA1OTY2IDAwMDAwIG4gCjAwMDAwMDY0NjEgMDAw
-	MDAgbiAKMDAwMDAwNDk3MiAwMDAwMCBuIAowMDAwMDA1MTQ5IDAwMDAwIG4gCjAwMDAw
-	MDU2NDYgMDAwMDAgbiAKMDAwMDAwNTMyNiAwMDAwMCBuIAowMDAwMDQ1MzQ3IDAwMDAw
-	IG4gCjAwMDAwNDg2OTMgMDAwMDAgbiAKMDAwMDAwNjk1NiAwMDAwMCBuIAowMDAwMDA1
-	ODIzIDAwMDAwIG4gCjAwMDAwMDY4MTMgMDAwMDAgbiAKMDAwMDAwNjE0MyAwMDAwMCBu
-	IAowMDAwMDI5MDUyIDAwMDAwIG4gCjAwMDAwMzA0NjcgMDAwMDAgbiAKMDAwMDAzMTE2
-	MiAwMDAwMCBuIAowMDAwMDI5NzcyIDAwMDAwIG4gCjAwMDAwMzE0OTcgMDAwMDAgbiAK
-	MDAwMDAzMDEzMiAwMDAwMCBuIAowMDAwMDMxODU3IDAwMDAwIG4gCjAwMDAwMjc5OTcg
-	MDAwMDAgbiAKMDAwMDAyODMzMiAwMDAwMCBuIAowMDAwMDI4NjkyIDAwMDAwIG4gCjAw
-	MDAwMjk0MTIgMDAwMDAgbiAKMDAwMDAzMDgyNyAwMDAwMCBuIAowMDAwMDMyMjE3IDAw
-	MDAwIG4gCjAwMDAwMjczMzggMDAwMDAgbiAKMDAwMDAxMjc3NyAwMDAwMCBuIAowMDAw
-	MDE1NjUzIDAwMDAwIG4gCjAwMDAwMTc3OTYgMDAwMDAgbiAKMDAwMDAyMDY3MiAwMDAw
-	MCBuIAowMDAwMDI3OTYwIDAwMDAwIG4gCjAwMDAwMjA2OTMgMDAwMDAgbiAKMDAwMDAy
-	Mjc5NCAwMDAwMCBuIAowMDAwMDIyODE1IDAwMDAwIG4gCjAwMDAwMjQ5MTYgMDAwMDAg
-	biAKMDAwMDAwOTg4MCAwMDAwMCBuIAowMDAwMDEyNzU2IDAwMDAwIG4gCjAwMDAwMTU2
-	NzQgMDAwMDAgbiAKMDAwMDAxNzc3NSAwMDAwMCBuIAowMDAwMDI0OTM3IDAwMDAwIG4g
-	CjAwMDAwMjU3NDUgMDAwMDAgbiAKMDAwMDAyNTgwMiAwMDAwMCBuIAowMDAwMDI2Njk3
-	IDAwMDAwIG4gCjAwMDAwMjY3NTMgMDAwMDAgbiAKMDAwMDAyNzMxOCAwMDAwMCBuIAow
-	MDAwMDI3Mzc1IDAwMDAwIG4gCjAwMDAwMjc5NDAgMDAwMDAgbiAKMDAwMDAyODMxMiAw
-	MDAwMCBuIAowMDAwMDI4NjcyIDAwMDAwIG4gCjAwMDAwMjkwMzIgMDAwMDAgbiAKMDAw
-	MDAyOTM5MiAwMDAwMCBuIAowMDAwMDI5NzUyIDAwMDAwIG4gCjAwMDAwMzAxMTIgMDAw
-	MDAgbiAKMDAwMDAzMDQ0NyAwMDAwMCBuIAowMDAwMDMwODA3IDAwMDAwIG4gCjAwMDAw
-	MzExNDIgMDAwMDAgbiAKMDAwMDAzMTQ3NyAwMDAwMCBuIAowMDAwMDMxODM3IDAwMDAw
-	IG4gCjAwMDAwMzIxOTcgMDAwMDAgbiAKMDAwMDAzMjUzMiAwMDAwMCBuIAowMDAwMDMy
-	NjM1IDAwMDAwIG4gCjAwMDAwMzI2OTkgMDAwMDAgbiAKMDAwMDA0MDM5NiAwMDAwMCBu
-	IAowMDAwMDQwNDE3IDAwMDAwIG4gCjAwMDAwNDA2NTMgMDAwMDAgbiAKMDAwMDA0MTA4
-	MiAwMDAwMCBuIAowMDAwMDQ0ODgzIDAwMDAwIG4gCjAwMDAwNDQ5MDQgMDAwMDAgbiAK
-	MDAwMDA0NTEzOSAwMDAwMCBuIAowMDAwMDQ1NTMwIDAwMDAwIG4gCjAwMDAwNDg0MDQg
-	MDAwMDAgbiAKMDAwMDA0ODQyNSAwMDAwMCBuIAowMDAwMDQ4NjY5IDAwMDAwIG4gCnRy
-	YWlsZXIKPDwgL1NpemUgOTggL1Jvb3QgODUgMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDw1
-	M2QyNzY2MDA4OGY5MzFhNDM2ODNlYTI2M2MzNzQ5Yj4KPDUzZDI3NjYwMDg4ZjkzMWE0
-	MzY4M2VhMjYzYzM3NDliPiBdID4+CnN0YXJ0eHJlZgo0OTA3OQolJUVPRgoxIDAgb2Jq
-	Cjw8L0F1dGhvciAoUmFuZGFsbCBIYXVjaCkvQ3JlYXRpb25EYXRlIChEOjIwMDgwOTE5
-	MTUzNTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgNS4wLjIpL01vZERhdGUgKEQ6MjAw
-	ODExMTIxODQzMDBaKS9Qcm9kdWNlciAoTWFjIE9TIFggMTAuNS41IFF1YXJ0eiBQREZD
-	b250ZXh0KS9UaXRsZSAoZG5hLWNvbm5lY3RvcnMtMC4yKT4+CmVuZG9iagp4cmVmCjEg
-	MQowMDAwMDUxMTk3IDAwMDAwIG4gCnRyYWlsZXIKPDwvSUQgWzw1M2QyNzY2MDA4OGY5
-	MzFhNDM2ODNlYTI2M2MzNzQ5Yj4gPDUzZDI3NjYwMDg4ZjkzMWE0MzY4M2VhMjYzYzM3
-	NDliPl0gL0luZm8gMSAwIFIgL1ByZXYgNDkwNzkgL1Jvb3QgODUgMCBSIC9TaXplIDk4
-	Pj4Kc3RhcnR4cmVmCjUxNDAxCiUlRU9GCg==
-	</data>
-	<key>QuickLookThumbnail</key>
-	<data>
-	TU0AKgAAkVqAP+BACCQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNRuOR2PR+QSGRSOSSW
-	TSeUSmVSuWS2XS+YTGZTOaTWbTecTmdQJ/zqfT+gUGhUOiUWjUekUmlUumU2nU+oVGpV
-	OczyOuxyOJ2udyvV4vB+v1+VaD2SqWeJAK1AsHhEIhcMhUOh8A3WEWoBXUA2iTVitVyv
-	WCxWaC4S+YeFXi2W64XK6XaD3i9YjKZXLVC/Vuu1+w2OB2XP5fLYq22+43PJ5G1anRa3
-	XVTDQ+xPxmrtastcLJ4Ol0a/fRgGhMKjAhEgYEQkgYDge9Xq8ZLm3vfgDZ7Xb7nd73p9
-	uI8Hh8Xj8nl9EA8/V9Huen1euCdXbbjdbz2fODd7icbkcrmdHzXn0PpAEAo42KFnedBz
-	lURhBL9AUGoQBwKguJI0DiCgNg6AcMgJDb+wyAa8NbA0EQVBkHRMAEIQlCkLQxDUOPND
-	0QRPGcaJ1EUEwWrMawFFMJwrC8PQ2AkOwzGUdyPAMCIOdyuFAPo5nueh5yREwCAOBAkD
-	WOoLg8EACy/ITlgOvEhPItEmHLJ0oSlKkHStLEtS5L0wQ3MUyQ3M02z1PaMzRNUoynPj
-	6TfLMty7L4CzC5c7gJPNBUew8lAAfh9H0Tg8DadpzHIkBXmUaRnnAcsPgEgr/AmBoFCC
-	FYShSDYLqmcR2HeV1PjgJQfnYeZ6HWeR61dWCzgSCAIiINA6AaB4HgTZkxANZ8hSE6Dp
-	KdSlLUxTVOI/T1QVFUlTLrVFVVZYFY1nWppVvXNd17X9XrRYdi2PZNl2a5dngNaMXv9a
-	lIX9R9rUvTNN07T9Q1GtVwADcVV1bd6pVlWlbVxXVeV9cthWJY1kWVZgE2daF9Wnf+SK
-	fSRjlkVhfFMT6R24BEviSGIUoKfyBGKbJvl2aRsj2KIigPRKoH4sJ6nyfQHgUBJonCcx
-	oHAcgvh+GzEA8GgdhW4oF62BWu68BGwSFREjKblGVZZl1P5gAuZZogmbH/nGdZ5n2gaE
-	p+iH7o2kaVpmnahqWqMPq2sa1rmva7sAEbFL+yZLx8d7NleWpFl+Y5nmub5znee5/oIC
-	aHouj6Tpem6fqOp6rq+siRrYF8RxOww3seE8h2yjNinhIjQLjA7SaW17ahB6HwfJEFiX
-	o5iYIAI9edB4HkWhnGqdx6HuEYLgmJYZBVtZfGqbYF2ebBzHUc/oBaDoMuMFFSHme58F
-	eZZpnCdZ3giBgEiUGIVBECwEyCtyGaN4cY+miA3BKB8HoKARDpHgPMYI1xuMNFEMIZY9
-	h8j7BgCADYTQZgrG2OgdYtxnjXHiPYfD2AJhOBoCwBgCADjIG2OAgqsh4AQAWAkbg6B2
-	BfB8DQBcMCCrcBOBoCwKgOAYJAAIAoBgXhZDIW4CQDoqANis65xSiFpO1KQ7p3jvnKtq
-	cu24gzxHjPIeU8x5z0HpPUetCp7b3UvvffC+N8r5x5PpfWDB9pan3vxfm/V+7+X9v9f/
-	AFnMA4CwHgTAuBsD4IwTVZBWC8GYNwdg/CGEcJYTwpezCyF0MIZQ0IJDaHEOoeQ+iBEI
-	gkRIjRIiUR+JkTooRSioA6KwDYsNgi0vt28v0ARed6V937wXMEHjM8d5Ly3mgKee9F6b
-	1XrvZji958D4gDPkfM+h9T7H3Pwfk/R+z+H9P8f9AAgkAoCQGH7AiBUDIHQQglBSC0GI
-	NQcg9CCEUJITQohVKCF8MYZw1HZDeHMO4ew/iCAeIan4ixHiTEuJsT4ogRinFWK7W4sp
-	0SHFyYFHybGxHKNwbIoA+ByJMtxRIAwjAuBOQVow+xjM5G6OodgbgkA+HwPsfYjhaDAB
-	8CoEYK4kjBGsN2MwXAeg0FWMgaE2guA8BmAoA4BhUDFGcEYF4KFgCbF6McD4FAIg9BSC
-	Mbo6R2CxGYNSnFOqeCnGMM4MAPgbDuHqPYVQxxoBiCCDaey6A2BHB6Mobg4RrDlHQFcH
-	IMR+kCEoLgYYWAdAxAyBEB4vBpjZHgPUfDUgai6GiNgZQ3RxSXBwCUEArRkjRBqCMDwM
-	gQgcp2PsQ4sJlhAAcAkBBIwKg3CABkEgKC3XDAjLmXLHkhIeNYUSkdJaT0pU/SultLyC
-	UxpmN+mtN6c2zp9UCoVRAMVGqQ8WpVTKnVQqlVSq1WKtVcVfV6sFYqyVmrRWqtl2631x
-	rnXWu9ea919r+p+wNg7C2HsTYuxo/7H2RsnZWy9mbN2dB/Z+0No7SwctPam1drbX2xtn
-	bW29ubdkit7b+4NxC3XGitchDdyjIUgxga65tJqUElpUASllLqYQZuvdmtt3Kf1BqHUW
-	o9Sal1Nqe+WqNU6q1XqzVurtX6w1jrLWetNa8f35rlXSu1eK9V8r9BmwFgrCWGsRYqxl
-	jrIWSspZazFmrOWetBaK0lprUWqtZa62FsqeYgjTiK3lvrgXCxRioBuLMcIZuXjHRhKj
-	YjQF+LoWomRI3QGkM0b62iGZLBQq8ZlpBlwEDSEUHeOx9CJeQHwKQRb7AJAMAUJgMgVk
-	FGfpkcKsweQMEiLYYIe9VtrIKJwXwx4NgceaAm/wYGp2VAdCce7nx1DxHouhdTfnTuBG
-	ANawr9rPEFmTqnVYwqjjmHePIMAQHBAAbk/UdwWqpDTHEOcY8MwzBDBySYAYHgTAXBSC
-	4Cm/wJ8B4EspetupeONo8UPSGktKaW0xpohenNPag1FqTU2qBe6q1ZWvV2sNZa01trjX
-	WvNfBF2AQTYWxAQbGhzsnZYEdmj22eonaO02Jg/2s4Bqe2dtjv26QTb/Gdw7j3LufdO6
-	x17t3fvHeY4N673JLvnfe/d/gU4FwNjqzKNgFcdo3rxZ+F6T0rjZT/DyHcSAvp8cWoRx
-	6j1LdVo/GONat1frHWZBNajk1uO/XIItd691+l/YOw9i7H5cDbZmztobS2orjnLqAbc8
-	kFz8AHQeNbiG7uTc26JEDf3Zu4Ge8N5b03tvjfW/N/cA6uBPgjHut9d6/7EkBsRiCvFS
-	MEVIotLavAIEirZBZ2C3GgNcb46h2vKCCLm0PTV8ugIOPdSocwlhBF3ZkDoEwIYZIKOD
-	pIsq1ttFtCUN4SQfEIzwBSXQPwVAkFx8PCwC6qgxtiED9Y5B2jw8bzh03OgbThtyAOCG
-	BYBMIQECFYFyDYCQB4GaG6HGAALqumIKs2HuEkFwGED0CgCInCA2AkAeB0BMBCJMH0Le
-	AaBGBUAtBOAvBSArBWAlBaAZBedcXwQ8KO9q9u9y92US98BQ+AaI+E+I+M+Q+UGw+YQ2
-	IQ+gH0+k+o+s+w+0II+4Hc+8Go/A/E/I/MtW/QAW/U/Y/ctI/gAM/kA4/oBI/s/w5u8e
-	cC/8Y/ADAGIPALAPATAXAbAex0IJAlApAtAxA1A5A9BAJLBEAvBJBNBRBVBZBdBga3Bk
-	Qy9lEWKlBq9w907IGk95B1B4H7B8+K+OCY+S+Whm+bCM+i+m+qGy+u+ytQ+2+6++Zm/C
-	Gu/G/KIO/O/S/W/aGu/e/i/m/q/u/zDOanDTABAFAJANARAVAZAcADAhDqHrAnArAvAy
-	fnA3A7A/BDBHBLBOAtBSAvBWArBaAlBeAZBiWfBnEZHEI6NiGCFWFKGIFaFM0smMjIIK
-	V6HoEiFuGED8CmCMGOG0HAHG/uvKIQHkfgAahgFYtWAsAcAZC0IKGSG2HCGqHIHQCoBu
-	BfDuD0Z+P8IKEyF4GMCKpcA0AgAcOeL2G8+MekGtB0oDF0/28guuHSHiHmCiBsBcIKHk
-	hQEqF0GIDwCeCGc5GLGOIMExIy/oBGtUGkDasEAcAUxGJIHmASAeAMA6BI6qAxKkAzKp
-	GyAhKua+4OAK0WJ/HNHRHVHYjGIRHhHlHpHtHxH1H4qXH9IBIFIJINIQIJIVIZIdIhIl
-	GXIqxfIxI1I5I9JAABJEHbJJJMhhJQb/JUZzJZJdJhJlJpJtJxJ0Z5J5DpJ9KAqFKHKK
-	B7KPKSJHKXKbKfKjKnKrBXKuAhKybXK2xfHHNWIAAIFA4JBYNB4RCYVCGCq1KxFapoXE
-	4or2U0gQBQKSRiKYM63k9Eit2EfimRmO2nA43a8C4PRpBnk93wDQQB1YyWiFgcDB+KhJ
-	A2S23C1XI6CoNxeklwwj0USKAgCAYGmV4xiKLhOGggDgFX6kAG86natGc1iQLxQDJuro
-	ucCUP2i4XM0HA5C+Pxsxmy33S8XmURsLoG8ns+EqumIeCeQ120myAKmRq1BkxVyAKhGr
-	WS0jaRx6DgUCIppYS8wSDwMHRIFNcGNgGdkFdoENsCtwCN1GgLU6ppuBweFw+JxeNx+R
-	yeVy+ZwH/z4MwFUpGKrlPzYPFoxGo5HoK930+0Kr13jCG73o9lAwWWbSQPQgCwTc3Kvm
-	o2ziSyAq2Q0JAeoziIHJ+H6fyHmaD4KAiIYWhMSpcmIn4RhYDoMngex7ktCA7CcIa7HI
-	cJ2HewQXKkAJUmOZ4RguCieAYtxpLgH5qHGc5kKIMghBwdp5nqTxgGTHIcgi+Rkm4cJw
-	nWd4rByGBdGibDJACygToMYhsm8Z5vnKA4CgIMwhhy7CEncAgFH+CwOtoCrYAwDU3zaC
-	M5AdOgEzs3iwTHPTpOo609II7SMo2jqDPA8TyPM9D1PY9z4Pk+j7Pw/T+P8eUAQFAkDG
-	JBEFQZB0IQlCkLQxDRiQ5Dy7xDEbBxNFEVRZF0YRlGkbRxHUeR9IEhSIBMjSRJUmSdKE
-	pSpK0sS1LkvTBMU/oLMszzTNc2zeDU4znOs7o1PNm25btvW/cFw3FcbiT46rr25QLuUI
-	77wvG8rG0U9b2ve+L5nC+r7vy/b+v/AMBwLA8EwXBsHwizVRQvDMNw7D9VRJVsUxXFqe
-	1kuNaRucMcx3HsfyCIUhyLI8kyXJsnyiybKoLK8sy3LsvzDcFnzRNTaWnODYTkCM6AdO
-	wEzwr9yaFoeiaLo2huef6Bn9piGlKYxXlRbt1UG7yCaYf5AFYXFg1Ex5s5YCQFgUfR+n
-	6KocBgEAKglSjDHxhR97MngGpeGgDAIAajHQVj+gmBoFnme58syEgchMEB8PCxJiaSBg
-	EgQAipC8HwanQeB54sH53nqexMF2YytgsKTBxg+gMgiB56cGLYeBn1AHZPYmVIJzh7ka
-	WhficGYVhsEgP3AdQAAMfgJg0CXkTaDfl+Z5AJNs+IFgWA3qW3o6E6Yf2nahqV0ovQTu
-	oNrGta5JuvMhsOx7Ls+07Xtr+7fuO5gduqYbxvSj76aG/8DwfCuHcS4sxTjnIOSAC5Ry
-	zmHNOcc86B0TpAXOmXw6h1TrHXOwdkylKpBXbO4d07x3zwFvvCeI8Z5zynmPLec9B6T0
-	3qtBevDGGUM4aQ1aE9l7bUWpvfXW1ZpY/mstba6hVr76WyNmbQ2ptjbjDvyH63Ruz929
-	v6f44JwhQIAOKH24yAjkXJuVcu5kt5cYGOfdCBp0bpSLundS6sfLrXXs7gylN2hA4Ou5
-	d27137wXhvFeO8k2EKYVPIhY9J6gBnrQ2kVIuRkjTktJIG2YfowhWCme5I4go9R8j6be
-	BUnreQBEDUoB5BQMQQAbHwPsfjPTSEIH0Pwfg7j0pEAUy8gymVcALAQAYtgBzTIFH9MB
-	vABCBuCHwPeVQFAGALK+b84EWhGi1GAHMJgQFBLgHQP4Ag9gGgUAnN8C84QPzjTaBacz
-	0AGTpAPOsAc7ZGySkpJaHUmCByak4YeTwDJQSiP7KQCMppUSqlYQmV8sZZtjlsQWXCPZ
-	dS8JvL9pkwgCTEIFMaZA/JlTMLCcGaE0pqTWI1NibU3JvTgnFOQ2E5gLTonVOyd09KYU
-	xplTNZs8JKyXpjPaTsnwByhIFKOUsp5UyrchQSWEsh7S0oSQShY9aGy9ohMFpkw5ik0o
-	vRmZpwqOzTmrNdb82Ztzdm+BOcIF5xgfnLOc206QGTrAPO0AdNK5VzrouGSBApJNOGOL
-	AVNdSE1AAiDePdfjkjdHSOwZw3xyS1AMEsGIKlxjnH6AMegCwJVjrKtQD1m01s6rYbpy
-	NE53tmr1XywhB7AWChFac41hrEWKsZY6yC4rJWUstZicNmrOG0s9Om0FE6KWsuFcO4jR
-	q8kOr3X24tqbB3FODa6xNiwD2NsfZGydlbL0mAvboD1nU5WfN1cC5147yV1ruAC44pbk
-	3Ob2BA0YG3n3lNMXMc0QB/gtA6BhvNcbaWTHkAkCDzk11nA5gVNbzrwKCALaMftpblXE
-	vbe++N8iKX0vtfi/VL1w21v/gF5GA5x4FA5gd5GCTeYUxRinFRCr03ruLhEBF8AIYrIT
-	hY5+GL93WAHh3ARtMCYGNpgi3xu6Q40yNkdcV55JJ8GQLEVWSMoQ0HMPwAWHXoVlA7ln
-	LSa6xgNy9aDE8jMlnTybk/KOZ2j5TyrgDK84ctZbNpl3L+RMF5oztneTGYxSZlzxn1cO
-	asrG2yxm9moFc5E2zpn7RWiyDZKbNkzJzQ77KKmaA8BQCUTaMuFmoeICAHs6pVZsD2Iq
-	VPOy8A1n2YZF56z5Dc5+lCpaW0wVPTVrNOae1BObUWpJzamy9qnIutdhbDTHqzSOrh/6
-	wADrLTOxK6a30+nLUNm9eAW19qhbOddnbbxpo4fukMzLhRuOAXp99UAHHo4oA07QoA1B
-	aCQDAFM7DsHmPQ/4KQNgXrrtDXKadCaleRqfYG2pFbG3CuDce5Rt7n3SPrdYA927v3jv
-	Peu99877ypp3aIEaVaEA7wACXAts7c5JyWX+j8ybH3ENvcm5gE7o3Vuzd28N5Zo3pvZS
-	2+N9bP4zrjaU5uPcg5Ez/YPJujXFvPLAfjTtWreGaN4cYwBrDcgRPlpN9BYjMGoXAH2s
-	so30Q+XkG3GABca37lrEVZdr8Dkb0rpnKlu9P6j1PqpPerl06z1sJXXdL9fLp2EvXZOz
-	c/38B3tM4e18j6P4vxfbiHdN7j1DqXVHK9WOf1jrXXOvZQ7AXfsXgufcc6Blnw4F/E9E
-	4J4z1VdOkyw7fwdbkHgggrBKDIEIHCEjKSOCACwE0XDbHQOsW4zxrjxMOisCYTgaAsl6
-	ywAoAgBljHaOJEQHwKgRCmUoAs7RQjBGUDUEYHvJj2HyPsHgKAQg4BKCAgblx5FmGrLI
-	e/yAlgyBUoJrAuxpjZGbYpXi1QDoCYCAUQYQZb8gfZtQDYJp3j4D4T4j4wfD5D5T5gm7
-	cYgb6geCfL2YoJbgcofYALQICCsrETERaxnZbD1Dtr1zx7uD2J3L2b2r273L3b3r374L
-	4b4r44C75L5b5pLD576Isj6gd76z7D7T7j7z8D8TqcA7879L9b9oeD94Zz+J1b+j+z/C
-	ID/T/j/w+UAEAUAkAz8sBMBYFcBsHECECUHsCrlkC4dkDInsDZbsD0EDNjQScMEjAsEx
-	njtj1cPzZzxwUryEFwX8GD2z3AhD3QcL3j3wnsM8B8HUHkCgA75z6D6UIcIr7IF77YAb
-	7r778L8b8sJz9T9ggT9z+D+UK7+4jT/L/b/ocj/538AMAcAsA8MkBkG8SECMHcCaXsCw
-	gUDEDQFcDhZsOkEMEcPMPcFDVUP8ZqmD1rpcFj2BMaV4foQQVoXIN4JIHyfI0xhQSgXA
-	YYLAHQGKCgXj/YeAeofAvIGoWoZ4ay6IKTdyWoA4zgaJTygARIWQXqVgKLdwcAdYdwWo
-	s4PoKYI6IAfwRwWgYAHwzQFYDgDAYIawbrdIfJuwlIcAZjqALIHYGSpAUwYoZoNQIoHY
-	bgdAdgawcodAK4HIGIfo58cEcUckc0dEdUdhk4ZQbocUBMUgChwEOcD7wYCMZEEkZQBy
-	0CQ8FUaMQUFsahAka8bMbcbo0sb8cMcccp1Mc4bMdMdYH8dsd8eMeadce0fCU8fUfhyE
-	fwFsgEgUgkg0hEhUhkh0iEiUigfEiwmEjEjQccjkjw9MkEkUkkk0lElUlkl0mEq0mcrM
-	msroGsnEnUnj9cnwBcoAAMoUokEpnJa8o43UpMZ0z7RUQMQcp0a0bEbUbgnsbxDEmMq8
-	mkrcm0r0d0eCxUeQFsekshBsfMfcfsf8gMgYa0gsg4f8hMhchoEch8iMicisi4lUvcvs
-	j8kMkcksk8lMlclsl4f81kxQB8rUrkm5KEnMnaU8nsn8DsoL0MzEPUzUE8ziXZ6k0E+C
-	RkaD15bqK0s4O4JwITVCVoijyZkkdggcioRAWIXoPgKQIrhSVQfriIgc2Th4rIE8s4KY
-	wbeACogYRNAiBAcodweAZbqANMkieqTdDFAtA4TQXoY4HgE4EUBIgZLQci+AB4c5zDwA
-	G0/xJVAAgVAVAlAwIoYUiYcwd4eQMAIDsZcUOky8PEZM9ZnkpE96Rk0Upo7E+0fc/E/S
-	oo0tG4d9HIAFHdEtBA+9BVBggVBydtCFCVCgDFCwgVElDVDlDwcdEAHdEQfVElHtE9FN
-	FdFogVF9GNGYedGtLVLlL1HtH4btINIdIpcdJE9FJUotJhOlJwA0+NSjM9KMadKZwc+8
-	/M/Y01QUr1AMu9AdL9BJAlMYAFMoAdM8fdCYF1CtC9DJytDdDtD9EIgSe1O1E1FFFVFi
-	U9FyxVP1GjzwvVT4GtUIfNUdQtIFIVIlIxcNRjjc9MiFSE9sz1Sta5o8+caRbppMqAKh
-	tM5AhIbIcwdRXgYolRnoA4IYFgEwgwQIVgXINgJAHhjIjIAldddogRr5uQfoJSx8s4MA
-	vQC4B4BogYR4WoYIpIF0lIdIY7liqhdofQOYJYIISYXIYYMYIAG544B7Grv9YYGwV4ZY
-	addNfFd1eFeQHgZobocZ2aDdZ889aNR0zIDBnVJsztJ6RdS9bg59b1cEiFcVclc1dDl9
-	kwgtd9eNedepL1owAFfZs1fwFVgFgVglg1hFhVhlhwcFiAgg8FiVili1jFjVjljwutkF
-	kVklotdlk9pNlVlll1RdmJnVaUo1SVbFu7FVnZblbsbFb4GFcIhFcdco+Vc4cFkttdo9
-	lFpQole1ptp9ftf8fdgIG1gdgogVg9hIG9hYcthth60ViNiditi9jNjYCVjohDzovAvV
-	tFw9fIglpFlNldlqDVuMy1RoC8PNadmszdu1vF3xcdbUplTBPQS4XYYoDZ1MCaW5s0fQ
-	X1OQbFzgv4wIwYwow5xg8wWwaAa4BIAwAoIT2ggdx9qMs4MNjRF1q1zIFz6QlglwmAmQ
-	mgmwA4qwY0GB0QgckwdYCgnpklGovgvwwBEl6oxAxQ8xr9uFI9uROVulal3tnUFd4RcF
-	4t495L5d5Yft5t596OAF6ggRt964xt7N7d7t74Et8IyFfl8cfd8oG989y9q9zV9Ylpu1
-	94mom9+d+qNF+74N/QBl/lkF/16WAODt62AgxuA12mBF21mV3FJd3c9mBt3+KK4dvRb2
-	CV5AB95ShV5gWV50kl6AdOIODgAGD2IoIeEN7l718FfWE9qFyIXuFeFoAFzFhWGN9omI
-	gomeGt+Qq+HAC2HV/N/ZJV/ovuMIwmIeAYxeIwyGA9mGJVudmc9WJ1m891SeKWSxZt4M
-	0ZP4bYc4dZVwLR1wET3qYAswayBlyZXBjxXZkRX5koGE2WNGEmEwbOFGN2OE1OF19IgZ
-	eZRpexSBfQ/TyYdQeIeh0gFpQwxIYoOIuMBpjJjeVJXRkBXhXxkhYKOZYuJNJOJlR+SV
-	SNnGSuB0peTRPWTmTxFOUAGeUQCeUgs+U4vWaBj5kJXpkZYBJuWGEeNVp2NlyFqWFV82
-	XGOWF+QwAGXhepR5fBSJfeYWYmY2ZAXWZWZj4OZxW5juaOeWamepYRlCOll5cFaGR+bd
-	mlm2b2SmS+kyv2KhbucuT+UOUZpmUudwG2eGVeeeVpYOe+NOEuNeWmNufuN+f4Bl9FhW
-	XZRmgxe5fJSQIGheYoG2Y6AWiAH+ZpWxjhXOeOaeemV2a6Opb+j+BWSF3WkdatnOk+sg
-	5GTNKRbgYYbAbzcobQA6iagoDR1Nb4F6WggaCQcqCiNyOB2GnGWWneWun2W+oOXNhQDp
-	BSIpLBsSI59iJQCWPL7sMQfSZtXiACMqByNCCGvGvSCyOJ2JYeJGRubV3Nuub8pU+hcW
-	tWtgamt2uCWGuQB+umuwgWzaNuzuvsd+WOfN8WW2oGoVzWw4COxIb2xZ9aJJ92yA9j8m
-	yYqWypxGy6M6NKCKNaCe2yN6C6OW0Gjl2u0eJusOKGsu8KR2lJb+1Wtut4AmuOuYHGup
-	seu+6mvO62vhnev23efeFOn+FmgGOe4GxB9GxR9SJB9ptm5OyWylFeyxzqMyB6NQaSNi
-	Cu6+z2rWjurmBMoer+0uku8XDY4Ws94ZbxAgfodo9KXoBa6YiaiyZKZarJoqnSfCninw
-	g5hUznFggiYCiS4PFKjHFajaGWrvC+kOSO7+01KGB+cfEBs3EYe3EvE4hfHSrHHpofFw
-	fCfKfYhHGY3XGqSKiKqdz4AHJ/HiZyGPH+BebusWcHDnNKGm8hcPEPJXJnNAhHMCjXMR
-	oXKfKqnohPLABHLSvHLgf1rnOfPpo/MnDGBnInNXRIhPD3RTFLNQeAA4BxnSFADbLTtT
-	gLOfDWcO1HRq+XR/SPSaQJ5fSzxHTDRHTXTvVJcfNnVS4fT/SROXSnUj03U28HVvNTbw
-	ZYXgWYbIZYY6VQfgfYfQfSTYfIfMu4ffZKVVfiYC+xpXW5owqnaQAAeIfwAYeYASyx5C
-	sbtDAvS7kLX7xTVZs3XXXnX3YHYXYnYnY78vZXYKSR7K8/aBofaYqnava/bJ53bj0nb3
-	UvcDbEFPefgRPSSXcvXvX6WHdPYvdnZXZfeBrA6HgZoXevana3bHbS7ICfboDnb7ocZn
-	iW8LbwZoZQW4awaQX3kC1gbYb4eT4If5nilQ2QDLUToXTPj6GqSXkfkvk/lK0/lflodf
-	l5OnmI2XmjXvWrRPnvpQ4nnPknk3lHpaunn/l3mCc3mXoza3pDBXqOsjbwZwZYXAaoaI
-	XvriuYb4cYe3lwB/tZaQ2DETLib6FsPvcYfvr/sPsfsquXs/tPoPtYB/toDHt7OPuJ6X
-	ufvPw4gySXu3sXsnxCmPvftXthm3tzIDQ3wg+XcTbhpIevznzrpTky4Ctg3ABQ3yRq85
-	7PnXxnxymIcQcwfJEQAZnh6BNrEQ1wCnvx6DMDoqG31Hkn1X1aen1v14d/2JOn2fygDn
-	233A233T1P4HvP3oW/3/56Rv4X2H2Q232jAv5Xtf3PpLRh7Ian8Qa38gb383ZU0C0AE3
-	9YGP9oEH96Gn05pgZgZIW3p/6iR1ziWIeIAogANgUDDUFDMHCkJCcLBcNBMPAsRAETik
-	Vi0XjEZjUbiz+jzMZK2azSX0ck0nlEplUrlktl0vmExmDldL8dzxAsDgkGhEKhkOiESm
-	VDolFo1HpFJpVLplNjsfkMjktOqlVq1XrEcmk2nE6gUFDUHDMJCkLCcNBcPBMRAtZt0u
-	cFxWtzdl1igBvAEvQGvgCv0XvABwF4u+Ei2Bk2Ilb/xkpxj/imPi+SieUiuPjz+fWbfm
-	di4j0BO0QO0lvy+NieZkEikmm12v2GxjLmdT9m4FBm5CO7C29sQV4AP4WkBwK416Amyj
-	eqqOt5XP6HRpW02043IM3YR3oW3/B4ek4wK5HS8nl83n9Ep5msqfp93v6XU2/X7Pb7oV
-	4QP4nh8fwqhmwAW0BMyA8CrACUELUAcFsCwMFweAbAr8AUHQYvEJwwvzFABCS/onCbIt
-	Q07IMqxjMoozLMswjzHsezp+RbEyPH7GkUxszJ7Ryup2HRHsXrQLEgg5IbTMtGh+maZR
-	bqk/0myc0xyHQfb5tyCErLEDEsuACsEAkgYETAtj0SPJMludJ80TSpkoym60qyug8sgx
-	Lcuy/MKhTVPM9T3J8ySVJk+UDQSUTZKgGSsCEsS04E6oFMAETFQaXGxShU0siixSGDi2
-	MCPdPG9UDkMyFVSEFU0CgPDsMQfVVVRAidVJYx4n1oV9bFLXAp11B8VxTI9esfI8b2DG
-	sbSOzZ9VAbx5WZR4x2esisyNGhnGWXBqmiXtJW3biKHCcp8HYd4BoGszt01LdEPzR9Iv
-	NI9q2vbNu3nQdv3DcdyoXc8h3TK11zutt6YFgeCJXd9rWxbWC4W/17XFciBXM3t0OBdT
-	hXZPGGIpHJ7Ejj1kU0sUHwmwI+ZMNOUBDlTkDLloyZeHuY1dDS8r1BsLwzDcJsfV8RxQ
-	jx66CtQs6ITujL4AzM1/GR/V7YVjRpXsb6VYp/G7q54aysg0a5B6rWmft4YTjWyPQbxx
-	HqdJ2AA/Mug3t6wO2szrv4vUx2phF5bLvbpbPtO17bBG3g3uLe7m3O6uTvnF8ZNWD3jh
-	XG8kt+/bVtjhbduCC7khe6OPu2+F50Ri9I4gS9PkcMwePXWDV1wRdhCZEdmHna9sUXcG
-	d3SzED3q5lqa/gnX4YL+KPHjweSHlGr5gTecPvoeGdfZkQfHrCL7Are1rg0aILI4fAKX
-	xZQNJJfMa30dgEQ5/YX33Gf+FlOyNf6LMS/79t5wTaWf8bxepQbD1h8BEgIDuAzX0ROP
-	bG5OBhWBtDeHiOcdQ/j8pyeKBcD0GYLqNAaxhgK7m8OQgbCMqsD4IwTgqlmC8GQPQbQQ
-	nZSDGYSQzhoViBTeoaw5KJCaCUFDhQWeLCyFyXlHMAcWI2JA9IlAniYcRkheHUgCdYHp
-	R5A2sjwWYPISkWxmRdG/F8MUYRQRjVRAIecZw8xpFVGstRmYBBejgJOOUTATjhjsdcLc
-	eRQx7C7H0JUfxZyBe0FYT0hRaSHHvIkK8ixMyNZUCEd0kRhSTEJJUV0l0Jq0CfGEMQmp
-	PM/H809ppjEjjxlM1cbp1w4yrZ6UtsCZVAQ6lkTAbA3B3jmHSP07JZoWKaiGcSDzd0kJ
-	/TPLOYxK5ay3lzLshcvUhy/NJMGY805qMGRpLCYs1ZtEXmTLiXRu5eQZl88VLswIjNkk
-	iO6OQkzkAuncqyKCC0MxSdYroKcLGgj1eOHh+4lxTz/HNQE/MAgW0FQmCShASKFPBGur
-	gUrHA60RfUMuikhxaBsowHejSO5Bhao9H8JUgRZyDaMJ2fYb6UAdpVF0ZguKXGgBGkcK
-	NMx1U1EBTcMFORe07DdT1qg/ViJHqBKRGkAIBBcqRTApxlkXrwljNuqBFBrjbHcOQc4+
-	zswXU0ppOUHC1LtPLU1a1T6o1QqnVWq9WXi1bSHV2F5AqvwyrLXOY1YhcVkrpNSs9Vqs
-	G7q1Wyt0RAG1xg+wyOw4YxigOuCixiFQBxPACg+NIeX6BrfUhMR9mQdWbpqOo64TLQDb
-	tFIke9LGkBntQKu1Q6bWHIBfa8IdsXcCiIGWoHNt2kSLCvYlIIWHfhUuAJ+4QnLiKkBU
-	7af4pzwscIoaIJxjw23RS7JqxgKKgo3lEkegJtKag/u8EC8FS0RV2rxXmY9e601+rXYB
-	LNXig2FPJeSbN5rz1Ur5WoC9bAOWBtre++l/4a3yPbgCY16K+gRr/Vu/lcL/H+gEIbCF
-	SAuP6JSsoUeFzrx0QnPCyKEABz7srTBCdxBOFok1TcQB+Rx4rsyI8WWL8YSPtYOmxMAr
-	JnbSOIvHTuhnCWx86cEo7chRbEoEfI1FlPB7Ue94P2TSzIvZMHylwuLmmiMyLDLGFxR3
-	JlFT+oKLjOzpHFmO6turxIkABgLAk08DX4v1guweDTzZqzXgW+16cEXrwVe2t+cS11yz
-	roFjWdNBQ5zbeq/N7AMXuz/fA9OMI8hbRe/oOWlQq6XPCReVApNOEDjpY7DaFgA6hseX
-	6KM80JvSO20iRomX9A21gWSeZgYzjzLMYHMBNpIlmamjNGlpGkJHHfsM6912oD9p2L0c
-	my3vZeqIP3Zz/SPbDHfF8b76o+hdzORTQmhYaaHzzonPei8+2EPRt3AA8h5j2jOPcCoF
-	AHl8cUVdYJHgCILNhuDBNXM+WC3Nt7gDBd0MCH4jTUqG+AkV31nrfm5N/ZyPerYV9OQw
-	RZIoddI+lwq0YDYDXj2m9OkCf1qSx2HkIs3ijymeTNMOgDFNy+mDMQe8kZqATmmoy/Iq
-	2ftEzKL8vmMRfzof8ospjB6NREOqj+f9DartGK6ytsR922RPgZSBZC1GQOAcQ6g3BpCc
-	UsQYiBTjh62JARYZwGALAQRcZIyxsiYE6LYKgUQeBLCODXb3C9xcN0ZWC+JnanXzJYMg
-	ZQ2Bbi7GYIEPYXBcC8GaKwVwxEwoklCP4EYIgMhhC6EYCaXk0DgHCOkTYoBcPWH3vIdg
-	7R5BKCODQKITQdFWG4N4cwoBSC8EIH4L2+c74H33W3ft/dG8J+IvPqpRwyBrEijUkwnx
-	MBxKWIIQ4pgthXCD5cDJyhojTG+WUBzhAJimFUMABABwChSCeDtPlZxejAGogAZs8+TH
-	IQecj+nJv8f5/zqT/X/f/NlhyMeIlB6CNEHlUFUI9hQseCBuRtTOVgBOVOTucQIQHsOM
-	ONSQMNUFVwHwNABGnGqsuten+OfGmQRjOueQROmtfKhh/unlQOottCmqmPAKxvBCjuru
-	sutuuuvilOwhTh1h2B4grApAegeAdAViLhKhNBaBshtByAjgigZu7O8NCu9M3vgsGPhj
-	zvjiVPCPDPEPFPGPHQmhyA3g1AniKB9h9h+BDhGBVEhgKAxPNkmh4B4h6A8A/BQAvgtA
-	hgcgbgUiKPUh5BBBEBTApgnAdgfgegWinPZvavbvcvdjXwrNFO+tAPixME8wuCivkhIg
-	+g7gsgPgPALDTPpPqPrPsDlBJhMBZAXgWgRAfAdgWB6B6h8DBAACGu1k9sDD8ktiwD7j
-	9jjC2EJqhRixjRjxkKfxkRlxmEjhjRnrZwBiNOlDGKVAOnzBJBlRtNPImNQQHQJIotaI
-	zkutTxvubwLxzOWRygBCLtempn+Kfx4wVwPwWJRNcx7udkbIrtrQYOps0waK7wbCjQcO
-	tOuOvPGhmgCi9BsBtBxhuBuhzASgSANgygwAjiIt5iNQfCwgJB5h6B7g4A1goCKDOA6A
-	9hOAUATAOxRALQph8h8h9hShVBfhqBqhwjegIArAogegRAQgMBxhyB1haBcBlAOgNgKh
-	hBihqAPAOgKgnAlAcBShUhfxBAighAYgkQoiKBqBrBwBThVhhB3B3h5gVgUAPAugtAhD
-	9AFheBfhoCKBuvaCFgHhqhrBwg4g2goAHAGgFCKBPBRhdAYRXgZAYASClxKNxxLNHDox
-	NiUQvPDvEvFyEQyQzQ0CLBRBTBeuCh+w5AjEWBXhZhjBhhihqjCAggfgXgmgkgbDAhsh
-	thyBaBbhlPQB0gUgTgOgwAuAiDjAETXTYTZTaTbTcTdTeCNBVhXBhhyBzB2A4g2AoiNB
-	sBshxh6h7B8gZgYgSB3h4B6BUBWBghtBthyvwPWAagVSzCKPthvTuhhSXh9zCASQhgeh
-	xByB1BPhRheAagZAShiBjhqjcgEgyAvgjgOANgKCKBgBhhpBdBehniKAggfAXSrAYiWT
-	EO+NyuIRM0Mk1TGihxOg/A8AsymRSCOT2yZSaSbScSdSeSfCKTtB6BQhSheB0B0h3z3h
-	rBrhxAugsghPsSgB1hSBUBfwgB4zzAPPqggCHgDy2y3iJy4hzCDgJyngbzQBjBlBmBtC
-	IgBgagZgTTVAby2hnhXBZBjgFAEgDAtArAgB2h3B5t5AfgeAWw6h6T7BeBtBuByt3gHA
-	tAqggAUTb0fBchehnAMtFhgBhBpAFgFAEAxAvAjSmAKinUKvgOHPhO/D0uXhTHuNakHl
-	HlEHuI4AvIWOQBSRuATrHDAjkFVC4hwJKhCEuosrgAqHxApObwMwOwKQJNZjDCKuhFew
-	SNpJQmqwEtItjVgwWR5VjVfDOuljMwXBvR+wZLxyALywbusSCwdvxBgBiBjBq1GAjK4P
-	RhcgpAmgcgdAcAVCTQfAhgggYVshFhCAxUkhnBoBuBjBkhrgDSFG3gKQphMhPBbz2gqA
-	oAdygB2BRBThehEhBgxUZh3BDBFhVAiV2AcAagUBOhRBdSxB5gxgvgjSFABhIBKhYhLB
-	IA1kch8g+hBhRg1AyglyWBXBYhi01h5g5A2gohVhXhiUEBpAdQ/ghggAYBOBQBcggRFw
-	jAVpEh8g3A6hMhFV4AIgIAGTDves3RK0LwtM51pyBCUzHwwTJPHBjBkBrgjSrkSUh2dz
-	mgoAQgPgMUlhihjhrA2A0AmjNh9hJBLhZQp2j2UhRgsgqgft3gHhUhWhhAPgOgLAmglA
-	b2+W/XAN4XB3C3D3EgbiNBHhKBYARAQAMAngmAcCWBWBYBiQ1B+vWAaBq0cBZhbBkhDB
-	AAv2Zg9hAhQg0AyAlALgKgIWLhdT3gTgSgNhChFBU2fgXxFAXBayiT2zK15huBTBVhgw
-	9ghkrAGBLQl0pQ/RACUVJL9wsM/VLUNXvD/UOCZROvXgciygHiLgQAPnigLAIV/WASYW
-	BWCByWDWEWFAxO0gEBGhJBXEwADAkgigaVtBpTRhqg+A7AsSOA7A+BPAlzVgaTChZyiN
-	2wd2cWdUE2egU2fgYT20YBeWOAjkNBFBIBWA4g1gooXhMBOBbTbAOAhWgBXhZBjPyvzv
-	0w2hVASARgNAlAjAaBrBsBxYOhCg/gvh1h2h44bAhTUYNWcBhkayQyRim3ss4N/j4JLh
-	XJ7CBsJGXgyAZYuiNVRwGHnVai/VUi8KUA3gzY0gY41oBJOVMC1EJ4ykGx11buWDCgAj
-	LOhOhQQh/EXrdMuGqx8OmNoEWR81kwSwVB/JTB4uoHYNsx/XwiYyCQdOvVsh8h9B9gwg
-	uAiiKVsgD18gnAlgbhzBzh3CKECgCgMALgIwfSsgZhlhmhtAYzCgcgbAUBNV/gWgVgQB
-	phqhwV9ggU4A2g6BMBFBBgwiE3ziJhEhHBVgexZALD8BHBJhYBKBGg0kNUgBf01h5TKi
-	KA4g8BNTK5ehwBthuBzWazniJh4h5B6g4A7BNBLBHg1ShhluyB1A6A3gpCKBcvHZzBzW
-	5Am0rBshdy3A9g6gr1I2qNEQr1KQs3ujoZIiN2uzIwxBm5+hmgTSJiKN2hyByh2AqwiA
-	ewjg/BCBRyrAZaRwkCJ0lhoBpBvA4A2Ang5g8hOSngcRFAWB9h9B+B7h8B9DwaaabSoa
-	c6d6e6fgJAIgGiNWHhU0tgTUJCWZzBygOgOAK5UUfA/hChS2SA1heBfBnhvvQwdiKaxB
-	0C6h5DdgGBHBJBXhKBHA1ENU7ByhPWMBEBBAwhGBIhWgVgUgPgk4eCKBfhhBohpBqBwZ
-	vXsaFtw6GzFXv7HknaJCXxO1CAJZPtHAkAjAZgUyVZh5i5j5kiKZmZnRZT8gSg2A5BLh
-	FhDAxy9gFafB9bUBLA9A6ArzlB2BghiBp0PgtaOSPg454BK55hZXVZ75859iJh1B1h4D
-	GgL32RaB8ZphXWigXRYgWRVxWxX7rVs4Z1zAVA9BABQBK64UkiKYbAd1ziCgJWQhYhJO
-	zkJhtyIBOhQhc67gw6FK0PfOGVJ7HEnpJhhIDAdmvCUYwCBI6CKY4mbJ4gBrSLUAzlLB
-	UlVIAFNQBpPBNLOgjcMts1WmkH0BrLbgcpVg4smg/C2HmBqrNgdH2A5hz8WxsBp8YLwA
-	gYzrRBthFcbtqJ7Irp+qNA7gV8ftWsZgg8hpBokBGkJjMnyNox7OgDO5Fx+ZHOpVos0b
-	JCXZJyDAnVs0ygDgoVyCKBW2YjObrWUhRCKASARANA9aEZWwokWZYBtXZglA5A8BN67g
-	wZtV9yygPBAvpgGgGAEiLz2gognAdYcAM66hd3WAviKXIJ5WBAeCKA6A9BOA02WhhBiB
-	qWoAGcugciLgzg3BJhBg+gu7chqDCdHiKZuA+BAhRBJBGA0S/hd21gLgjAhgZb8L76GW
-	rOH2sKw2tMBiXaKQwzJwnbEiK74hzBKBMhZhHhEAzbZA94DvwT0PuUxBiwwhnhpBuhUX
-	m52B7AaT9AnglgcXA9s9t9uh5dv9w9x3AiNPRhcDOh+g0gyAliNBzh0B3B0B1B3gYgXA
-	RyGByQcBxBxh1HCAKa56u9uBgz/gqu6CNRHdEdFFvOthIhLBYhHBEAyg6g9hOzqB8t7x
-	2OqNoVCAIxPgsiU4pXt4qbIeWNz9finUPUQURCNTac+BTc/dACLdBdCAQRRhQzMhDhAg
-	wCL2+AwAtgiXlaChnvygDCL7oBFhCgxBfBghpdTgodICJ05BYhaBkhmhoBt8t3R3OAcb
-	rbsRXRYRZbuPzATXeyvhg4hdFiLBOb6AMALAI0/AOT7Bd+4CKUfXLBYeMAy9cM8Pf3ta
-	HXuRLmBcCgGsgQLMPDAqKBlujBgopx0VcMUOKH1cV1WlTBBAk/Pgl/QsJRsHehA/Qglr
-	QAmLesiBMfW/UgWfYY0gzNKg5JChPHvJ3AXcSMonvKHMk1QFNceop8jH1HvCKQTB+OhV
-	fos5GgRZH8ptueXim8r1sPx1EgEex8v8w6eXG10uxZXAWZd9JBOejAidS7j5cBb19gaA
-	YgSg9hABQ7hA1ZUCKGgh8ACACgB0fPbPcCAH4vACCKlWsIBgMBFQoDyCAA6HpOGkyktu
-	t5zuRzOwxF0jQ93u96H9DKRIoozqxYMUAgEAQyHQ+CINEqcmkkbpxQrlBnwuhEIgyZUO
-	iUWjURrtt3ORzvugBEL1EOVOqBirBKsA2tAmuAWvUewWGxWOhvyzM5lrhrNJfWJ2u55H
-	k/qBMpI2y0Ar5gtFkstsnk6FZcLxmtltOQ3mon0R7PZ8Gs5JdHokypVMrQnkwcCwVCCH
-	rnCOp1vAslUgPh8PoGAwEuNyOtaLdlAEBAEyF8j6jVazXbDZbQAmgxkqjrddMzjMxIos
-	z3iiJtQLgNhkJkgijM5nlOTAcjcUv3wGY2pNLJA1sFiNNyOR2GQwEeHuh0u94vJ6wkBK
-	BSLxCQKHnCcR1EiSxYkcRAyj8QhSCS67uhSh59n2fh8n0fgGAWBCyAApKlqap6oguqiq
-	qurKtq6r8NRTFUVxZFsXRfGEYxlGcaRrG0bLMfi0LUtkbqIMg1kiPw8CyDwOgso50nUe
-	A9kAUJKkeNQDgOAqHnqep8AIAoBnoeh7j4QJRSgNQBTKf0zjWOJLDoN4pmubJxm8cB0D
-	cNInKId54HoCAHgWlSWJcmCHlIVBfHmeZ7jALgiK4A5IEqWAZBgEgfB2FhJkwWQXhaEV
-	KhYUxVGABEqCCHwXj4QZREmRg0zKlyCEIRJUIYHctAG/T+P8gjekeShYQMMsfKHDimKc
-	oEQREqarAwrAJK0BquASr0q2FasaG7bBSW1Z4S26vCEoVVyW3AbFyk7c5JXSvACXYZ93
-	A3eA8XkU16LwTd7hNfJaX2O1+g/f46YCNOBkjgo9YOD2EjhhY1YaNeHhRiJ/4mdmKjNi
-	5F4yWGN4mf8zn9HIs5EUuSC1kxR5Q8B+3OToQZcXuYDBmSqZVjuP5ricc47jp4Z6b+fh
-	FoIu6HayCY6h8cx2ta26KWRamQcEAzqJ1QGABYFAQzIcIeVpYmKfUKtKH6xEGRBTusGY
-	ahmE1elgchynWJicVKFxNE8W94ApBgZjsPpPiaJAbB+HoWreeeylOOI2ChCR+Vw/qBoK
-	g78UEgiIomisLgSRRHlYwArAoCYHL0aJtm4cozuGVZXmIlqXoaojBmaYpjmsBAEAMPY6
-	ivoqZWJD1jqlZNl2bZ9o2n3sY6StOlrEsx+vESY9jsK4PA4CpNE+XAGtYLwtCH2Rrmwc
-	Y1DMJaHnVJZZtlJR3kCPYuNiZRzHOdowi6It2AGRZIFaIgQQYAlBIBsQAhRSCDIEAoBI
-	BxmjPG4MAYY0gzBiCTAWA8CYFwNgfBEOYbgpFHN0XIUAPgeAsCcEoHB+BnjRG63YW4iR
-	CBiLwHIPAmzJhmQuAgYIwxpigFKLw8oax4jxHq5wVgendgSKCo8WIPQdArKAAxx6ugAI
-	AQEgRYAqBVjBSUPB8r5yCE6FyBYCgEAphQB2hp36xioPCRE8REq0ETrUeTHWO0d48R5j
-	1Htazy0eNMWskBISREjJIKMx9vrf3AuDcKO5w7ZnFBQA+B4CwfRBijCSEYGgOjvDMGeN
-	sywtA+B2CwQ8RgkhXH9C6BMCQDhjjKGwLEWgxxECCDC6t1qgXYEEf4K0G4NATwkBYOsd
-	g8RACGFKFcKQPphCVE0LQFAJgOBDCADBqqowChSCeDsP8BgmOBbUCZw0FobtRHTFNyIA
-	FeK+WA72NaH43IjWZHF46KI+T3WwN1bQpDVgMXyCZMptVxn4XEAFsA+gw0JEZQtoIIiQ
-	jvXkHgTFE1+h2EVRdZ9EQ60bETR0O9H14Abo+HcNFJWCiRD3SkqgcaWMPSCwWlIe0QC5
-	poC2m1I10iSWjQsRjCw4MmC0ygUdLhD1FAVUdg4eg2VLEpU1mQYKQsdRyx+qRZiHsfRy
-	PKrQ4KuUNaGF13rRyCR+ea01p7UR1NTaq1drJmmuNebAPxsTZGzNonCMIYo1D9C7EeIg
-	MwD0+wubyEsI4NU3jjmcLQBwDQFDuHePOwgNQmhKBuNwbw5p0EPIMQghTlSIESIoEsEY
-	IQMieFELoYwyRryTAsfUewbg0BOSMBWXDrrPEPHYO0eQdQ9ide8EJUoL47TveCiF4aJF
-	nImWlPae5YayI9LIK8WYxhdC9GeAYAoBC8B2DiFMDR1HZCpFYMIogCXcAiBCBgLoWQhg
-	XAsBCxw8xGCRFcPcfA+VRgGAsBUCAawzBMAMAYAgoRSi9GMMga16AMJdHuFkKwQAVAoA
-	9gTA2CMFYMwdhDCRYhtjdHMJ0nZIR6AHARHQMIXAigxBeCMh+BBeDSGoOABaGASgjAyN
-	8cA6ZCqKCJhQYgxxqp8AWB164bAzhMTkOizJBIrIDQKgceiWBIqQHVMVjr1gK3+CYo2N
-	RSlizwuNG+5Dxo53NzNmfNGac1ZrLBc+QC1ZBJDSKkcsVh7E2LsbY+yNkwbkPGWM0bT2
-	RcSsWgqN1wWwrhBBGCIDLXRinJv2BAfI+R9wTCQCcEoHLay6JiAAZw0BuChFML10IDqA
-	ghA+BeFY3X3hbGVoCXGJwijadPNibQO5PDbE2J4XBUQIjwHiPSE4N3/gxstZg/bkCHzr
-	V+ged2XngRtzDPJ4tynkZsjrPmfc/QSbdXBQGgK4C8F4GjuVli0Z80+CTusY+7WSClKf
-	SEOW8w571orSGkdJQ0UnpiBrf29Q5sDDSz0eAleDLPZUJDhQxeGCf4dUcBQOeJBU4oFj
-	iwX+MJTAPu+wADwM8f4EH7kVCQw0hZwx5M7Omdj/ZUx+IY8auDgq80RotYgAZu2xzlCI
-	/D5DvAgBABj3AEx22APQxo+QMAXAjQFFY9h7j5Dtb0RYhQx5cjrcTaSyQORwuTHK5cdO
-	c83LO8y6CKUKD7HdI69wEOmI2Y/F124BgI9AKOxUeI+kJXfAn3WYveB+d6Rcx23I8mOg
-	VAoA85xRuigHuwo1j/RzV9DIJlEfCroFAHRox00Q8SH9rRd1hZFx559dnr2DsPp/Uep9
-	V6rnHqOd895/0E1hR+nD5q0PbtfiSijzS9iK74En9Irrj7we0rAHEP9uA4BwCiHm6wCA
-	TtpRdJj7NEPDwwD+4+p9BPFZWY9rXM9WtdbK2p+rdBKQ+gK7LtEt3CQkvFAeCFPWmt8h
-	LHaDz9oD+/cG4CH+6+iKIZUHRAE4+Ay5WH+oORywCAMY6QicaH4XBAaMaHsWiqoYm5aT
-	OqqH4ZsTO5OZuPAq0HkHDBE5mrA5qYmaQ7Gj+/DBW9WGsGwHEGGGMGq6EC0wejy+22m+
-	69GzI6+9S9bBZCBCCj1Bw6065B42vCFCTCVCXCYKNB/CbChCiRXCI9E2q69CRCkLI20W
-	0WiKo/2AEIe3E3GNo/2/0oE3G/y/YoLDSVeABDY90KI/+aNBPDmH+Ie5sZUqvAxAMYmY
-	+IfA7D25QY+H9AM5PA3EGSuHrAEHRBIrDDo7ER07IzfCzEoRuGQlgY+nCK8AJBu2gjY9
-	CzFB2++9M2xCfErFPFPCpFDCs9LFRFdFfFgRvFNFjFpCDFU2onozLFqKGG9F6qFF3GAB
-	HGEC5GJEdDsrHBSrLGBGW9XFvB1FZF09PFnGZGozZGc62+9Cu/BGrG5G7CbGnG9HDCHE
-	8zBCLGzFbGooOFfHXBBHFCaoCB5HiBPHnGNBREjBVHdHzHGQ7E++5GxFFG1FIzZHBH1I
-	KWFGvCNFHINIXIYzNIJIbIg8/HIuLHNIBHRIjIxHc5tIfIzI6zrIm6zCrFzB69RI5I9J
-	OKLIRHPGjJRJbJcedGS7LJfJmWHJBFBFw9JJZJpJ3CjI3JjEnJ5JfJVItJ1FLJ/KDJ5K
-	HGhJJKRKbI7JNKdIbKVJHCxKjKs9VJ9HvGVKvI9KnJzKY7DKhK5H1K9CPG3LHLRGrLFL
-	THDLLIVLZLgzRKyaVJlLjIXLdIDB9KPLtKlJtH9ITLzL5MFFhLXMHGBLxIvMNMUWtLnE
-	lMXLJL9BzH/KXKrKNK1LrMfG7MRKLMzM7BZMLM9FRM3LBFPESPWHJHmBORjF6G838A0d
-	uQzCgHvNnEWBDNszYHFNyKeWej5MbHxNDG5NHMrIHL3OBGrOFLPONOVOJMvKBOXFpORI
-	FCgGhOoqeENOuCVOyRiBZO4GRO8n6jyYaDU4UEhAURiFTPQGdPUo6ESzYCPPeXuE2YSA
-	9N7EfNBOfChOjL1ObPxGXP1P7QAzRPvQDCTP/CkZgF64wC+WmGHQaG3QepG7SHcEJQo4
-	sCwHbQw303KGiqAFdQ8GlRA5jPEGrRJQtPYGDRQFtRVRAGkDzRcHXRgEdRk4IpGC9RsC
-	XRxQQEBR2DdR6YCDoFrSCBfSGXoFMn63eqKEORAKeZECyCnSeKIXcGe30HTSqpYDiDfS
-	zRIGq3mDlBEHDOyCVRkEcIfSKEDTO/UEnTUCDTYpsBaBrTgF3TkqAouEVAlR/SCFrSGB
-	fSLPARbN9K3QJFdQNLDOLUFUHMjIrMpOTUPUaWrQHUc/DUJCyB1UrHWFeWnTCn3NyHEq
-	BEXQsB3VCCtVG3WCSBlVOE5VSCHVWD5VaX+A/VKFVVlRUFsFPVtPIBXVyDLV2FDV6fSH
-	UDFWC4YGLUuGBWM34pSKeDHWXWCDECBWeCNWjQUn2GNWq5IHHWwKpDuYmB7W6ZYKeCFX
-	CGpXGCfXKp5NsBCn/S3V/RsC8X2FoF/XiFlXmoqBjXsGFXwxmAWCLX5WwHGpjWVWZWDW
-	eCBSyDe8DPsLMHAG8GnYWGm0mHzAkS7YmS9NnYgoPAuH9W3GPUij0XAHaHeHy6MAEKeW
-	WpCA7ZQRBUXOkzURzYdYdYhYlYpYq6e0nYwPBD9DrY6j3Y/ZDZHZKKtZPZSKjZXZ3aMR
-	9ZdYZZg0nZlYpNnZqQobBYzY3MFBBAkKe407DZ7ZEHtZIKBZMXhZQA7ZVKpUZCSY/NTQ
-	eG3R2EBV/VWCGIe4EGXbmCvbrO8GQIeq/W6B6n+D/b9R6DcIeEfcHSTTUEnXaCZcSIfN
-	PWMGAF9cfQkY2Fhb8D/VfSeCmBncyERc2LwF1c8KpNPcSCYCbdInzb2HNdQKJckGTdZS
-	SIfbU/NYnc8F1RYomExEW3U3XPeCPAaHLd8GJeBdYGTcNRgHXXCCFeAGJcyBnc2ERc7c
-	+KmD7elYRY4ZVaeUOHmofSqHTd8HLU4YqHYofYnaeRzaOj2/oAHNgWeKeAnfbPmpCArf
-	iWa+UAdNhOGzXetNnexe1Sre7e+YrfEwZNnfLfMjzfRfUK1fZfcYTfhfkKxfpftbNgLg
-	mLHfyHvf2JDe3f9NzfBgDZpgIWtNORyZcM8RgY/S/NdayRhNOWa4gWrQwHbRZPmobDhf
-	OoHfSdvfWKBfaAnfeXhfiArfm+VgjZZCSXKGw4BTzGEBHXbNgIen6WnX8EHimIfYJPJc
-	MRyBVi0KIYuDNUqB0GbjC4gpOFnjLdICbNO4hTOEDXKCfcpS2E1jjdEKICRjrVLX8XBc
-	bPJckKJGIC5QVX4CKKJWqGNcACjkPAJV6FDRQGCKpNZPMKGDbkkClkpTYCDQQFBkzWiC
-	NjiE1jmKHjqCRT3epD+PANQHxgwHfhhNPe7g6JDAllPhBgojuXA40We47iBAIKoApl4K
-	en7iI9SZVlPlTlWPXlbgBleMbliqtlmjxlqSnlusBly4/l3l6iiNXmBmbm0LJmENRmJQ
-	xlZd9lcHflgNRlkRmRzOoGg4ImYB9kgRfiPexTgBqRoGtnsY7VyBWd7lPbmGWLxnnhUn
-	vmeAPmiAfmmAzmqApl9mwdvfvCVVsFPXGGoELooKpkJPmFRoyIfAVXwGFPIGnpABxpE5
-	eqfk3XaGvpQFFpUqS4kBzokZVhIG1pkZVeXebkOCi26BJS2qFkIE9p9lPi6ZZeXo65+A
-	g4oCpeXRcDyKJYNePjbimEHNTkUqTVCB2C3qvl4AopPT3o647jbPJSaFxrFqKYyEWXBf
-	pp7p+NRqCXPocLFDwPBYhYm5fQldQfoHOHPQk5fETlPDzZ1m2RsXWXY404g46WaWXAJq
-	zqK4hNg/VmDri0nrmiHrrdRrxry7Tr2Svr6PBapsARrsEAJsIqPsMKxsQ4/sU5/sYdvs
-	ds9tbABshZES7ro7Trtstr0iHr4NRr8AA5sRW4JkZiABtuFtYRflOFjuPTDN4Rne3jCG
-	bTCjsY/Q3dNW6RBgMJa/VtEAVtIAltMAztQAhtUARuJCioruEBtqO4MErPiRBqK4cE/e
-	LdFNcn7V/QaGHo7cBhJfBvde3dsn2IfnniWXBrtePekD7pzkkDbbrwUCuWfstcoCdwhO
-	uENvdhJBBwlbeKJXiF+p8obNdvTR/PUGcRALxe3QQpPkyFBNcChxXQVT3pQGuIeqBi6Y
-	iBRwVwbrxwfwgRi5sY/Yhae5eofV/e24JexAlZuH7tcaKXBAUWiWeWbqyAtyjCtX1AVv
-	G5zx60nx+iHyCfTyGZ7yKMbyPySWtyWwDyaK1yfl5yiAtymxnyqXZzHzHywHzy0Hjy4H
-	Vy8HhzAHtzERhnsGto7nbi0BURvkYZVeORuZVdsDJ0ZoCjtS+poFyBh0nnnhrzIITyYK
-	5ycKxyhykjjyo+fzhGBBBETAJteH7V/1MKMZU5jiWQ0Y7EXAJgsn7AaY7neZ+G+pDneI
-	feK4712LDAaRyWiKJEXzWoC5e46IfexX1DkRZ1x10wC8zEeY+oPafae4JQlhhexYnlOo
-	PZzt5EfziRbDMWnNhX0WfqyKe46n64g/UXA9T2obB2tNn2w7T20UP24N0bB2/t73ERX3
-	IK93Mxn3RmsAj3WNX3af0IT39tb3iH13mHv3qHd3u94S72732TPs6LBAbuOFjX9quC3z
-	WRu4IpzS7T8R9p8E9pEBx0Gj5BBohAVVGCtX0Wr4AAL4EAX4JoUKB4OAZ4SAJ3f4ZLY5
-	tAYQioPlPETBA5fAlYhYgRzt36ERk/U/V3Kdv3OK046WiWjAUWn2azZ6KH36ONR6Sq16
-	W6P6aHz6fs56iRn6mXZ6qAR6uAb6z60AT64K9697ZaP7B7EHx7IHl7MHt7R7Sef7WLHr
-	spPhJWb0cRsEz8cWaCr8id7XfQlXazMY+FX8zWGqWDYn+Wr7cS14D6t4H6wsB7r7swD6
-	6TL71LH36AAZVAbYhAbETaf4uH0qwLN9dFrceF90RJd9BAVAVX162wDNg/SXZ0s7D9gQ
-	j9kQj9pNn9t9xA13D9YRh+B+CAN+GK5AV+MTK/V+T+raP+WH3+aH3+evt319u5T9z+oK
-	Ldmpy4FRwjAWs5jwRoyFR5oaKGz/3QoIAhFHAwBBYNB4RCYVC4ZDGRD0NESxEyzFQDF4
-	bGYYBI5HQNH5AC5ECZJIARJwFKY7FwDGpdL5hMZlM5pNZtN5xOZ1O55CX/P4S/qE/aJR
-	XzR33SX1S6S+6LT6JPalU4YqasV6xVK1W5hLINKQEA7FY46B7MBbRZgPYI7YK5WqE/qg
-	/aO+abS31TbnRbffZ1VlTWCvfsJfa9BbBY7JHLVaALarZHLdhcplctl8xmc1Orjc7rd6
-	ZSb3UYW+NMhdQzNUkdYJtdhTZsRnszDtcLcRzuVpuwrvc3CnRwTjwwdxUTxwhyZthwBi
-	cUA7LZ7TZsiBMnv+x2e12+5MZ+/5935/c7jeLj56FBu/3cKmPcaPh7PlCZZLOrY8dYP1
-	KeZ8/C8TyKE8z0Li9SgP8rj3Ew+A0QQ/z6ou+6xPy/awP7B0MQzDUNu28Txqg8qlwJAq
-	CvWgpuxQMkVBRFhGRckQFsKZsZxUMiHmQtTLDFHYlx6KcfvmfkhIiQxXyMTckBpJScwg
-	AMJAHCkKgFC8OSrK0ruzEyFQ88TOtIAEuQM8EsJxFxGDpNEyM25ixoM+z9ybNUwS4n8v
-	H7MUtS1OSZzNNA6T2zE2LFN0IzhCFAURRNFTJOk6qHL8wxKn5V0oOdLEBTEdjEzIj06L
-	lPi7ULMk1UhnVNBUNFxVQ01YOFXDfWDlowgs2oLN79TjRddV3XiET0l9IoPX9eo0QljD
-	5ZFiMpKlc2VObxP/ZyX2MQlkD5aS/WZQ9sW5btvK1YMxLq4Y4l7c1KFWF11MyW92jrd5
-	o3jWrLmzeokXub98yqcV+ImLDegqUGBAjglZJahFm2/hWFu1YeGK0QOIj/ieH4riztYi
-	QOJj/i+O49j+QL8bmRipkoT5OTmUgblbMu+GGX4yKGZO0DeamFm4R5zKqmjxnpWZ/dAb
-	aFkOiaK7SAiAP+BACCQWDQeEQmFQuGQ2HQ+IRGHIGKH+LRKMRmNRuOR2PR+QSGRSOSR+
-	KIGLH+SyuWS2XS+YTGZTOaTWbTePKudGqeIKfGmgTiEqeiJCjMmkUKFl+mDqnGeoUqQr
-	KqGOrHusHCtVKuV2vV+wWGGQJ/2KzR6Tymz2u2W23V20xe33O6XW7Xe8XmGvm+HO/LfA
-	KzBDHCV994cT4lP4sf42xKLILTJKrKXqEOHMFTNBzOYtPhDQZbRaPSXmyaW2XGVajWa3
-	XSzVa/ZbPabXbTBvbkrbsQb1Pb8HcGxJbiVRZLjkWtzcsW812c8A9HUYd9nTrcadKsad
-	vb93vd+D6fwTbY+Pzee7eX0ev2e33UJXfGoGc/fU2/e1vb9CL+chcBhAC3BRAZUQLAAY
-	NmV8FDNBiUjZB73wjCSvvFCaSPVC0Mw0kUMQ3D0PxA7rqDrEhYxMwRWBnFS3ELFpqReo
-	hTroNcaP4ES/Dm2xvx2Kcexs35POCB0QyJIqHQrIyMQ7JMmQ/JcmyhKMpJqzBws0KgNy
-	yUMtgfLq3HdMASzEZUyBHMy6PiVxOTWW02u8fU4DlOU2ltFAZTvKc8wlJEprIf0/oKQl
-	BD5QiCgFQ7ogDPVFu9J9GUfSFIoPExYjJSysD2rQ4Lu6w6P0eziEsu531ID9THbVAC1U
-	8cUJ4NSTqANNJVm2c+SkRlcHrXSIjxXoD1/WlgraatiG7YyCmfZLCBigoNWdO4ZUOAVh
-	Wpar2upXo8FbbbKFUG1vruclxBdchrXMDF0L07YaKMSAeXe9BuXlK7EhPNZOAbfNrX2t
-	9bSjSho4DfyCM4DirDHfmEq4SuGOediIvqP1E4VimKtGcWMCvjQKY4yBRAjkC9UsMgLZ
-	KQ2TtGO+VAVli1PYvh800XeZ22VoX5vi2cpxgcmnLn0tlC6iEANogmaM5oW51pSXGhpr
-	AFvOB9IQAeqBxqwiaxpeta2r5a68MOwDtsVOtGbGzB7tF5G5LoHtGXW30EQhhbnCxU7t
-	Gg15OQ0GDNrm/JFnkokfwZ5cKhACcRlQ78QAm/8cjeokVyR+8pw/EViCXM8fzfOI+fnP
-	0wU3ROzqwcNRHop9LEg6tQe/XY4Ch19llgFQsbfb9QFndE13gGd9zvgITwMoGJ4pg+Pz
-	5+UTpAo+b4Pnoc7NzGshAL+sNHseh7XtoLcRyY0K+2FJ8fMgk1Bl/QKH1WMboEfc1wgf
-	jbIkfpDZ8fuN38mB/ea6R7jm3hpNHpANdrlB+qqAKF6BTBX/wNHBA9GLUYEP0CQtCBsF
-	3HEAW8CMEEOUGO0IAMKAEMhsOh8QiMSicUisWIMYLkaMcci0ej8gkMVQckeUmRcokUql
-	cslshU0wN0yRM0jhjl04nM6nc8ns+n9AoMgf9EoVGo88T9KcVMBlOOdQpFSqdUqtWq9Y
-	j9Ef6Mrr2r4DsJ1sYHstZs9otNqtdsttuq79uJ9uajuqou47vNvnq6vptv7WwNhAd7nj
-	Gw5sxLOxeFxsNbOQKeSGWUS+WBeYx2azeczsVree0MOaukV+mH2o1Oi1es1uuhq+2LF2
-	Ym2pX2+v3O63e83tnc3ALHCBPEUvGCnI30QreUGVzPpS6PKiT86oS67g7PXCXTqT375r
-	8OHYyt8or8/d9Pq1mg9dpuL9SHyM30Bv2934/P5eP8+SQF6AAhgJ+oEgWBoHUgu4KF2D
-	F/G0eoQQoAX5KmFVdIwy4ZggTIcQQYBUiCCE/XUoxxiYjYoF+KoiiyLU5e2LoxjKM40j
-	WNo3jhrT+jsgI9JyP13KhqoEdU/AnkePycRgQYII+TjalBliXjlLDXlZ0RSDiWiVlwCp
-	elSYH6jCYZkmWZpnmiaZqa86JtcIWAEnEp5zBWdYIJieCunpfS6i00p/iAVJQNqa0WV8
-	9hpokzaLKujQpo+haRZyY6SpWlqXpimaajcvadRoXKJGkfKjAKpYId89wiqotasc2LVb
-	BasTPrMHK1ptDyerkd67k4j6frewFSpSwbEsWxrHsiyU5js/kkIMmbQcYpZLjIiLWYsz
-	iqtqNZvEi3oesg1LiZIU2pJK53EAmyrrR6w5oOS8DKvI5b0qUAgbvgOb6Be/Lspk+sAv
-	A5DpwQBcGBnCL+ACcQEA/DgIxDCsSjc6sVFrF3wkG/AXjI78eCXIDHyLIAljUm8nMLKY
-	kus9ctfQZjTzGjSrkcJ8TxK7pkMPOzAz2zETYMR9CDXRM3mVW7YL/SstPXRkVxACA21K
-	+g51DTtXekwdaFnXBk16PSAvaNa7Hc8NmtAmY4N7aw821wDmzfJybhAernJLXBZ1ix85
-	jk3N+tK9nNCTg0NNHhjY4hDRi4utQc3qM5FnMp9rN5DQQ5fDgPPPm1bhJE+eQ+EudQta
-	d86ZRUPsPquoQ6zKofBDdQm8H+04/tmeVshu6JPvCk74RPAji9DlC3xWkNXCAZmAIPML
-	jzgo9DN5/NKgRC9Z/tW7el98jjdseO+Sw0+JDcAPrmzzvIyriNQGvtGX7/agjkZz5TUA
-	u/cHf5hKEr2/ypX/ACIavZ/pCmxEMdAACAwACtr2RgjBCTPyGQRgWURZkDoKo7K2VuC0
-	Gh/rMPhB2DSzIOQegzBgfxWz+DxUGSYeTBgCm3CuCOGb8YalqHZDhi4Wh8Q8QqKl5KYG
-	XnbWsIhMrXgyAwiSYkNjV3zvvDK4gbArIpuDBJDZNb3EaQtV6l4BUTz7ANIa+cekZFUL
-	aFUkUPMagDRsiufgWkcFFjNagamMD+47wDf/HeAEBI9oTIZAqBECiJurH+Q2EcJoQwik
-	TCFIsioTwbkTIiFEkJKwlH8NuTLw2GBnk6cgCkbpQlGZ2MNN6HhBSoMGmBQYOpWt+G45
-	cCCZXJRnNMK97SeBMKjD4lIKsvpRJkiyjMbsxHfCkfaBoJ8yo2AGfI+VgD50+NmHgy+I
-	EwDfHZHAKGbZgzUyxQkYOPIAo/QFj0AGPsfZBTmIbAhz7pAAQTRhCSEkkZKSLhHPWR4/
-	4QSWK3PyS885ERRYqOpxriwxTtmvQpdpRCaCJP9NsULQgjpol8FV8QNGyJooIbUEw7qP
-	yDb0NCka5FvBIEdSgsoB6FozmEjIddMBLUycyoGZkzpnxkHoLanY+aelQDmU4BlLDXnw
-	S4JV76jwUvQBROmPCpTBx7qhOSAE6oBwMVMQ9e0EzlwnIbPmDsk4QyTkPIk+E9IT0Bnt
-	WGE58EijMre+WiaWgcVDrqRAdteEGBdhbD5fAG00RyCbYKYg3V0preKC1XInmiA1htC0
-	m1hIpisVUCKuyCKXIxWZERItE06gVq8UR8rlK3jMqDT+yxrnpy2qC9YIVUpz1PLDHucU
-	fJzW0qnOQiEDXWOikfaCgEjKwSIn1I64U9p/wTg+XGsSO5/whoIlYa9QQ4XUlVaia544
-	Yw6ELdxhiawi3gUDJ0M6krqBwAxegPF6pr1GD/e5tC5Lrn5swjOUhsRfRdakDaWJDU2j
-	oVmM+no+Ql4EoxfI1YmsEjnwWc1/IHV7Wvj7hGc0AJw1YgTHm3o/5xQCwusNZkEEd2/r
-	PJe5kk58SWxPJLFVX573IkSthpgUMZgvxrgd+JW0UCNJQIspQnwlZAUkp0XoaMi3Ru8p
-	EWeSm7IKF3SxbCgUOBMQvTbG5vb6IyYIOmxT5UJGYAWsxQ7sWIKhAdmbKxmymDix9Sq8
-	ARYX1NADhOcZCmGVTnRhScudLYZ7t3IaA874LwaxHiutVzblyPknc6DtZrgz70RiUomi
-	9Hj9hJf6TI22N5FDRmhrD30ABepgOtmeDlLgz1PeoPFFlLvneTXgdtKqWQqDDrQcetoz
-	oCBDp01+WEWD71+3LUQHth3+fKQ2lQE9ktv2GB5FQX6Q67LULnaYyNqwzBHYiPeds9VU
-	z1nicWe7Z4ZqdAHQD+6yD+t/ujEk/tIVr0pi3F9xy4zxKJcWRW8p/nwQyMvX4+yZBuAj
-	wLaK7NqjICtwjhMRMkKVZnQ7flCVKtUd0IZalqBI8Yu4IXBImsZhQ4IaHXqIslCzWxsk
-	CbL17cahfGoPKqEpU5NTxbkBahKc21eD3nPJ5wWy3JhbcJCuf1R57nzOOcY9wPIViTdG
-	8sTYq0NiiS+k+m6S0gVve/TkdmQGzqIJPXr9c0WMr2IiSbBBNU0fCpaUngBEWBLshohO
-	44335RZLFDoX9hL3yJAr6zyitMHE9je/uKMMD34Yhs2RReKIbqB5gIO8lWe+3aF/Xgk7
-	f3BuPovmLrYYgHzwAe4s+zrIliHqMIep700do2e27dK+q9TvMfs+vV4tuV7IomWtMbXV
-	/5BS800PNvZm7QD6wG5JByGsVpQv26MiGPp2aeoMtRn+H70tXez8UfHc2h8uBAl4GIZ4
-	N3XhfDkP+UykYVQVQxd+qUfAAsv3vJsZ5iAdr8K9Etr6IAXQtvW2zzH8AB5xu9Wl61iZ
-	6h651GAaAV1Z1WAcQ17RowXFDwPhHIYM3RxF+wmF3RL5x5jx3grcqhFULGCJ98sFgJyd
-	gsOdGBwRSgI5Q52VYKBgVd9cekfAJ2DaCgCqDlqsQ9+EIZ+MHsRAsxRFmpFVDqBeDES5
-	tMLlwZUlR1bc/t/VnUnF0MANt+FFnJ0RhwQxz9n5oR6yAxvF7BPVu9vJWl7Z6du5cNJZ
-	6uA5pBvw+VwBwIBGEgmE7wJMs5xxx4sgIqHw+lZIutm5wB2Z2FwZDFwkIeIhwyHQT+DM
-	aFv5f5DgOxZ5egBgLyJYMmJhLFeM9kQ59lzYJRC8eEGtmYA4RBC1Lkqhm5Rg29NMrEBY
-	xt5yIsRJMZYRfqJRnOFdhCFlbF6BHdnOE+LqL1nx5+EFoWGSGlieASGuGKGBWyAtcB1C
-	Md7dBp6s8dCom8zWLIjNC1rQGFNlZJrkshCpZR81R0utERf4f5719lqBq9GdqWNoTuI0
-	ZtFF+8LIqgRAukqgvZQdX4Q0oePZ1sRNYh91rEQwoM5KMFv4RA5klhsyPEQ8r1C0kuKS
-	FZ/dnqFd/uFiFVheFxOaRqE9uyM11J7CG2Ad09PWAaGZWWM+GdWiMZIk5SCgEOTQ20Dy
-	RAiItguRlJjplUsly2JE3IwpvxQczENOBgVshchdj5kAEqTgS2PMYVvxTsLYQ1Z5LFq9
-	9kQ1qcDNlIQ2BJLlCo1BX4kU29v5J9eNwyLRMQQ08lUFQRCohIm+OaLIVtKgIIhJ92MF
-	nGRqLiReRuXwWFhKX9t9b91cdWSmS1oeNOMqNCNKSt1BpOZBCR6uCgN+ZdRh92U8gRTI
-	JZe4H9LlfEv6CgecCuUaP4v4QB/QIJQRtQYLQgAQqFwyGw6HxCIxKJxSKxaLxiMxqNMa
-	OlePluQoSRgSSxuTyiUyqVyyWy6Fv+Yy+Zxp5TZKzh9ToiTwVz6FvOgtShsqigejmykg
-	ylrWmsynheok6pgqqzp9O2srmtvGuj6vkGwumxpqywsl2gRWqFzZ5U9mNO4g65mu6ga7
-	zS83q93yZvi/onAyUCEnCgLDgHEgPF4kA4fHgLG5DJ4/JZTL5DLZnE4/FgPGwvQQqY6R
-	/wJ/aR+6rSzHT6p+6TT67V6zX6fU7TWTF+bzda/farb7Xc7KBaSxulucoW8wpc6+9Do9
-	Lp9TqxKgvMydqDNpWd4R+DreLxxQ0ea5g5Feryez2w4o/ArfIs/T3fb7+Ssu0ufzsKl/
-	wbgF+IDgR+GkgVKDBgowIMCWDnwFFdwGVd2HYgwwDkhkQ4bDiHSHh9CxeiIHIkVc+YnP
-	SKToistothIeIwLSMjNjQMI2EaOIShRQVtLiPn6FCQQvkOCJFkZKFtI+SgIkyOBGQtmG
-	RYpi2VY2UwDlUAWeY+UGHZ5mpWldlGiACB0NbpsXFbg/XCaVv2tmqcGobtvXDbBrGzne
-	bnEQKb5obZAn6NmgwmoV9BZkeiaKotfTRo5zhSk4kKTUcB6MpdGHKNwN6cpoEafpioUX
-	JSpDQqYnKoqKqqMaRgSJkojyirIR60qutqqmat0LKqvDXr6TgpsGOlXTqKT0NuyDIspP
-	grDuzllJoE7SfwXISQs+7YhVQYyLQ9reG+4HeKw5bkhAJLnQuxLFikzrtNW7w5vGTq6v
-	R7Drvclr5UsDFhEGWWNl9nGYmEAWDwRjcGmGUb/wIAmhmFMJoaZxp4nE/6AnOe56cVsp
-	pxzHZym2fnAmzFMXblpDwyq7zVB/LhgzC9cyzN7rQHrN75JZ8hWzSuhYz8LtBzces9re
-	vjXErSTf0vRdNeMxNQR8V8wGAgtWZ7TtZdGub0KPXje2ASNiWoIgF2a6rEpox9rucJA6
-	2+siiVEFxT3XZgFum6z0VeLS2dgZ+AK3gjs4TdRT3Pd9oVdcTTqY0Ay5ATeS1rlErOfl
-	7QegPebltiJXwRnZU56VsBY7o+hZ/Cun6OZMEQtp8RxPGW6xztMfxmee2x+a+6xjHptm
-	vsEKyo8MsiQHBj8nlfL8xEbGGb0FDNTgitg4JfNoq7TOEz3KaVUCvYowGfjR0xgh+f4f
-	pSnhDsFr7onPkqPy+MGfq/ZFNcrpWy5soyJDBeDSAJDn4FXe0ppZwO23g6EXAxCQVIHg
-	JgiQuAjekfC4IW0MV8GmWLxByCqD8A0TlXfKhkcjYgkKcBu/eFZCh3QuEnDB74QoZsAM
-	Yw2GrqUrOodAl6GzpkpQ6dXEAzRDkuEKeEmViTwCYp+Y469PpwSBRPH9E127vWUMhZMn
-	mKZrx3xeGxGBsgXYxwsjKrdxjhggRqElGxJgCIzIEVoEdIIUA0x2jggiMYXSvg+DLH6P
-	EgEzkxELIRUglBSSIJ4ESQL6n8q3HBJAUMkm7pOAXJZvI+ovDvagMQ14YZPgelCqgTi5
-	BygnlO/8hxVy3wles+4LQ0pYwaFe98IstlKyYHVLptYxzGhql+tICcjHmrGEbMZSstgi
-	pZmW6NzsQ2GulTBDd1Rm0rJdYcaMmRCkyJtdi7VOTv2LPBZMySJbJ2Su4YtN92THl7jr
-	WQNtYIKWdzDnqfgTs+A7z6jYJKV89j3IXDFQI7hg5/ntFBQiCz8hUUGmGgoYKh4/BlD/
-	RSI1DWaSOXo9R6Td5Tgne+W1TRvB+P/joQtFY6FoGkA1Sx462B9wlncYOX4alPgRIXQg
-	UA4adwRASoUEyEniNgG8a8HlRkNhDou5Sl4hqmmejlM6a7pUs1TdYw2Zhl4imTmu7Ehx
-	pzGxIY87qK7G4tVmd3FlkE7GKxUT4xlP0uh1DdrmjYGAT671KryXketfI7Bpe09Sj1ej
-	xg1sKHSw7UrBnihKDGxtcUyWKfvXFQ5pxT2WAxZiyKq6Mq6L+PhbjLCKHMBaWgJcuCGx
-	gGwLK1Y97WkRX2hBshDljCrtqOK25FLCg1qgYuzTTSRiENfHJu80ZqJRmlD+rDDAAzXT
-	IY80jrojxSkEaWKdYpwVsN1SOsdaZzRVnTeCdZpBx3kvKh0HEcrfXqIsyxw0CicCVp7e
-	s6Irr6iDvu9qyF8y+0/XE0EF1+37GnvuIMTOBpECkhmELAKR7OM0O4LrCJ+rGgxnk9Yi
-	52FHDRlKY9AIG66vfIoKXEamm2mktaPcc2KsFObB7gxmYl8Y1xgRTaHgAqqzPdI6LHKY
-	2D3MIUZQ0lFiLq5iROa67spzMirdkhNuS09MeZGnZTT7HuBMBnljF+AZJChDnl5WEest
-	F8NfB8FUMBJrzzEX2v1Pw45uzU/YX2clqHmDQHzO+Q84HWwc0WfAnYS0CDEB3QZ7jsKw
-	Mbl4Ob31NYjFLTYN2kM9K2XEyx/7x8esHh3NOIMQLlmUYfNYhtFsHK5yLWe7hpbxXYyT
-	OTVbGIpu5iUcVxlfB6yfDDKED2kqlYoLqGuXl9RXTy12Sk5DcyF5+wQL/ZexC9ripytx
-	y455NZl2a06lDPwsGDFNtwhAFtrNbm08vP2gKBaDA6e6Tgvd15lCru52KsDsNUZcB/cC
-	ihhb42WL9sk8sfJax3c3TemMbXPJilmrhDb9EMN1V7VqaKw6uixOdiWrK1MkyROO8Bbz
-	Xh247fLe0gGjwPCplgGYmOT4h5AReSA4HzghapRQP9RgebBBtzblRK3iLcr8eid1L8+c
-	4VUacQHRJR2WFOD/pPQSX9AZpuRDOgdznuzPC4d0r8LkN3WL2Tlda7hP6WgU7nRwH9kg
-	VDgzWnqrQ/39pjgOPwAcK1BV26kU3Yu6m9We73Epw3hrOQt3ydjsMsPRm4OPYIWYI8Kq
-	7QPhyMLi0C/A0jkAZP77IA/xpF864GEyeg7Cudz23HF5hnovPSrUDb6hofcfRkR6avQ1
-	4nvY4qHM4aeTWC9GkfZSil4s/er78LnkAHVczoSUgaelgGvLesOmVc9QijT1IUrETIHa
-	tNdvqxjbIRh5r3QYgRDUjEtYXTiTqnU/FE5eA4f+biqa4pwlhL5NyQTflq6rmN1ttfmc
-	4o0gG7fAwj1ALIAX9BFXzge4BlIxC0bhj3qAbQiIDoAxDnmwcoEy3g9hEXNgNgyYGoED
-	Mm0jUkbm3ApgFII3m2dXWmCnrHriqx3FqwsmtRDi+3XjbRLlKD1D7BDhjYAQLCkBEVIy
-	0E7hET1nXklgC4HBeTXgo1Qz/3yFyGOGNlzn1X2022/hiVWk2H5BDkjnEA/3eDGYXWqG
-	SneX62SF30UzLB2DUgKIaoRilxpFow1ocFPWMQlwjIdVoy0IRIbBEzVGXBETdxg4FYeh
-	DDSQSnWhVxDm7gVSvAqognrxqgfokFOQkYkyIgXmKIIwFHLIeXh4KimCNAzS3BCxBAEl
-	Nh+jxBCxUwTmFBKFOw4YSBrwDYsQFYsyxk7hpEKUJ0U3sQnkpRgz9Bj1KD8C+1fnKYjR
-	KD/T+4swFXJVx4VHa01HboUEQIVncwABj1X4VU2YXI2ndRDUTo2mTXDnfF1icnf0UV4H
-	FxMVnmGhj3HQdi1oxiRk/DQ4LxCiEnRAgAeY+o8RFEKRRQyhDkbjZIGgyS+48XVT1nVR
-	Dk+gd4DgiI/DMj1EemKBC1PWt18HjYnSih2F8D8C/V/xQBQWGon0bhSQbImxFRr3JwmD
-	7D/2LRnhV1qX/hpzyQY2HoyBWx6HXooxVxXQ8Qu5QE7lJSQZEBGyxikwkBp3My+3aWPE
-	QjrWm3cn1IV3qxDyZHFHdm4k3Y2oYTs2q2RydoYHDhp4rW0lo4PJRSBEpVP4gWohh1P2
-	Go8JaRC1mAGByBCz3153vQs4xZRXWn8mKEbkxgjVNJcytyTlD4hxDUbknHJXS5GiiX/m
-	+h4AIzhiww+i2g82+kpUikCBFygw2VC4oy1B6COw8xVz/TLIOjhisBbThplCEh2Cxkmg
-	sZtXHHHkEphhFoLQz5vW9E8ly3bBk10Y1jo3bpUncH3hGESI1WphsoXX4pXo235E65XW
-	qCflL2GlIz0AZj9Juh90ilD4CBE0yWEQuphhpyEhrz34iWfnt53xCpJouzd2XFJp8CjA
-	fZ+YdQjFnhFDbTR1BXIJkCR4izRywCwhdzaCxh3JBJqzdRF5kmy3JXM5cixhV0JT+4mG
-	gXziElfpclLx2D8EFj7AX6JQIKJ59xE07jORj15x6IT1xpxoU4zo2ZxQAn2oV4VmpW4n
-	DQ/oWY5Y3JXH45WwAJ1l2VaTuk5nLFKKJwIKJQX6KR7D1IlZbZyQAYsQDVnkCoSDx5hn
-	oVPxj4+geZ+QfaUUqhOoagKG0lD4GKZiiSxkr3pQvIgC3hr5eBVYBgezQ3KqAyRjcTSw
-	30JzZDiTig+jajbC5xIQWxF55kvIGEAQNKhDik7kFi+2gU/C+4lTd0mBVyxn/oHhH6aa
-	bhEpvJvVNlupTaMHb1yJyHwZUHb6P5003H45zp0I4FbJWVa6umqDvFbCxloRCpNWHoKR
-	MWtWtZ4yAyxkyUOEbkagQC/akJchKBgy+z35VSl4FR2KyB+IcA1jVI+IhB1iEqWEbi9B
-	pIFSxq2x4xyH8ltQq29B5BjVPS+6m3QRpKxlfK6hKRr0sQ0iF3WopxChV0s6wx961BS6
-	1qNStqfSRT+z/VdZjhDUFA+kBhykCkyRFzjptQsW9EikIQ+RV3LI/5lKipDlLzhnyhCr
-	Ez8D+1noDIo6oxET8DORbW521ZU32Jyn06VqrYUhDK1xE42Hbyuado3hAlYH64X6R36n
-	fZ0mKK3RV3M1SHSxpz0q3VQ1L1vkblP2FKTSRj7I/zRyxl8wELZaaVurMCRUJYn5oJFF
-	63yE8lulp1+7VRQ7VzYLWVmrWyhbXaKCobDCCFQ4SDd0coxRV4FWcgvlI28zLhF5Pkhh
-	r6zoyhDoFW+mtUJ0Ka7q3WuUKSZBVzR5oImFNLQLMagIIVI2uVHoTqNLOqNVFpVXwauZ
-	VxrJzX4aQpz7Ro6LS3GDEixpoD8HyGgZ724HLBTQtYN6MxgyErr7CqM4OLzbPBFhjYnX
-	4J00jqOxpT8K+plIqR6B5Br5QAuwy740SLyhd3B7znCaNXCrpLzwAb1KPHdKQYWF1Brz
-	8ESBnkKWCrwx1YFS3DRxDhgylarr670L7L0BFL078REr1btZ0zsVL1L0SD30ioq1mrxR
-	TbyKVr5gBrzKsL6bP8BsCBEMCsDxE8Db88DhpL2hvBDr3BU73iibgCRrmocCEqaVPR2E
-	8FL5ZxzxJww8QLiRj1P0wR2CmoFTc53BjxbV8BV4ynLhpG0kJRC6T7XrMRGH9lC1IylW
-	9KWCErO2oG/hEZxBLr2KsatnC6QMaX5Z0n5ycmKBbYthMW56irc24InzfRpylWHkwSlR
-	g1VGO1yjA4znCBEmRn445lZVbU6FZGTxp4FVcRyFI4RG2aXR0mKHR15RjW3jc6WEzjCx
-	k1xVyUQrPaOREMh6Pl0laH7Cdjtxshr5PhyB+hpKTW2cdhfR+mjUmhnpdYyi+zpcwEPk
-	znBJw5yrscp6tJYZXzFn6V31L0mnsx2BC4GEJ77ULMeCLcehR8fC0sfhJcgCWMxcoxl6
-	NMhREcqBDl336WUY53GckEuskhvMlDP8liCMMyRWKILVqRFGZX8q5RJxp6ckvBFGHjhl
-	NhDnLEsxbRESEhhQSVdcVxKV5Qt9FG0o8Rj3kyTq9W9lqR/wqRCz9GuYkAfqgBgxp2Zd
-	I0bsw00GO6rLOBhyuXBcJqRRAiEGwWjThhnmsXFczY59Oz8H9hbUbpNYmBexp4SHLCEl
-	P1sB8LKRDGVjVMn0PUOWmJwTDdMdMMC5oC0CHwh2CC1FI5XV236Fbn6ZPn9hV1HjUs1h
-	G4FQm9bzxIRD1l5QdddbZQEBCxngcNe0CM4HA3AlW8IGo24hpISClXJagGLWqg/9YTJl
-	39YzGlcYrRp6znSQP09tHR/9ID49IokNJRJdJ0H9KSTNK0P9pb6KNtMn3MCxp9Nl9dOD
-	ddOkUMiiecjhxSftQFc9QiTNRIIyBc9yizR39h+omJlKohenoTRxyB6GuVdcxxDGKD2k
-	pVL2Hl/7adERLBpFqVQ5PrY3QRgx6Io3k9d3S4FYkwkRVzx3yBj9IzgAZzZBj2dVEnZi
-	YjozCc42Nshb124ixkbqitbwmyEnGdOxpNjVb45yfhrymjxImGdb/BLG+n/jd2Zc3gBE
-	enRxjR2DOzfT32ONp84rO9g9MyaxVxnjUtHn6Rp9kOA9s+BSdRpYFTR1I1pakBe9HlqY
-	RKaTd08K7o+Bj4/wn+QYu2mNUk1XaKMqNt+5079xAhb0nHhXfF38rtPU6BrzxCmhpHUW
-	hEcN5ok96SJN6xh97TgN8Bh98kft9G/84UQN99f0P9+sCyud/STN/9b+AkTNPuLRrOBn
-	GeCRquCzKuDR5uDx5NwN2Oh+iHjacgxejB6FHjCBJWdwfFfnLhnirkCEfGXD2kwY+DfT
-	Rz7G3iMAeBj0/DLD1ukh+pDlnkyThlNCh3hSEGdWZzRzZIEwcnWjjqgNd1NFNi0ECD1j
-	GFL5oFnpnSzhLrjypBr1HsnmO0elC0OCh4uxV+QQnx3HM2dQge2YRIrXk1NIrUhlKEJz
-	VMQAw+GBiTVEwYi0wV8DQyzIcxyFSDO5+xjVL4rUDAixp5DOPhhzHD7HLB6H/OhBJ3oe
-	1BnmZVPRjymuPXRBjz7OooSDLK7nod7mCmvh6BbW2STu5GCD8J3Nli0Bb3li4Ab4/yEm
-	wX9p+x+oIT8IlYGJDBj3Lixt7lcXm5DDGBr0pVKGuWt0eOi+jRc+jxiRg+kulD5+lhge
-	mBX+mi7enHROnivuoBCOoupEbOpiDuqBWeqhf+rDderh9OsB8OskMOtBautuuCpuurZe
-	vCn+vizuwI5+wig+xBPJnh9+huifePeW1pgyxqaezEOaZClR6DxBbUho/3oWt+1Eblnh
-	2KYoi0bhpz8KT2Z1HnLKWEr2XC1GVrG22WfrxmtTUi0HLnVX/lwGwRj3XpNTObSMixpE
-	mn9nv2btzxF3WknFNjZN9xnjhnMxjaXyhddQdd50ck8o7mvmYEY1SFhwdPwJSGdXLmvn
-	zutnMYytFAt4Ooc3znI4i5DGt252iaZHzplEeo7lEhp4u6ZHGVIzR1nnVyDhLmwTjJdW
-	5yWSmlwHJbdQ1N7kyYDAjhAEcjn1BDRBlXCB1Cl1DAdDjPEFHEi5FE7FntGDrGk9HCVH
-	lnIG3InrJGrJgPKA3KmDLDpLi/MEnMnpND9NkjOCPOkPPBPPpgX0/QlhRH7RidSH/SqM
-	/X9ToI+pM1X5VDXVgpWABWq3XK7Xq/YLDYrHZLLXUbaJo9BRbAbbgHcADcj7dJQB4cDn
-	henlfEpfmVgHFgjDhKEnwRiHxinnjDzjlVkMQCKc/nzlqBMknPhO4M7bgaWtCodHFC4T
-	NOsdSWNXFk6tdfJHqV9mmtqIdu7tywt2hN6rt+AuCT+GY+KluPcgDlKZSn+7+e3eiDOm
-	cerwQFZuz2q3ze33u/4PD4vH5PL5vP6PT6vX7Pb7vf8Pj8vn9O9uXdmQJ+hf/LgA3Xf4
-	e4CFGBAdgY94IHqCl+JQqYOOaEAQhKCD3CyFn+CSGRIhs1odKeH2xRodW3CEzYmSAsxu
-	iqIjti0VYvFmMRLjMso1bMV0cJ4eI7G2PYGB0zJBLmQwikVlFIE47JKIGTFAL+T1WGtz
-	VUPxy1Gc2HTWYo+GlCOXnkTgkV6PAJplZ9/oAXBoRaI+bVbOGcJhiia4ZCRyX3GKeWjK
-	EkJ9BGf2GBWgigoQtKGVuDAlopWAUTwhwJpAaqSn8ESXpYiqYFOmkIKumhTg4qVMbUmg
-	gqUvKncUYwcqupy8Z04Fbj8PazUyVlNU45K5Omuw5r0Rq/eRlKYIplj5CuxwKslyX+SI
-	2yis+KhuclDC6Oi1hvtgXraDO3HJrk5CZuEZbjK+5XJQYaBmuoqLsJK7nXasWKjoYtLP
-	KKigliKrV2Bq/UsMGnnHJajnNGTBiJwgacKoQoLCpgQ8QnuOx4A/FWUlRzVMq99xFx1C
-	g6fXIVifd+X7f1cJpAOAh7gQUY/hSCh6gyoIQOaEgQhSFgshiGoch6IEkiKJImM2KLRi
-	yLowjKNI2bOOcTj0bY/kEzJDLmRQikdSJKOyTCBk6UFWlNVK2liHZbl2X8iVx3dr27b9
-	w3Hctz3Tdd23feN53ScDhwx0wMWwKH+stcMrpIaokf6bSPx86uOXiMxLNrk5b1QBuXRA
-	Zys5u1jofoBH8C8QujKTpWfpACa9DkBesvGOZrigVuyjknO1Crtw77m7Co6iFGUcMT1M
-	HDwwS8UTfHZvGZXUtRmUt/jjqD/0hA9R4UYPYi/Z58Lfc5/KXJaWoODXK2hejkhfoHP6
-	gY+yTy/C78B8/Icv0DH9kuHSNyY/u4SZZ9w4f4Ar/XiOWArmREQIUsJd7Ii2WitgenkM
-	RAhHOofwdUOLi1xhlJUBtCjww4HJgQIhz5lDKPKH6i0do34Vu3BUi8Kp5DnjvXcJJ1gB
-	XQuEP+cFZpkBVCCh+dctUFzDOHNaf53YXYkvSB+LuJrf3qBAFxFJzKoCtwvT2v804TF6
-	GAGUB6L6/F/EsWwG9gwZEcj7jSqlUZpU9lMGhHBcorx4x0ENHaE6tjKPQHHHx+wMUkN6
-	Pg3xvx03AvjACgFATh3ElwcW41x5DnIuTG05VILlwDOZc2Kxzrn3QujCE6UUjp1IOqhs
-	64jjsCQOyCs7R2zuHdLsd6gh35w3hPEeM8gn0J48K4Vy9CJcUG4ttkDMSYsxpjzImTMq
-	ZczJmlfG9NAiQozPuBhydd+QfGFBpS8CM65rQFzgeOE0Qc5C8R8HHBNFCKESK7HSYZLb
-	MQLTyKYwgRMcBoMCXxCmGgSZ+mvFqzEySMQsk2D88UCSVGVtWK3OIyhqRYyhmlLspTGK
-	KFUPu3xwKNzwmCHEYacACzNyHTQcF8KDqSACSjB9KhrTPnNLQI1zJfB5AZpqf5/YmF/u
-	1E5QeL4HpsQ0GnUJv6JJPsCpgkiCNIEcs3X6BpaLE11Bmg4Uxr0Nn1BzOY8xW4/imQym
-	gN5fCazySDUJSBwL3y5LNU5OQQZyStpIRqLKLhgEKA3ru5mKCggKmfB9X5w7Aho2CKYp
-	5T0Zm/n3MIGGSZdq7g3qlAx909zKT9CShsJCa09pUMoy2qUn5eVdeaU4+8KxvplBNQOZ
-	x5KwTSmoWyaxwZsTam5N4i1IJxVtnNHydM6hZzsV3O8xU8Z5lGnrPefKip9rusrP+gJi
-	KB0FoPQlAVCytUNKdQ+iJEqJj/ord2i5uaMlso23CYdqrz3ovTeq9d7L23uPadEbsobX
-	AoOS5+2AAqUX6LiXJrk8gLSXf6ZsGmBK9spOvHQeIE8FnJOSlSFNB4TVbOaWqS5TEx0g
-	tBCUpyrYCjlRu2MfmIYT4Jvi1iJIXTw3xlCXi09+KRsoODfuHR2CtNcg4ddVJmTmqMZS
-	ZSNI+zP4NLkYweZTKQNlKUVDIB/ioPXdRVof+UUqUwY6EVwKtSnZZtCP3BI3MvzcNKeT
-	Fbpi3GbxffyRGMb85rkOVAqGPTgo3Q+KdKjN5DoUWSAqGx1ytztYqA8/2USmIUyGAGmc
-	lzuUWxFVsyjh4GQky1aLLhzYZYmSLii95ZsySiLdNUuV9y5YzwPjLNN/p5YBXDgPAqgt
-	SACwTgsCehsHotwiU67mFXL4XL1hnRuGzKYdgLiDReI6t4lOjieJMwilaa2bs7Z+0No7
-	S2me7Tl9K05qxpjDbWbdugDFNuCbiswe4zzRjTJOUtJ3eym2TX+kquFMWov9/BksQ7u3
-	emOsGycUng04XhfGrjrnX1Dtm+x+r8cEDvwprzN9zcGAIck6+W7QbreXd9KuG8t3epws
-	VzNoN2D8y9mBL2Yjx7WLdafbB/nvcC4FuXUB+uW0pKsqPlW3jr1vK0c3dFm978VH7sXd
-	NXERV+B8r8IzFyqXcSpyIbm+9qFd5OA2tGpQB8O1FzfqrKdwCm3ErPl+2dXbo410rCei
-	975cVtvIlpLt69n3vrseG+tMbKvLszqHeO896733zvreupaf7D1rwebNudW6x4fwXhdX
-	bb2xzvjOk8t+S4tyDtHk94aT1+UzY43en79Ojiwh3AOq8P9L4jxmaZD8E9XwfxHpsG+P
-	hL5ePO7+llU5BxTsvQoTpjy+NzMJFMx+gzKA3lPhD/dg4JSjmWo/CfMzXobCXF+g8/8t
-	5Hi13vs+60GUb3uX/Pd58Ba/0/x+s+Fhzub1Hiewex9p2nd/Y/sbt3d7P+HcCjec/A26
-	83fv+/+f/gAgBgCdRfDaddTFsbYfKFwJjZxeLfleGfoeIbbaGFbeaeZeQdAa+D+faaMe
-	7bEgaa/gcYJdzAiaZefXyOlYtJlfpctFbPXM3gKeGfqgRbZSHgUFafufceYgZdCFMeXc
-	feUhBg+dxXxfABcfCgogGZnfkfneIc9D+JnepfmeqeteKSHcygVf3D9FbXec8fzZbgWg
-	7g6fuVfTQf6dQfiAogJhVH+gMFYfqgzeugShSeJc5AAhhfWg8dkgdc/dBhgYbgiR0gkg
-	mNvf8gDiHiIiJiKiLTJhpbmKvPoCFUHZFKeBSiWX4gshNABbYZ9FdexcTgahPTSJrg5h
-	CilVchhb5hmd0b8Hfb+EOJ1eNdVPuMMX/JUNRR+dXhWfQcwcQZDidAATDhddoFOJUKvX
-	xdFf1aUgag/Vbfee/ckfBcmgFGfhLcFi9HNCbjaNUUgaAXRPFiygOiaauaGjAfta3dmg
-	9cWL/PsAYAfjvh+fXg8gcWghlDehnbUiOhMH+iQPoiTGMiViXhMiZhXekFyjAaKD/fue
-	5cYD+ijGhinhAg7h5iqj3isbLD/iMkakbkckdkeXwjUcoJlgxHJP0ByQaR+IUQaTSUgc
-	IhVX4icHBFkfSh/buJUZzIfjKjNfTjMcWkVj4HZivAOixbeYOFUWKKjUHDYlLU7IMkxA
-	CkkkHeEcRkyFga/HNifcWGUDElcDFleRkjxkTjok8dCK2dNhGhIXzkiAmc2ADDSlvZ0Q
-	MSXdcFbBgl2hrAEcyfPeJcyh2FefSfSXeYhJhPwAuO5A7igllf2jLmKgbe6j2lAHjR2C
-	GKgKgFqKpRmNRBBmbN/IokghJGfWnlRABkmkoP2kqLjksTgkui+YNfLkGiblVFik0gXk
-	2FUk4Cnk6jylhbok/kXd2kZiHiWBSA2nFMTkfnInJnKnLFbdSGbl7IUOHClnTMplLDYI
-	/ZFU7PQZWYoiRQ2DXngOqRkCAnkQ2DUnnmHkmDnnrVBVCmbBBLRLNLDJjMtUzMCcKB3L
-	HArP9TtRQBUn/JhHJGUOZkRFKm+gld1iugFF4lEl8dVDLoQDDoSMTcEDJoWmHoQDLKgZ
-	AWKA8oeLRM3N8QREeBKVSKUWlRmokDOorGtVgRkMQBDC9oyU7GUIiMCVgQiQpO7LFBbo
-	9A1o/MrHJmHRQjKj2lojTmgFuejcCcEU7NYokHXZAngDXnFA2O7G7DCGfkmHXIMLFJbG
-	OB5Z6J9CQJbIUTYQtG/CuFECwZFLDjvAfKjRNC7UgpgOHaAjaCbKgL/UgJRFbp4TnTYV
-	7lhoHiEHnJRMCorDOUzRQpgmTX/aALNmflqANnPctH+nRKSnTClnVlLnYGMnaOOncRJn
-	eOspTniLYnkCAnmnoO5nqnsLuVCDTnvnxEinzF6n1F8n3cKn6n8K7n+oAE4oCFOoEmLZ
-	RqEoJf7d3gDnDpVnHnMrPbOlxPZqJQTMTUuaLA4rZGtI/rQiMdSfGjiNUpYMxg0HXVtF
-	AIkIiQ/CCVtWVORYoJhNeORTiI3GZP9Tin6OZQXI5LxmFQBB/TYUDqaMrYoQcpgpgQTN
-	YbDgesMJUUziDrIHbdSL4msKjTcWVg0H+OHQ0JbUFKjRQQ9KUUDT/rZA4RyUHKeC3sqo
-	9Bbp4IUJrVyGlQTZAppOhlcDERkQaUwFqVtQMPANeQtk7HNH3VgpHHisTKKhUl5HBJRr
-	rjtYzOdCVtSKOlvDSoyC9QvB2tappDPtdL0WKQfVyqJUPMTVYU7qJMCTYVtpjDAttOfT
-	3PcAtKlAgJhVtT3tXnDNRP9M3k1K2rHitd4rfJlauriG7rkhymxACrnEwrpEarrrtT9r
-	vRJrxJMrzPHr1Eyr3PHr5EQr7Ecr9Pwr/sBIxsDICsFEqsHGOsJJFsLg6YhsPiroIuAN
-	riGf/rMnGI7M1VYpYn6n4owYoPAn/BUFbSaC+vGMCsqC3T1VgdFpjKMrdvQHgrSCLrUE
-	CL/UPFbJbdFmFU7vRiJnOE+aGH+nWGGOLcsACtdDPKrAcMxShHXU7J1C2vyIiU+taB2L
-	oJhMxU+QXOHJRGbFbNcRmUwRymBFUJrTSssJ7GUGtpvPuFAvrhPZRa/gjuxqFsSkhANo
-	Ng0Q9FMWKcyKtL4TSiRHXLoUwQaQPCtHXMtVyBQwtIoHJRaGGORWOJvJwr/GtOLfSlew
-	7DFPAKjrrGUtNQ/QfKjk1g6ectGYqgFN/Yuj7FwpgssLcAzHJFMpYIUOfMtHXJrmTI5Q
-	MTnUwLRKjOLUdT1WVMCTcFbGxSfFMLxZbQ0OhYeH+JIJUWKUFGtF0B9k7Xet/d7vgAnv
-	iFwvkFCvmcxHBvpvrvtOlvvO1vxvzEav1tav4E4v6Rfv8KSv+E+wAJKwCFowEljJUwHE
-	SwJGjwLEWwNJPwPKrwRlaYbwUkWuykYiIu3A2MTMxJbn4pyiRJZt2RwppFbPAE6BHTat
-	xQipVkmIkVtvezKFmvTvVCOvXGpFeOHFQo0FOUFI5HJTapBFypYKONUnvKjM3zdE8zfm
-	bzhISzLNvtIAlUoHJFQRmQMtzQyMrIMMxT1N/pgIiT1n4Qcv2TaQ0MxQckmsbLuMrX/L
-	UM6MTQ0OoCM0NQfyhCjJRKOF2x4JRtSCVl2BgjtXcfuJjKvmRFldSW0gPSTJhUwaASTG
-	GQiVYU4FbOZGGUDQ9HJKeprKeUPHNJIUPUDKgGUTSKeKpTSOdvyC2J1w7LoLRIMJUBs1
-	LQ0QaMCm0jzmPHPWlxJgnShN/J1gxHXwoUdVYF2wcFGOhw7QfKvShYoJ7KOTnQTLRGtL
-	DN80NCMQfGtKOYJpyQctXv2ttDAH+oZmFOoL/JRVgdcUDI5Mxh5lmR0Wl0gbQzrztFyz
-	vMGzxKlzzICz1IKz3HTz5Eaz7cKz9taz/Lu0BEq0DKSQ00GTy0IIW0KLu0M0OPD0Q0SE
-	80UF00WtS0Z0bjp0dF60fm/iFrKgCyzMTw7OhUgWCDRR+UzM1YEA0NcFMjtXxUgNEbjF
-	QmTDI3WRSC4zp3aFgzNorQTTSlgFKWlP9T/3LIMJ7ppPXwtBQn40ZOhurAiIiR+Mr3vE
-	CNY3yP2Mr3bMiacN/pLauT3GGOoVgLRokDG4HZ0M3QcQXP4v2Qcn4Lo0AIKU1AZIiLoY
-	JIMGfGUOLw7MMZ6slvCUDGlOoqaM3AX4nLoNeFAVOmCk9ZdR028yw1WfETclUjiH+prT
-	/KUTtKOGbMMJZHNruIzJr0yFyvCRyvCppHJPAXZOls3PXslOZp4qJIULRGfQfVtpYFSF
-	MZWowRmQKmJxHiCTQ1VoKhJ1YIZfqGUIMFSOfGfQiN/x4OfGx1LBsQ2wiPoTnOLNRGG1
-	pR81wGZTYFqTnLRsln4dMR0QT16Kg0Xr/HJGxQaQ2MMpg1QfuuwyvwWj5xLHT3/eE4BF
-	C4DTQ4FEe4HDG4JIS4LHV4Nta4PcK4R2h4TU14WEG4YF+4aFO4cle4eLJ4gn/4iEU4kn
-	T4m4oEG4qEw4se6kSYJ4x6ZMhu1f+3BI7L/VtvpM6pYUzGfR+KOPXKj3YHNpjP9YJVOV
-	73Y377mFa3dDOQTQTbjFbDr7vtVT1WKAw70RkWKKIF+IoL0U+x4QaIUUz4nAX78F07+I
-	IUzvr7nH0396cKKl6lTFyJjM3SXSHY/RpF44242jAc4FykzFOTt8BTDZAFQSXHNZAZAO
-	fpeGKdusMghe6fuYJN82LFjdSNY8OjicyQpV7Q2aGJbUgcE8buJ9Ag3FiPXJbM3lYFKI
-	UQ2kJPXSHUzZ8HBQnFMhcfzdB0eGd5lHe8LAM0jpMhVMpZAJbax9AH+FqcNi/HB8ZgtF
-	al+FgH3SXZ69ID/ZFOoexIUSXGUQy63eyimgYK2Uz7MsR6a5n8MAl822OAB8RIS8TZp8
-	VD78XlSAC9qY1AA9A8dD+8f4n8hRp8jOX8l8mD78oGWJb8rwSiA8umL8wJw8yHx7PbRQ
-	TvpTSFbnvKeTaU+KOGlFQOo7YFuQiLfUzowFApYSrw7TcL2Z0vJ8J377pQTzQCxFe6lK
-	eYeUH6lQtFb1DTYqJIokmOdvCUFIk/bP0/dn//fG3/KHyacOoI/8Y+Rg0Q5FbhYFakF+
-	SZDHN/xFlTDrCD+TD9yEAf0Cf8EgsCg7+gsFfsMhUEhj9hz/iESiD1i7ojIijZdjoAj8
-	gkMikbdkqkk4KlIblYBlsuAUwl8wmczlwDm8ukE0mMtms9nkuoM6mEjosfgsgl0HiUGg
-	cOg8gpcPhsOilVqkKg70rbnrojr5csNGsdFkrdk6kBNqDlsm03pMtm4DmU0uk7AVwAM+
-	vVAoYCoMtskigtKgUgpkEqVZw0fhGOpsIyFQj9Wf9beldc8bEUdLuCz+g0Oi0efs1otQ
-	JDuqumsuM4wFyv0zkFy1tBgt30VIj+FhMEw9Pp2LyNXiPFitYhcMi71jLozed0nS0G76
-	fW6/Ysao7Z97rV77l8I68an8os89sDjm9YS9qb95m+Ly+YN+re+5B/L7/bY/oOf8moBK
-	2Ay5gU/IHE+CUQLiDHZg6D4QhGEoThSFWfOKGAohpzEuJeHnbKgwYiI6JIiMEsYoSM8I
-	rBGLXrOYVIxH+MxGjVICPjg3I6jgjzzj4E5ANKQiGkRMygkePjzkAE5CNKRCGTMppSha
-	VJVlaV0hfc3ijlyWJel+YGCV8I1hFx15alwo5hmubJfCSbxbnGDpol2bZ2neE5jmWeJ3
-	nSap8oCgWknpYp4QEIA/4EAIJBYNB4RCYVC4ZDYdD4I9YkSIo2Ys8owRY0rY4Bo8aJAt
-	5EEpIOpMy5QMZUmZZBRtLw7MY4rYK75sOJwDJ1EnqYJ8j6AmqET6JEKNR6RSaVS6ZTad
-	T6hSX1UwVVWLVxfWS7WwrXUtX0dYV9Y1VZYK3LQhbU27Yzrch7g1rkm7oB7sRLwbb0PL
-	4Mr808AD8Er8JLEypMRfhlgGnggfhFfhlxk6jlctl8xmYLU31kIw8s1odFo6gAtNfB4J
-	9VTM5noxpNhsdlC9MAtRqhPT9bhM/s99v9Jtdvq+BxYPu1fveNy+ZS+FfNxzYE/+b1YI
-	5ewAe0Gu5C3P3wX4Qd4375Xh5wn6aY3fYH/cBPhn48BgR9et9/x+eqf/4kP8BMANqXsB
-	hTAqwkcOcEoQxyXhsr5LBJCJyQmI0Ks+nQGQiEhVw5AAEjTEBRREG8SHZEz/EgIUVRAN
-	MRFFEgbxMdkURUIT9RvHEcx1HceR7H0fyBIMhSHIkiyMiDpyPJUlyZJshntKBxSkEsqA
-	HKzMPKfq2G28YHO4DSFnBMR7zJAoUzDMcywLJ02TbN03zhOM5TnOk6ztO6FSTPE9z5Ps
-	/T/QFA0FQdCULQ1D0RRL7z1RVG0dR9IUjSVJ0pStLUvTFMtDRk2vOeDvnOEdRPmhB/VN
-	U74AJTVV1ZVtXVfWFY1lWdaVfTkjmpXIt12c1egzX5w2DGpOWI9IJllZBL2UkRbocONn
-	gjaI/Wm0jpkpa6QDQAtt1rWZ12/cAQ3FDzfumflz22Atu3Xdl23dd94XiptbyHKRxBXf
-	BDX0Nl+O0AJ6YAnwwS2aGClng9lEvZiHXA2tjNJLNUnnicMXlShm4wL2NYAeiqgVMRwD
-	tkRA5I2Rj5OM2UsZi2WZbl2X5hmNBXpIQ6ZsaucYWhRn54xTJlwfOgxRcQQ2QWQVaRYh
-	OSoEpJacBuoDDqSeDfqpc6vDRE61BqClrr0Ejmngo7HrREivs+DlmGG1quYpmbeuBD7e
-	Zgg7qoRNAhvOZTnUATb8THAV2LaC2CcMGkJxAy8U0mTmPlIzZXvfJcnynK8ty7Z5pIIg
-	c4JXPZEOyHA90Y5dKEXTqIJ/QcFkhAwmchk9jZ442iCNpj8Lncp5fRDGj3w1eAtBuYme
-	d8BWU/kQ0MXlih5oref04Rd8aIW+rtYYQP6I6+2lQYj37/MScPHxsZrxaoWYH0psd+xi
-	jXpzbAYX5eMO/6iH++u6/BOxbJrWCjQcUGUKkAxQQFApAeAooAWQLIK3dFBBVshugk+G
-	CkFYLQXgwphzSQIFgsDhB8MkISHA/hIhUIz1QWsaC8jJVLryYgdVA2V2peg2ldAq8IEE
-	OSCo1eWGJwpKBliwiEQVubIH2sSYmXYA7owPB9idAFMg9zPgcipBlIoTIsINduUkPUXR
-	8RffqHcXcYy1CFLkNZezxnkCneU8x5oPo4A7jkGuOjj24k8FjHmPUHw4OAEwl954Vg+S
-	DcFFaQ0h5ESJkUkqDaPyKBIV+BkT8kyFmcbyBAugm2oANYSzog0Nhgyhky7UJcpQayng
-	OBQhBPBBStGxK+VLcSFsRPg8RDDaXShyHRLuAYVHbtEkWj4HswwqzFgkG4pLbSsgvPCA
-	t6b3TPtOElECIQsIiNvZABubQSZuDum8bUYk4YejanJCaEzNg6EFj8syPUwZ3TvnhPGe
-	RmJGo+P4H9pR2BykLGHP1Gp7Buv/EHQOIBBZvDuQ0uCdDtQtUNaQCp9czSak2iVH4aVF
-	4EkFS3LsdBJgdRIHmfN4ixqLjSd4bUU1KZ5o3C/S0zkayFkWGzOQbQTabShGDQMQbPBn
-	wdfkMIz8uZYlwIW40MdR4zkFp4E6pg46nPRfWukgo+6qAoqs42ldWSAACBQOCQWDQeEQ
-	mFQuGQ2HQ+IRGJROKRWLReMRmNRuOR2PR+QSGRSOSSWDv+USaROuWCKXG2YIGZAWaOib
-	EqcDadJieLKfFWgMuhC2iIujMikK6lHGmBGnHuoCSpHqqGWrOOsDetLWuAuvEOwMSxBy
-	yE2zGK0FK1TQCue3AK4DK5NO6A+7K+8Jm9Li+Sq/X/AYGNUbCIt04cA4mDF/GCvHHPIB
-	7JIfKFzLPrMAnNPLOJvPNLQKDRQNt6WbOgCakzau6NOBs/YE7ZVhxjHbHTcFvdQN8b17
-	b8JcHBcPicXjcfkcnlcvmc3nc/odHpdPqdCUP/qwxo9ssd1v98M+HTmjyIzzAP0T5ZIb
-	2O/3Pv4PT5Lb6DT7Uw404In7+L//KAKoLQE2g8QKqA9oGNMFNEUDwgyF0IFbCT0AGnAl
-	GhDDSm23A6FFDytBudkREhEghRM7MURSkj5HoE8XDJGA+xk1ICPUywuG7HLEgCsgOHNH
-	7ggkzxNtWMzOHktxzrAIaxGJHqzCatAxA3Kkita17YtmrDIDnDRVS+gYwzElwRELM0VT
-	RNM1TXNk2zdN84TjOU5zokjrzrH5zHVPYVT6A0/oY67vm+yQPRogY4UTIL+D8gZ80ebN
-	Ig1SYKUqhJ3UxCi7AehJ4U8CFQIGcFRnvUoU1POtUziY1WDBVxy1gBlZIHIbZCcgbyDQ
-	W9dyCHVfKEZbbBivRMwUNMGQdCAXQkVplWdKy6SwZ9bNpTB3Sgb1sn9bYX26VlvgdcNV
-	XHcly3Nc90XTdV13ZdqBzvdyKmBeY13qO97i9fN433flApRUZwW2f0yR2hMkq8Bdwgcf
-	uGU8eAJ4ggdrU0uyNuvHJuoGqQSX7juPY/kGQ5FkeSZLOyU5Mg9dlvGgiZdguU5jmWZ5
-	pmubZvnGc51nc6Xhnmf6BoOhaHomi6No+kaS7KAgAAAOAQAAAwAAAAECFQAAAQEAAwAA
-	AAEAtQAAAQIAAwAAAAMAAJIIAQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAMA
-	AJIOARIAAwAAAAEAAQAAARUAAwAAAAEAAwAAARYAAwAAAAEAUQAAARcABAAAAAMAAJIa
-	ARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVMAAwAAAAMAAJImh3MABwAAAzAAAJIsAAAA
-	AAAIAAgACAAAAAgAAE26AACJHQAATbIAADtjAAAIPAABAAEAAQAAAzBhcHBsAgAAAG1u
-	dHJSR0IgWFlaIAfYAAIAFAAJACQAIWFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-	AAAAAAD21gABAAAAANMtYXBwbNxr/Zp0nfX7AcANreGW4ukAAAAAAAAAAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAADXJYWVoAAAEgAAAAFGdYWVoAAAE0AAAAFGJYWVoAAAFIAAAA
-	FHd0cHQAAAFcAAAAFGNoYWQAAAFwAAAALHJUUkMAAAGcAAAADmdUUkMAAAGsAAAADmJU
-	UkMAAAG8AAAADnZjZ3QAAAHMAAAAMG5kaW4AAAH8AAAAOGRlc2MAAAI0AAAAk2NwcnQA
-	AALIAAAAQG1tb2QAAAMIAAAAKFhZWiAAAAAAAAB61gAAQasAAAEOWFlaIAAAAAAAAFaU
-	AACqdgAAGXJYWVogAAAAAAAAJWsAABP0AAC4plhZWiAAAAAAAADz2AABAAAAARYIc2Yz
-	MgAAAAAAAQu3AAAFlv//81cAAAcpAAD91///+7f///2mAAAD2gAAwPZjdXJ2AAAAAAAA
-	AAEBzQAAY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAAB2Y2d0AAAAAAAAAAEA
-	AO+kAAAAAAABAAAAAO+kAAAAAAABAAAAAO+kAAAAAAABAABuZGluAAAAAAAAADAAAKTA
-	AABZAAAASUAAAJpAAAAmFwAAEtsAAFBAAABUQAAB7EMAAexDAAHsQ2Rlc2MAAAAAAAAA
-	E0wyNDEwTk0gQ2FsaWJyYXRlZAAAAAAAAAAAEwBMADIANAAxADAATgBNACAAQwBhAGwA
-	aQBiAHIAYQB0AGUAZAAAAAATTDI0MTBOTSBDYWxpYnJhdGVkAAAAAAAAAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdo
-	dCBBcHBsZSBJbmMuLCAyMDA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbW1v
-	ZAAAAAAAAFyFAABRgAAAAADCZByAAAAAAAAAAAAAAAAAAAAAAA==
-	</data>
-	<key>ReadOnly</key>
-	<string>NO</string>
-	<key>RowAlign</key>
-	<integer>1</integer>
-	<key>RowSpacing</key>
-	<real>36</real>
-	<key>SheetTitle</key>
-	<string>Canvas 1</string>
-	<key>SmartAlignmentGuidesActive</key>
-	<string>YES</string>
-	<key>SmartDistanceGuidesActive</key>
-	<string>YES</string>
-	<key>UniqueID</key>
-	<integer>1</integer>
-	<key>UseEntirePage</key>
-	<false/>
-	<key>VPages</key>
-	<integer>1</integer>
-	<key>WindowInfo</key>
-	<dict>
-		<key>CurrentSheet</key>
-		<integer>0</integer>
-		<key>ExpandedCanvases</key>
-		<array>
-			<dict>
-				<key>name</key>
-				<string>Canvas 1</string>
-			</dict>
-		</array>
-		<key>Frame</key>
-		<string>{{88, 214}, {710, 884}}</string>
-		<key>ListView</key>
-		<true/>
-		<key>OutlineWidth</key>
-		<integer>142</integer>
-		<key>RightSidebar</key>
-		<false/>
-		<key>ShowRuler</key>
-		<true/>
-		<key>Sidebar</key>
-		<true/>
-		<key>SidebarWidth</key>
-		<integer>120</integer>
-		<key>VisibleRegion</key>
-		<string>{{0, 0}, {575, 733}}</string>
-		<key>Zoom</key>
-		<real>1</real>
-		<key>ZoomValues</key>
-		<array>
-			<array>
-				<string>Canvas 1</string>
-				<real>1</real>
-				<real>1</real>
-			</array>
-		</array>
-	</dict>
-	<key>saveQuickLookFiles</key>
-	<string>YES</string>
-</dict>
-</plist>

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.png
===================================================================
(Binary files differ)

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Preview.pdf
===================================================================
(Binary files differ)

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Thumbnail.tiff
===================================================================
(Binary files differ)

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist	2010-01-09 21:29:12 UTC (rev 1569)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist	2010-01-09 21:29:50 UTC (rev 1570)
@@ -7,7 +7,7 @@
 	<key>ApplicationVersion</key>
 	<array>
 		<string>com.omnigroup.OmniGraffle</string>
-		<string>136.19.0.104178</string>
+		<string>138.12.0.121252</string>
 	</array>
 	<key>AutoAdjust</key>
 	<true/>
@@ -51,11 +51,1505 @@
 	<array>
 		<dict>
 			<key>Class</key>
+			<string>Group</string>
+			<key>Graphics</key>
+			<array>
+				<dict>
+					<key>Class</key>
+					<string>Group</string>
+					<key>Graphics</key>
+					<array>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>250</integer>
+							</dict>
+							<key>ID</key>
+							<integer>244</integer>
+							<key>Points</key>
+							<array>
+								<string>{642.613, 402.809}</string>
+								<string>{642.986, 406.207}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>255</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>251</integer>
+							</dict>
+							<key>ID</key>
+							<integer>245</integer>
+							<key>Points</key>
+							<array>
+								<string>{663.616, 402.328}</string>
+								<string>{665.336, 406.254}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>253</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>252</integer>
+							</dict>
+							<key>ID</key>
+							<integer>246</integer>
+							<key>Points</key>
+							<array>
+								<string>{660.333, 402.657}</string>
+								<string>{659.253, 406.941}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>253</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>253</integer>
+							</dict>
+							<key>ID</key>
+							<integer>247</integer>
+							<key>Points</key>
+							<array>
+								<string>{654.791, 387.663}</string>
+								<string>{659.028, 393.385}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>256</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>254</integer>
+							</dict>
+							<key>ID</key>
+							<integer>248</integer>
+							<key>Points</key>
+							<array>
+								<string>{652.345, 388.806}</string>
+								<string>{652.721, 392.627}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>256</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Class</key>
+							<string>LineGraphic</string>
+							<key>Head</key>
+							<dict>
+								<key>ID</key>
+								<integer>255</integer>
+							</dict>
+							<key>ID</key>
+							<integer>249</integer>
+							<key>Points</key>
+							<array>
+								<string>{649.179, 387.906}</string>
+								<string>{645.323, 394.029}</string>
+							</array>
+							<key>Style</key>
+							<dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>HeadArrow</key>
+									<string>0</string>
+									<key>TailArrow</key>
+									<string>0</string>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Tail</key>
+							<dict>
+								<key>ID</key>
+								<integer>256</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{638.396, 407.102}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>250</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{662.799, 407.102}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>251</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{653.057, 407.102}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>252</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{657.928, 393.534}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>253</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{648.185, 393.534}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>254</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{638.396, 393.534}, {7.31178, 8.3133}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>255</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+						<dict>
+							<key>Bounds</key>
+							<string>{{648.185, 379.523}, {7.31179, 8.31331}}</string>
+							<key>Class</key>
+							<string>ShapedGraphic</string>
+							<key>ID</key>
+							<integer>256</integer>
+							<key>Shape</key>
+							<string>Circle</string>
+							<key>Style</key>
+							<dict>
+								<key>fill</key>
+								<dict>
+									<key>FillType</key>
+									<integer>3</integer>
+									<key>GradientCenter</key>
+									<string>{-0.0761905, -0.114286}</string>
+									<key>GradientColor</key>
+									<dict>
+										<key>w</key>
+										<string>0.666667</string>
+									</dict>
+									<key>MiddleFraction</key>
+									<real>0.48412701487541199</real>
+								</dict>
+								<key>shadow</key>
+								<dict>
+									<key>Draws</key>
+									<string>NO</string>
+									<key>Fuzziness</key>
+									<real>5.7921171188354492</real>
+									<key>ShadowVector</key>
+									<string>{3, 4}</string>
+								</dict>
+								<key>stroke</key>
+								<dict>
+									<key>Color</key>
+									<dict>
+										<key>archive</key>
+										<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+										</data>
+										<key>b</key>
+										<string>0.5</string>
+										<key>g</key>
+										<string>0.5</string>
+										<key>r</key>
+										<string>0.5</string>
+									</dict>
+									<key>Width</key>
+									<real>2</real>
+								</dict>
+							</dict>
+							<key>Text</key>
+							<dict>
+								<key>VerticalPad</key>
+								<integer>0</integer>
+							</dict>
+						</dict>
+					</array>
+					<key>ID</key>
+					<integer>243</integer>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{635.91, 376.142}, {36.636, 44.2393}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>257</integer>
+					<key>Magnets</key>
+					<array>
+						<string>{0.112222, 0.508333}</string>
+						<string>{0.116428, -0.5}</string>
+						<string>{1, 0}</string>
+						<string>{-1, 0}</string>
+					</array>
+					<key>Shape</key>
+					<string>NoteShape</string>
+					<key>Style</key>
+					<dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>b</key>
+								<string>0.527174</string>
+								<key>g</key>
+								<string>0.527174</string>
+								<key>r</key>
+								<string>0.527174</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+			</array>
+			<key>ID</key>
+			<integer>242</integer>
+		</dict>
+		<dict>
+			<key>Class</key>
 			<string>LineGraphic</string>
 			<key>ID</key>
-			<integer>231</integer>
+			<integer>241</integer>
 			<key>Points</key>
 			<array>
+				<string>{653.728, 350.439}</string>
+				<string>{653.728, 372.702}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{617.092, 426.742}, {69, 14}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>240</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 XML file}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{610.092, 276.5}, {83, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>238</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{610.092, 305.5}, {83, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>237</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 XML}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>234</integer>
+			<key>Points</key>
+			<array>
 				<string>{547.364, 350.439}</string>
 				<string>{547.364, 372.702}</string>
 			</array>
@@ -67,28 +1561,31 @@
 					<dict>
 						<key>archive</key>
 						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
 						</data>
 						<key>b</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>g</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>r</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 					</dict>
 					<key>HeadArrow</key>
 					<string>FilledArrow</string>
@@ -107,7 +1604,7 @@
 			<key>Flow</key>
 			<string>Resize</string>
 			<key>ID</key>
-			<integer>229</integer>
+			<integer>236</integer>
 			<key>Shape</key>
 			<string>Rectangle</string>
 			<key>Style</key>
@@ -133,13 +1630,12 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
 
-\f0\fs24 \cf0 File\
-System}</string>
+\f0\fs24 \cf0 Maven Repository}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -150,7 +1646,7 @@
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
-			<integer>228</integer>
+			<integer>235</integer>
 			<key>ImageID</key>
 			<integer>1</integer>
 			<key>Shape</key>
@@ -194,7 +1690,7 @@
 				<real>12</real>
 			</dict>
 			<key>ID</key>
-			<integer>227</integer>
+			<integer>232</integer>
 			<key>Shape</key>
 			<string>Bezier</string>
 			<key>ShapeData</key>
@@ -252,7 +1748,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -266,7 +1762,7 @@
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
-			<integer>226</integer>
+			<integer>233</integer>
 			<key>Shape</key>
 			<string>Rectangle</string>
 			<key>Style</key>
@@ -303,12 +1799,12 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
 
-\f0\fs24 \cf0 File System}</string>
+\f0\fs24 \cf0 Maven Repository}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -331,28 +1827,31 @@
 					<dict>
 						<key>archive</key>
 						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
 						</data>
 						<key>b</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>g</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>r</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 					</dict>
 					<key>HeadArrow</key>
 					<string>FilledArrow</string>
@@ -379,28 +1878,31 @@
 					<dict>
 						<key>archive</key>
 						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
 						</data>
 						<key>b</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>g</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>r</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 					</dict>
 					<key>HeadArrow</key>
 					<string>FilledArrow</string>
@@ -416,8 +1918,8 @@
 			<integer>223</integer>
 			<key>Points</key>
 			<array>
-				<string>{223, 350.439}</string>
-				<string>{223, 372.702}</string>
+				<string>{229, 350.439}</string>
+				<string>{229, 372.702}</string>
 			</array>
 			<key>Style</key>
 			<dict>
@@ -427,28 +1929,31 @@
 					<dict>
 						<key>archive</key>
 						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
 						</data>
 						<key>b</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>g</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>r</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 					</dict>
 					<key>HeadArrow</key>
 					<string>FilledArrow</string>
@@ -464,8 +1969,8 @@
 			<integer>222</integer>
 			<key>Points</key>
 			<array>
-				<string>{108, 350.439}</string>
-				<string>{108, 372.702}</string>
+				<string>{126, 350.439}</string>
+				<string>{126, 372.702}</string>
 			</array>
 			<key>Style</key>
 			<dict>
@@ -475,28 +1980,31 @@
 					<dict>
 						<key>archive</key>
 						<data>
-						YnBsaXN0MDDUAQIDBAUGCQpYJHZl
-						cnNpb25UJHRvcFkkYXJjaGl2ZXJY
-						JG9iamVjdHMSAAGGoNEHCFRyb290
-						gAFfEA9OU0tleWVkQXJjaGl2ZXKl
-						CwwVGR5VJG51bGzUDQ4PEBESExRW
-						JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
-						Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
-						U1doaXRlgAQQA4ACRDAuNQDSDRYX
-						GFROU0lEgAMQAtIaGxwOWCRjbGFz
-						c2VzWiRjbGFzc25hbWWiDh1YTlNP
-						YmplY3TSGhsfIKIgHVdOU0NvbG9y
-						CBEaHykyNzo/QVNZX2hvfJGZm52f
-						pKmusLK3wMvO19zfAAAAAAAAAQEA
-						AAAAAAAAIQAAAAAAAAAAAAAAAAAA
-						AOc=
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
 						</data>
 						<key>b</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>g</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 						<key>r</key>
-						<string>0.500023</string>
+						<string>0.5</string>
 					</dict>
 					<key>HeadArrow</key>
 					<string>FilledArrow</string>
@@ -548,7 +2056,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -594,7 +2102,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -712,7 +2220,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -763,7 +2271,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -816,7 +2324,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -862,7 +2370,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -980,7 +2488,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1031,7 +2539,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1043,7 +2551,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{189, 427.621}, {69, 28}}</string>
+			<string>{{195, 427.621}, {69, 28}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FitText</key>
@@ -1077,19 +2585,19 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
 
-\f0\fs24 \cf0 JDBC Database}</string>
+\f0\fs24 \cf0 LDAP Directory}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{203.059, 376.142}, {40.8814, 44.2393}}</string>
+			<string>{{209.059, 376.142}, {40.8814, 44.2393}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -1119,7 +2627,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{182, 277.379}, {83, 29.0002}}</string>
+			<string>{{188, 277.379}, {83, 29.0002}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FontInfo</key>
@@ -1195,7 +2703,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1205,7 +2713,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{182, 306.379}, {83, 37}}</string>
+			<string>{{188, 306.379}, {83, 37}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -1246,19 +2754,19 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
 
-\f0\fs24 \cf0 JDBC}</string>
+\f0\fs24 \cf0 LDAP}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{74, 427.621}, {69, 28}}</string>
+			<string>{{92, 427.621}, {69, 28}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FitText</key>
@@ -1292,7 +2800,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1304,7 +2812,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{88.059, 376.142}, {40.8814, 44.2393}}</string>
+			<string>{{106.059, 376.142}, {40.8814, 44.2393}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -1334,7 +2842,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{67, 277.379}, {83, 29.0002}}</string>
+			<string>{{85, 277.379}, {83, 29.0002}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FontInfo</key>
@@ -1410,7 +2918,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1420,7 +2928,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{67, 306.379}, {83, 37}}</string>
+			<string>{{85, 306.379}, {83, 37}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -1461,7 +2969,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1527,7 +3035,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2008-11-12 12:43:41 -0600</string>
+	<string>2010-01-08 17:30:55 -0600</string>
 	<key>Modifier</key>
 	<string>Randall Hauch</string>
 	<key>NotesVisible</key>
@@ -1603,7 +3111,7 @@
 			</dict>
 		</array>
 		<key>Frame</key>
-		<string>{{108, 213}, {951, 865}}</string>
+		<string>{{573, 198}, {951, 865}}</string>
 		<key>ListView</key>
 		<true/>
 		<key>OutlineWidth</key>
@@ -1617,7 +3125,7 @@
 		<key>SidebarWidth</key>
 		<integer>120</integer>
 		<key>VisibleRegion</key>
-		<string>{{-30, -80}, {816, 714}}</string>
+		<string>{{-30, -79}, {816, 712}}</string>
 		<key>Zoom</key>
 		<real>1</real>
 		<key>ZoomValues</key>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.png
===================================================================
(Binary files differ)

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Preview.pdf
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Preview.pdf	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Preview.pdf	2010-01-09 21:29:50 UTC (rev 1570)
@@ -0,0 +1,1293 @@
+%PDF-1.3
+%???????????
+5 0 obj
+<< /Length 6 0 R /Filter /FlateDecode >>
+stream
+x??K?$?q???+?????w?U???
+K\?Cz???0C???
+?Y???????????ttEfTDd?22????????4??4?????~?~????}??v???C??x?Z??z????{?????~??o??jt??k????um??|X???????|???~?????P=:?hS??e????n??5}v?~??u?m?n?Nk>?????????y????QG?+?????????Q?u?dV>?"?6?????8m???Q??V>z????i??0???|??Q??v?K??f????~?????????~????????????E>?????h?6?????m?????????0o??4,V?{Y0Gy?V?,??]??~?y??????????z??m???}???]w86]??????W_~??}????d????y?>}?}??g???7_????%?k??e???x??Vj?y????=???>??v?????;?S??r?[>4?2?;??m?M?q????]??????Y?c???[?????z?/|?a;?-h???w5??|n??<o??}V/??????52*??Cag?*8?7gpp??{?h???>?????O???s?/?y???? ??4}???4?	?}??r.i?)J????
+z??&?`???
+NY^?v7?#??????2????M?????8x:????6?qn>?+?????????????O??5???ue?l?;}????R@|=??H??v?1|?s?????r?UJ???%???"?/??_??]3O?H??K?7;?-????F?^?^?B??]??,?????3?|s?UtI???BV >?????b?O`?~???~???U?ai?e$F?B;=?gb??????C7n?@8?~???ti@??)H p?	??J?????E
+0
+d???1??sN??
+6W????"??C;???iF?????????~??k???+??>^??/??+??k??_|????????>jL?????x8v=l??????-LMa
+Hm]?E?????*?wM??a?z??K@*:L????a)?????
+??lb?|???<?_??c7??u?uvZ?x???x??:??????j???P?r??O/?????^lgJ??????[????E??8???/??Ry?$K????H??KZ?
+??t????#?`Y??enm????q??S??#vF??????a??+?????E??????3?
+??^AX?J?xF&h18
+????$?|?b6?qS???X??`?&? ???^??g?c^?D??Mb~8?b?x????68??p/???J?????D??@\??7????Z:?;1??@Fr?s??s???!?????8??t5t????$????QK??Hcj:?:,3/>	?Y?:3Y1y
+H????J<???p?t?
+L??N?i????_'?$??&QK|U? ?d?????P
+???c??	@?bo????"?????l???`??%b7???r?????*cL??z?&?_?v???{?K????????U?V???????O1?X?m????
+????s?/!?????fa?
+?Go*?Q?q2+???T?%??W?DOUK??k?K?NT??sQ??.?U&l?J_?E?
+)?Q?I<[??e??r
+l9&??rLL+???h??a,e??V??/?rO+KM/jf,y???f+)+?ZgZIh}W??\n]na+'@E'?????J?I?
+???p??k?????!??M<[<M?Z?8????VRJ???b??5y??z??X??
+bzS??v???q;?V6??~P??R??L?Yk?8?U]?ke)?????V????m???LCkD+e?????h??'\?6r?J???=ZyO?/????!???
+b?2??Vo\??_B\8?V?(\??
+b?2??d>T???v??t2?D[9????N?a???r$?[U+??0Md?		zG	5
+????#I?P?T+G????L?j?C? V at L?x,B?nd,?!e$???t18????CE?AD?O????pU?r?O??????V.x?U??v?X?%??????m???P???MW?!??b=????H???D??6R??D??p??r???????!M0??Q???P@????d>?/???????'3?4???]je?
+??|?V?N$??&?R?$??V????
+??B???????~?Q?V???m???GO?Q?$^he?Z??????b+??|?B?K???X???R-?X??????X:?.?J:??)?P?????t0???
+&???x??.?? ??!'??\???A at B???Dscu???C-???h????:?0?W???+c??sK???H?P???0	pc?d2Pqg???V?Nw?K?(????\???{?e??r????&??z??N?]??????C?`r???N?????s2?<t0H???????*?j)S?;?95"r??Y?????G?=?L??q_??T?e?????v?M??2????8?7?		?iA?d?EB
+??c?,:;A???g=B?F?{?<????w?^?
+????$?_^???:????S1????i\?x???Q????????^?G?k???p\z???"?????:?wv??|Sp?????????g?????????`?>u??x????d????\?}?j34??2?U?]
+???/D?O?1??e4?Tc??O??R?r_????t?P????????????;??
+l??7i???8
+?k?Y???J???????o?c???A???? c?:v~,cS???e??N??Jy]wg?????	?4?[e?-???N
+??'????ldi???`	???u?9?D???????????S????JeT?\b???B?Y??????v?????e??E?y?+?'???#?z`?*?h+UPTa?P+yQ??F????s?ml??ZQ??j1-T????????z[$U???c????
+X??*T=?(?HT?\??lxf???sU?f????N?C?h*?=
+?????gC?"?h?<
+W???*?{A?@`?:????r|??L?$?f??2?~??z?4
+&An0i'??E+
+???4@?5??V??#?Y[J?"???<Ys?@E??c?f?f????
+<??xL?
+!H0C??h??+??(??U.x??8f*Y\?l at 8?*??%?EI-??w?#?G???@????
+	1?"?????*"(??.??~????E?ao ?<O?C3R???r?????I[B?J??
+?H1b?!?giys<?F?????????T???????|-L???8 ?x(??ZD?
+j?,.??BAC??????P???1?jX\T??AfA?????@?b?@?'z?!???2?T ??????u1?W?(t?bRt???$?*?&z??TCga1>?b??CC?o(jOq! ??P??q2QL<??	H??Y?s(??r?@?b?$W??b$??PB??U!
+???nB??H?^??????(?T?<?cqT`"
+?@???dJ???)?YCpV L1?b??F??????%^U?\1yM???X??Xks??:b????\9zB\1]>Nf??tR1????l?#?R??
+^N?O+?'??7?@??Z?P?3???79?;lr????&??h
+Q??Y???`?&????M??????x?
+?\?/$
+?cw??H???|???w?(?g?];U?U.??q????s????n????f?|O????!?z/??nS??z??ly?}????1W?z?????4?s?B?\??q????^[??M??zi?j? m?[??T?u?Rbi]5XCc??????g??|$????????*pm]5Z??];(k???J???Y???;?U??,???`J?.y?????U????????>?,???d<E"{D?+-m]-?uU>?"*k]u??O??O??????i9?????d?3>h??$??>??z????s???:????s?0?ME??????u??????b?4z??4U????!a?.]Bg???KY?????r??d??%??_??'???a%cFu???????
+"?
+A]g????x=Q?ky??%?L*+
+o??f??????>o?????????S????g??l???/`?[?
+???.??
+??FLFn??Q????(??(?6????p??????????4p???eHS?rT?]
+????E??i?'
+?\?}a????'????m??????g?H????????
+??H??????-?k?????sD?;?yt=?m#gn?.??#?kN???p?|Yr????????XY?l??&?????? ??O???B ?u??8+??[????T?e?x??,?f??d??Y?8??;y?????ZI?#????|S.x???gg"m;JY?D??7???<????H?R=??????]??Rta?y?Qb??
+endstream
+endobj
+6 0 obj
+8271
+endobj
+3 0 obj
+<< /Type /Page /Parent 4 0 R /Resources 7 0 R /Contents 5 0 R /MediaBox [0 0 756 553]
+>>
+endobj
+7 0 obj
+<< /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 8 0 R
+/Cs2 15 0 R >> /Font << /F1.0 16 0 R >> /XObject << /Im3 13 0 R /Im1 9 0 R
+/Im4 27 0 R /Im5 40 0 R /Im2 11 0 R /Im6 42 0 R /Im7 44 0 R >> /Shading <<
+/Sh16 34 0 R /Sh14 32 0 R /Sh17 35 0 R /Sh9 25 0 R /Sh18 36 0 R /Sh8 24 0 R
+/Sh2 18 0 R /Sh7 23 0 R /Sh1 17 0 R /Sh3 19 0 R /Sh12 30 0 R /Sh13 31 0 R
+/Sh10 26 0 R /Sh6 22 0 R /Sh19 37 0 R /Sh11 29 0 R /Sh4 20 0 R /Sh20 38 0 R
+/Sh21 39 0 R /Sh15 33 0 R /Sh5 21 0 R >> >>
+endobj
+34 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 47 0 R
+>>
+endobj
+32 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291446 -1.16626 0 -0.7291446
+-1.16626 8.348753 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 48 0 R
+>>
+endobj
+35 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291446 -1.16626 0 -0.7291446
+-1.16626 8.348753 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 49 0 R
+>>
+endobj
+25 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ 0 0 0 0 0 27.73085 ] /Domain
+[ 0 1 ] /Extend [ false false ] /Function 50 0 R >>
+endobj
+36 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 51 0 R
+>>
+endobj
+24 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 52 0 R
+>>
+endobj
+18 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291446 -1.16626 0 -0.7291446
+-1.16626 8.348753 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 53 0 R
+>>
+endobj
+23 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 54 0 R
+>>
+endobj
+17 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -4.800002 -4.656057 0 -4.800002
+-4.656057 44.09086 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 55 0 R
+>>
+endobj
+19 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 56 0 R
+>>
+endobj
+30 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 57 0 R
+>>
+endobj
+31 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 58 0 R
+>>
+endobj
+26 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ 0 0 0 0 0 27.73085 ] /Domain
+[ 0 1 ] /Extend [ false false ] /Function 59 0 R >>
+endobj
+22 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 60 0 R
+>>
+endobj
+37 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 61 0 R
+>>
+endobj
+29 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291446 -1.16626 0 -0.7291446
+-1.16626 8.348753 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 62 0 R
+>>
+endobj
+20 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 63 0 R
+>>
+endobj
+38 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ 0 0 0 0 0 27.73085 ] /Domain
+[ 0 1 ] /Extend [ false false ] /Function 64 0 R >>
+endobj
+39 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ 0 0 0 0 0 27.73085 ] /Domain
+[ 0 1 ] /Extend [ false false ] /Function 65 0 R >>
+endobj
+33 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 66 0 R
+>>
+endobj
+21 0 obj
+<< /ColorSpace 46 0 R /ShadingType 3 /Coords [ -0.7291439 -1.166259 0 -0.7291439
+-1.166259 8.348744 ] /Domain [ 0 1 ] /Extend [ false false ] /Function 67 0 R
+>>
+endobj
+13 0 obj
+<< /Length 14 0 R /Type /XObject /Subtype /Image /Width 168 /Height 86 /Interpolate
+true /ColorSpace 68 0 R /Intent /Perceptual /SMask 69 0 R /BitsPerComponent
+8 /Filter /FlateDecode >>
+stream
+x???
+endstream
+endobj
+14 0 obj
+211
+endobj
+9 0 obj
+<< /Length 10 0 R /Type /XObject /Subtype /Image /Width 166 /Height 102 /Interpolate
+true /ColorSpace 68 0 R /Intent /Perceptual /SMask 71 0 R /BitsPerComponent
+8 /Filter /FlateDecode >>
+stream
+x??
+
+endstream
+endobj
+10 0 obj
+244
+endobj
+27 0 obj
+<< /Length 28 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /Interpolate
+true /ColorSpace 73 0 R /SMask 74 0 R /BitsPerComponent 8 /Filter /FlateDecode
+>>
+stream
+x???_Y?????]????X?XXMD??(6?
+?4?*bH'!?????????s?1??>?3???I????9????g???????????<_?3?|?0666?l?LNN~???s~zyGn???=_j???????o??f????z??????(>~????{????????????w86??zzz_?|?9o?????????????p5?+?{??9???H3?%1~?????y?f``?l???<????p!+55????????????y?????7m??&?m????#j???		??????\-,,|?????844????O?>!???F??g`????,???????,kqqIFF???"#????
+
+^?j???ak??
+?????m??k??=?{????=&f??m;""????9lMx??5+W???X?f_HI9|???'O?bSSS???,?' E?X`gggyy???????@? ??C
+???
+??@?
+??y\?_?[gg??3@.(x?S!?????n???X????????|}???H?qq???A?m??]h???D?????A?????!S1??????Z,"oi?.????,?6SZ?6r?O???\???	?/(tv"????1Z???K_?@?b?M??#_??}??U???B??????{{???????]"?Tv????O0
+??E??
+????H#??SS?A41?&=?$????7???|?????o??z?
+a?K??x????J??x!:?9???$??y|?5?`?????????A?NP?}I
+?????Z?? ????@8?1r?M??H?
+?vt??|???t
+?????^?kn???L??? ;??????)-J8??'???y?????;In??? ????N?2???rB?[T??9???J??&h~w??????W?`ithVx*g?????Qv?)
+?1r??Z??W?2??o?q>?`?????????????????a?????????;a??^????*???:\????1??{??P???$@????drl%HYT???????4P??c????|??U	???c????????k??q??H?r?L?+\?b<?c????????????Z?s+Q??r???`E???9???/%??pw?|`?h????????;??E}????U???	(???????fkbIQg02x`*H?[???????C?I8????
+du.RW6??;b??=??L7&?
+?;?x?3/kYQ.?i??o??233?^Gz?1l???$?>???k\\<-t	?????????T(!?;H??P?+?K????s??z??()???D%??{'?in??K?F?9? ??N???u?????54
+?fL?9)?\f???x??6?9[?n<k
+??????g?a??A+??v=./?)???l?P/;$j???????????7??y?6x?;?????\?ux;??j?f?f???t/??G?6??x*??{????FW??<d????`??l????Z?CBV??z????????f????w????D??H???+HK'????ml???V???y???g?????K???l????7??X??W?SR???????[QQ?+W?^?6?Xv?j6^???K)^;U?j?)M at F???]?????g?N??7?uF???????7RRo????d???????x*?6
+%?@??@?3p??O8?]{{??????[?Hy6$!???K?x?
+SL???,?(&?U>}????,/??%???;?? j?????????|@n?i???w?(??????+w????2T49??'?!??L?s?.???|;??t?8	]dt?8q??????y???UU????Fc??@?___ZZ??Q??G???sr??I?A??????c?`?n??72O?,??26v??3g???A?Z1?Jo?L??`],Gx	?Z?/???{	s?+?(u?K??
+??g?-d?????<?fg|N?Y??T! 6????iO??&?@?8F,S?SS?~
+6F??X?d??
+?E?LR??T?.0=??3t??????JKC???5?"?:??NC??]?4(E?+??? ?????????????]?????^!????hG??P?e????}?qX?:??}$e?+vn67?S?h????=???_?}?U?J???o?2_x??FG?V????z??G?r??c???)???UJz?9;??L??e($
+???t?Q?8UTT???X?????4??O.??&??B???????}??\?"??S?t?J?E?JY????(y?y??y?????L"???[oYy??????{0??xD_??')Rx?????~?s??%?????2???!???jaR$?;y??A??U???W?d~?
+T??U$?\??pJ-??b
+u?z6,,??:?9?j????a?}l~{?`?????I??r??ZBV#pv???g3v??U4???u?6?
+K???4?%	{?,??;?
+?????X/3?????M????s?uuu?zjJ4?q????
+?NE??B??????$????9@?UUO???;w1?>Da??BZ?1?? VW?h4Z?????L3?S?^?y???1?|??jJW??/xp???.;??;??C??r? |??	7n???&?	<#?i?xR`??*?d?J?J'|K???U???r?>????H?8?q2Te?B????^??bH?%??mK??M??`3?W?
+^?W????FFF>|???????m13f2???#?U?|???????<?A?VR=09?Z???!B???/$}?h???s7E:L&???5;p????P???@Xoz?I???@?BJ??N??)?????J??7m???F?xu????x?F?i?j??$?v????a?<*?1)??t|?p??h?L3??<u?,??b<?9?a??
+??&F?4???SE*q??GY)?????>>?UU????|??a	(2Tjd??o&???S???J~??!s@??
+??"????b?h????????<??k2????\??l?Ov?uo?@????G2???????j*@??Ad?1O?LU?t?{??ju?Dg`e?\?5Sz_{{?#?/^h?LL?Agj:?7_%??{X?.?K8]?F ?9''??;~pCM@??`????0?2]??????\g`??[??????Wn?l??-???????v?y??U??
+J
+??h?$J|?m?W??X?v?63????00s???
+2?AEEUTt!????	X" ?O??\
+ZI?PRR?c??m?:K0?^%???????fZ;??@N	SZ?DMX???`??
+???????f8%d???Ymbb2
+7E6: ??e^%d?????7	<???????Q?^??3$?(-+??/. 0???i??YNg??c???6????5n?;????????\O????a??Zg?#r?v:6i?&??x?=?|8???.}9?Oqq????K??^????tL?;j?`z\^y?pZ??0_????H?????H?O?,????K?%0? ??udM8v?&???Y??.B?L\n?w\???@D?L~u?\&m'?1???*?lH??zT1?<PQ?/??=^?>??P???W??B???9d?/??%?????hf??+?
+O??#??T???&?p??!??~L?$a?????OHH?????c?l???????	?"?Wt?Q
+\??	??+?(I?b??N?yZ{7'?h?1|,Z`$?N?By,?Q5N?k2???????????Y??EE?????????y?
+!8???q +???^Q*}?????"????!6a?`WX3%[???m??tn?h???A????N?}E??*??N??^ddd??1????e????R???t???????>?Z-???????	f?????????k???
+??????~???o???????|?Jmm-??:]$8?zY??!???????/??w??CK'??;?	'??s??+?????c?V??[???8r$???????]??<?U\???uM??|?????
+???K&&(JJ?Hox-)??Qz?S?W??(??[??$$?
+endstream
+endobj
+28 0 obj
+7357
+endobj
+40 0 obj
+<< /Length 41 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /Interpolate
+true /ColorSpace 73 0 R /SMask 76 0 R /BitsPerComponent 8 /Filter /FlateDecode
+>>
+stream
+x???_Y?????]????X?XXMD??(6?
+?4?*bH'!?????????s?1??>?3???I????9????g???????????<_?3?|?0666?l?LNN~???s~zyGn???=_j???????o??f????z??????(>~????{????????????w86??zzz_?|?9o?????????????p5?+?{??9???H3?%1~?????y?f``?l???<????p!+55????????????y?????7m??&?m????#j???		??????\-,,|?????844????O?>!???F??g`????,???????,kqqIFF???"#????
+
+^?j???ak??
+?????m??k??=?{????=&f??m;""????9lMx??5+W???X?f_HI9|???'O?bSSS???,?' E?X`gggyy???????@? ??C
+???
+??@?
+??y\?_?[gg??3@.(x?S!?????n???X????????|}???H?qq???A?m??]h???D?????A?????!S1??????Z,"oi?.????,?6SZ?6r?O???\???	?/(tv"????1Z???K_?@?b?M??#_??}??U???B??????{{???????]"?Tv????O0
+??E??
+????H#??SS?A41?&=?$????7???|?????o??z?
+a?K??x????J??x!:?9???$??y|?5?`?????????A?NP?}I
+?????Z?? ????@8?1r?M??H?
+?vt??|???t
+?????^?kn???L??? ;??????)-J8??'???y?????;In??? ????N?2???rB?[T??9???J??&h~w??????W?`ithVx*g?????Qv?)
+?1r??Z??W?2??o?q>?`?????????????????a?????????;a??^????*???:\????1??{??P???$@????drl%HYT???????4P??c????|??U	???c????????k??q??H?r?L?+\?b<?c????????????Z?s+Q??r???`E???9???/%??pw?|`?h????????;??E}????U???	(???????fkbIQg02x`*H?[???????C?I8????
+du.RW6??;b??=??L7&?
+?;?x?3/kYQ.?i??o??233?^Gz?1l???$?>???k\\<-t	?????????T(!?;H??P?+?K????s??z??()???D%??{'?in??K?F?9? ??N???u?????54
+?fL?9)?\f???x??6?9[?n<k
+??????g?a??A+??v=./?)???l?P/;$j???????????7??y?6x?;?????\?ux;??j?f?f???t/??G?6??x*??{????FW??<d????`??l????Z?CBV??z????????f????w????D??H???+HK'????ml???V???y???g?????K???l????7??X??W?SR???????[QQ?+W?^?6?Xv?j6^???K)^;U?j?)M at F???]?????g?N??7?uF???????7RRo????d???????x*?6
+%?@??@?3p??O8?]{{??????[?Hy6$!???K?x?
+SL???,?(&?U>}????,/??%???;?? j?????????|@n?i???w?(??????+w????2T49??'?!??L?s?.???|;??t?8	]dt?8q??????y???UU????Fc??@?___ZZ??Q??G???sr??I?A??????c?`?n??72O?,??26v??3g???A?Z1?Jo?L??`],Gx	?Z?/???{	s?+?(u?K??
+??g?-d?????<?fg|N?Y??T! 6????iO??&?@?8F,S?SS?~
+6F??X?d??
+?E?LR??T?.0=??3t??????JKC???5?"?:??NC??]?4(E?+??? ?????????????]?????^!????hG??P?e????}?qX?:??}$e?+vn67?S?h????=???_?}?U?J???o?2_x??FG?V????z??G?r??c???)???UJz?9;??L??e($
+???t?Q?8UTT???X?????4??O.??&??B???????}??\?"??S?t?J?E?JY????(y?y??y?????L"???[oYy??????{0??xD_??')Rx?????~?s??%?????2???!???jaR$?;y??A??U???W?d~?
+T??U$?\??pJ-??b
+u?z6,,??:?9?j????a?}l~{?`?????I??r??ZBV#pv???g3v??U4???u?6?
+K???4?%	{?,??;?
+?????X/3?????M????s?uuu?zjJ4?q????
+?NE??B??????$????9@?UUO???;w1?>Da??BZ?1?? VW?h4Z?????L3?S?^?y???1?|??jJW??/xp???.;??;??C??r? |??	7n???&?	<#?i?xR`??*?d?J?J'|K???U???r?>????H?8?q2Te?B????^??bH?%??mK??M??`3?W?
+^?W????FFF>|???????m13f2???#?U?|???????<?A?VR=09?Z???!B???/$}?h???s7E:L&???5;p????P???@Xoz?I???@?BJ??N??)?????J??7m???F?xu????x?F?i?j??$?v????a?<*?1)??t|?p??h?L3??<u?,??b<?9?a??
+??&F?4???SE*q??GY)?????>>?UU????|??a	(2Tjd??o&???S???J~??!s@??
+??"????b?h????????<??k2????\??l?Ov?uo?@????G2???????j*@??Ad?1O?LU?t?{??ju?Dg`e?\?5Sz_{{?#?/^h?LL?Agj:?7_%??{X?.?K8]?F ?9''??;~pCM@??`????0?2]??????\g`??[??????Wn?l??-???????v?y??U??
+J
+??h?$J|?m?W??X?v?63????00s???
+2?AEEUTt!????	X" ?O??\
+ZI?PRR?c??m?:K0?^%???????fZ;??@N	SZ?DMX???`??
+???????f8%d???Ymbb2
+7E6: ??e^%d?????7	<???????Q?^??3$?(-+??/. 0???i??YNg??c???6????5n?;????????\O????a??Zg?#r?v:6i?&??x?=?|8???.}9?Oqq????K??^????tL?;j?`z\^y?pZ??0_????H?????H?O?,????K?%0? ??udM8v?&???Y??.B?L\n?w\???@D?L~u?\&m'?1???*?lH??zT1?<PQ?/??=^?>??P???W??B???9d?/??%?????hf??+?
+O??#??T???&?p??!??~L?$a?????OHH?????c?l???????	?"?Wt?Q
+\??	??+?(I?b??N?yZ{7'?h?1|,Z`$?N?By,?Q5N?k2???????????Y??EE?????????y?
+!8???q +???^Q*}?????"????!6a?`WX3%[???m??tn?h???A????N?}E??*??N??^ddd??1????e????R???t???????>?Z-???????	f?????????k???
+??????~???o???????|?Jmm-??:]$8?zY??!???????/??w??CK'??;?	'??s??+?????c?V??[???8r$???????]??<?U\???uM??|?????
+???K&&(JJ?Hox-)??Qz?S?W??(??[??$$?
+endstream
+endobj
+41 0 obj
+7357
+endobj
+11 0 obj
+<< /Length 12 0 R /Type /XObject /Subtype /Image /Width 166 /Height 86 /Interpolate
+true /ColorSpace 68 0 R /Intent /Perceptual /SMask 78 0 R /BitsPerComponent
+8 /Filter /FlateDecode >>
+stream
+x???
+endstream
+endobj
+12 0 obj
+209
+endobj
+42 0 obj
+<< /Length 43 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /Interpolate
+true /ColorSpace 73 0 R /SMask 80 0 R /BitsPerComponent 8 /Filter /FlateDecode
+>>
+stream
+x???_Y?????]????X?XXMD??(6?
+?4?*bH'!?????????s?1??>?3???I????9????g???????????<_?3?|?0666?l?LNN~???s~zyGn???=_j???????o??f????z??????(>~????{????????????w86??zzz_?|?9o?????????????p5?+?{??9???H3?%1~?????y?f``?l???<????p!+55????????????y?????7m??&?m????#j???		??????\-,,|?????844????O?>!???F??g`????,???????,kqqIFF???"#????
+
+^?j???ak??
+?????m??k??=?{????=&f??m;""????9lMx??5+W???X?f_HI9|???'O?bSSS???,?' E?X`gggyy???????@? ??C
+???
+??@?
+??y\?_?[gg??3@.(x?S!?????n???X????????|}???H?qq???A?m??]h???D?????A?????!S1??????Z,"oi?.????,?6SZ?6r?O???\???	?/(tv"????1Z???K_?@?b?M??#_??}??U???B??????{{???????]"?Tv????O0
+??E??
+????H#??SS?A41?&=?$????7???|?????o??z?
+a?K??x????J??x!:?9???$??y|?5?`?????????A?NP?}I
+?????Z?? ????@8?1r?M??H?
+?vt??|???t
+?????^?kn???L??? ;??????)-J8??'???y?????;In??? ????N?2???rB?[T??9???J??&h~w??????W?`ithVx*g?????Qv?)
+?1r??Z??W?2??o?q>?`?????????????????a?????????;a??^????*???:\????1??{??P???$@????drl%HYT???????4P??c????|??U	???c????????k??q??H?r?L?+\?b<?c????????????Z?s+Q??r???`E???9???/%??pw?|`?h????????;??E}????U???	(???????fkbIQg02x`*H?[???????C?I8????
+du.RW6??;b??=??L7&?
+?;?x?3/kYQ.?i??o??233?^Gz?1l???$?>???k\\<-t	?????????T(!?;H??P?+?K????s??z??()???D%??{'?in??K?F?9? ??N???u?????54
+?fL?9)?\f???x??6?9[?n<k
+??????g?a??A+??v=./?)???l?P/;$j???????????7??y?6x?;?????\?ux;??j?f?f???t/??G?6??x*??{????FW??<d????`??l????Z?CBV??z????????f????w????D??H???+HK'????ml???V???y???g?????K???l????7??X??W?SR???????[QQ?+W?^?6?Xv?j6^???K)^;U?j?)M at F???]?????g?N??7?uF???????7RRo????d???????x*?6
+%?@??@?3p??O8?]{{??????[?Hy6$!???K?x?
+SL???,?(&?U>}????,/??%???;?? j?????????|@n?i???w?(??????+w????2T49??'?!??L?s?.???|;??t?8	]dt?8q??????y???UU????Fc??@?___ZZ??Q??G???sr??I?A??????c?`?n??72O?,??26v??3g???A?Z1?Jo?L??`],Gx	?Z?/???{	s?+?(u?K??
+??g?-d?????<?fg|N?Y??T! 6????iO??&?@?8F,S?SS?~
+6F??X?d??
+?E?LR??T?.0=??3t??????JKC???5?"?:??NC??]?4(E?+??? ?????????????]?????^!????hG??P?e????}?qX?:??}$e?+vn67?S?h????=???_?}?U?J???o?2_x??FG?V????z??G?r??c???)???UJz?9;??L??e($
+???t?Q?8UTT???X?????4??O.??&??B???????}??\?"??S?t?J?E?JY????(y?y??y?????L"???[oYy??????{0??xD_??')Rx?????~?s??%?????2???!???jaR$?;y??A??U???W?d~?
+T??U$?\??pJ-??b
+u?z6,,??:?9?j????a?}l~{?`?????I??r??ZBV#pv???g3v??U4???u?6?
+K???4?%	{?,??;?
+?????X/3?????M????s?uuu?zjJ4?q????
+?NE??B??????$????9@?UUO???;w1?>Da??BZ?1?? VW?h4Z?????L3?S?^?y???1?|??jJW??/xp???.;??;??C??r? |??	7n???&?	<#?i?xR`??*?d?J?J'|K???U???r?>????H?8?q2Te?B????^??bH?%??mK??M??`3?W?
+^?W????FFF>|???????m13f2???#?U?|???????<?A?VR=09?Z???!B???/$}?h???s7E:L&???5;p????P???@Xoz?I???@?BJ??N??)?????J??7m???F?xu????x?F?i?j??$?v????a?<*?1)??t|?p??h?L3??<u?,??b<?9?a??
+??&F?4???SE*q??GY)?????>>?UU????|??a	(2Tjd??o&???S???J~??!s@??
+??"????b?h????????<??k2????\??l?Ov?uo?@????G2???????j*@??Ad?1O?LU?t?{??ju?Dg`e?\?5Sz_{{?#?/^h?LL?Agj:?7_%??{X?.?K8]?F ?9''??;~pCM@??`????0?2]??????\g`??[??????Wn?l??-???????v?y??U??
+J
+??h?$J|?m?W??X?v?63????00s???
+2?AEEUTt!????	X" ?O??\
+ZI?PRR?c??m?:K0?^%???????fZ;??@N	SZ?DMX???`??
+???????f8%d???Ymbb2
+7E6: ??e^%d?????7	<???????Q?^??3$?(-+??/. 0???i??YNg??c???6????5n?;????????\O????a??Zg?#r?v:6i?&??x?=?|8???.}9?Oqq????K??^????tL?;j?`z\^y?pZ??0_????H?????H?O?,????K?%0? ??udM8v?&???Y??.B?L\n?w\???@D?L~u?\&m'?1???*?lH??zT1?<PQ?/??=^?>??P???W??B???9d?/??%?????hf??+?
+O??#??T???&?p??!??~L?$a?????OHH?????c?l???????	?"?Wt?Q
+\??	??+?(I?b??N?yZ{7'?h?1|,Z`$?N?By,?Q5N?k2???????????Y??EE?????????y?
+!8???q +???^Q*}?????"????!6a?`WX3%[???m??tn?h???A????N?}E??*??N??^ddd??1????e????R???t???????>?Z-???????	f?????????k???
+??????~???o???????|?Jmm-??:]$8?zY??!???????/??w??CK'??;?	'??s??+?????c?V??[???8r$???????]??<?U\???uM??|?????
+???K&&(JJ?Hox-)??Qz?S?W??(??[??$$?
+endstream
+endobj
+43 0 obj
+7357
+endobj
+44 0 obj
+<< /Length 45 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /Interpolate
+true /ColorSpace 73 0 R /SMask 82 0 R /BitsPerComponent 8 /Filter /FlateDecode
+>>
+stream
+x???_Y?????]????X?XXMD??(6?
+?4?*bH'!?????????s?1??>?3???I????9????g???????????<_?3?|?0666?l?LNN~???s~zyGn???=_j???????o??f????z??????(>~????{????????????w86??zzz_?|?9o?????????????p5?+?{??9???H3?%1~?????y?f``?l???<????p!+55????????????y?????7m??&?m????#j???		??????\-,,|?????844????O?>!???F??g`????,???????,kqqIFF???"#????
+
+^?j???ak??
+?????m??k??=?{????=&f??m;""????9lMx??5+W???X?f_HI9|???'O?bSSS???,?' E?X`gggyy???????@? ??C
+???
+??@?
+??y\?_?[gg??3@.(x?S!?????n???X????????|}???H?qq???A?m??]h???D?????A?????!S1??????Z,"oi?.????,?6SZ?6r?O???\???	?/(tv"????1Z???K_?@?b?M??#_??}??U???B??????{{???????]"?Tv????O0
+??E??
+????H#??SS?A41?&=?$????7???|?????o??z?
+a?K??x????J??x!:?9???$??y|?5?`?????????A?NP?}I
+?????Z?? ????@8?1r?M??H?
+?vt??|???t
+?????^?kn???L??? ;??????)-J8??'???y?????;In??? ????N?2???rB?[T??9???J??&h~w??????W?`ithVx*g?????Qv?)
+?1r??Z??W?2??o?q>?`?????????????????a?????????;a??^????*???:\????1??{??P???$@????drl%HYT???????4P??c????|??U	???c????????k??q??H?r?L?+\?b<?c????????????Z?s+Q??r???`E???9???/%??pw?|`?h????????;??E}????U???	(???????fkbIQg02x`*H?[???????C?I8????
+du.RW6??;b??=??L7&?
+?;?x?3/kYQ.?i??o??233?^Gz?1l???$?>???k\\<-t	?????????T(!?;H??P?+?K????s??z??()???D%??{'?in??K?F?9? ??N???u?????54
+?fL?9)?\f???x??6?9[?n<k
+??????g?a??A+??v=./?)???l?P/;$j???????????7??y?6x?;?????\?ux;??j?f?f???t/??G?6??x*??{????FW??<d????`??l????Z?CBV??z????????f????w????D??H???+HK'????ml???V???y???g?????K???l????7??X??W?SR???????[QQ?+W?^?6?Xv?j6^???K)^;U?j?)M at F???]?????g?N??7?uF???????7RRo????d???????x*?6
+%?@??@?3p??O8?]{{??????[?Hy6$!???K?x?
+SL???,?(&?U>}????,/??%???;?? j?????????|@n?i???w?(??????+w????2T49??'?!??L?s?.???|;??t?8	]dt?8q??????y???UU????Fc??@?___ZZ??Q??G???sr??I?A??????c?`?n??72O?,??26v??3g???A?Z1?Jo?L??`],Gx	?Z?/???{	s?+?(u?K??
+??g?-d?????<?fg|N?Y??T! 6????iO??&?@?8F,S?SS?~
+6F??X?d??
+?E?LR??T?.0=??3t??????JKC???5?"?:??NC??]?4(E?+??? ?????????????]?????^!????hG??P?e????}?qX?:??}$e?+vn67?S?h????=???_?}?U?J???o?2_x??FG?V????z??G?r??c???)???UJz?9;??L??e($
+???t?Q?8UTT???X?????4??O.??&??B???????}??\?"??S?t?J?E?JY????(y?y??y?????L"???[oYy??????{0??xD_??')Rx?????~?s??%?????2???!???jaR$?;y??A??U???W?d~?
+T??U$?\??pJ-??b
+u?z6,,??:?9?j????a?}l~{?`?????I??r??ZBV#pv???g3v??U4???u?6?
+K???4?%	{?,??;?
+?????X/3?????M????s?uuu?zjJ4?q????
+?NE??B??????$????9@?UUO???;w1?>Da??BZ?1?? VW?h4Z?????L3?S?^?y???1?|??jJW??/xp???.;??;??C??r? |??	7n???&?	<#?i?xR`??*?d?J?J'|K???U???r?>????H?8?q2Te?B????^??bH?%??mK??M??`3?W?
+^?W????FFF>|???????m13f2???#?U?|???????<?A?VR=09?Z???!B???/$}?h???s7E:L&???5;p????P???@Xoz?I???@?BJ??N??)?????J??7m???F?xu????x?F?i?j??$?v????a?<*?1)??t|?p??h?L3??<u?,??b<?9?a??
+??&F?4???SE*q??GY)?????>>?UU????|??a	(2Tjd??o&???S???J~??!s@??
+??"????b?h????????<??k2????\??l?Ov?uo?@????G2???????j*@??Ad?1O?LU?t?{??ju?Dg`e?\?5Sz_{{?#?/^h?LL?Agj:?7_%??{X?.?K8]?F ?9''??;~pCM@??`????0?2]??????\g`??[??????Wn?l??-???????v?y??U??
+J
+??h?$J|?m?W??X?v?63????00s???
+2?AEEUTt!????	X" ?O??\
+ZI?PRR?c??m?:K0?^%???????fZ;??@N	SZ?DMX???`??
+???????f8%d???Ymbb2
+7E6: ??e^%d?????7	<???????Q?^??3$?(-+??/. 0???i??YNg??c???6????5n?;????????\O????a??Zg?#r?v:6i?&??x?=?|8???.}9?Oqq????K??^????tL?;j?`z\^y?pZ??0_????H?????H?O?,????K?%0? ??udM8v?&???Y??.B?L\n?w\???@D?L~u?\&m'?1???*?lH??zT1?<PQ?/??=^?>??P???W??B???9d?/??%?????hf??+?
+O??#??T???&?p??!??~L?$a?????OHH?????c?l???????	?"?Wt?Q
+\??	??+?(I?b??N?yZ{7'?h?1|,Z`$?N?By,?Q5N?k2???????????Y??EE?????????y?
+!8???q +???^Q*}?????"????!6a?`WX3%[???m??tn?h???A????N?}E??*??N??^ddd??1????e????R???t???????>?Z-???????	f?????????k???
+??????~???o???????|?Jmm-??:]$8?zY??!???????/??w??CK'??;?	'??s??+?????c?V??[???8r$???????]??<?U\???uM??|?????
+???K&&(JJ?Hox-)??Qz?S?W??(??[??$$?
+endstream
+endobj
+45 0 obj
+7357
+endobj
+80 0 obj
+<< /Length 81 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???
+???@?$C???P?a?!@Df(?0? "3h?d?
+4L2??&Dd?
+?"2C??I?
+endstream
+endobj
+81 0 obj
+137
+endobj
+78 0 obj
+<< /Length 79 0 R /Type /XObject /Subtype /Image /Width 166 /Height 86 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???;[???I?@"4$B?i?6=Ai?)=NQC?A??xGp? ?VMU?<?!?s?????????;??}|?X????????????L?q??E?????????????`???o`1Bo___?H$?/"?
+???G"m??Q`?$?2?J??? &?
+
+b???4???@??8??#?B?1???.????(???s8,&#???	F"??
+??"?H,??Mb?X$
+?
+?!?8}~d'	????`?BQD???L#?Q11?2?yi?D?fR?$??{UG?`$??
+?E?L????LLJJ?QII?Je|?B}>R$??4
+??=L????	?Q??8er?U?Z????????kWS??q?hi???aR????A?S???(*Z???Rgde??j4?ZU?????d????JQ^???B?,:???m7Q???Jd
+e?:3;O[T\RZV??UT<?I:]yYiI?]??V??J?E?D?c?????G??ya?1q)??m?}]????u
+z}?MM?U????
+?u??*J????P?&???|`}????c$?D??xa?X????????k????`h?
?#?(\xN??0?X??xV?)??sy|????A<?
+?`??~?F?o???Q??~??"??C,<?F?P8???-?Iz??5ER@??"?$????????@?^I?s?????
+????XA??
+endstream
+endobj
+79 0 obj
+2681
+endobj
+82 0 obj
+<< /Length 83 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???
+???@?$C???P?a?!@Df(?0? "3h?d?
+4L2??&Dd?
+?"2C??I?
+endstream
+endobj
+83 0 obj
+137
+endobj
+71 0 obj
+<< /Length 72 0 R /Type /XObject /Subtype /Image /Width 166 /Height 102 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???SRi
+mE?R??+??1e?4 &??aJ	T????M??ZXTr???????TWU\,->k5?????c3???t&'%??e???W:??5???? ?????k????B???A?AJ?R?(WiM?rgC??v?o	x?t?v?\??(=k????:?&???????.w??^???@8????t{????
+G?1?DxoL:????'?????F?????8<2:F8?#?}??????6?N%O??e3??~?l(>Q??[?*\?????'?MM????????z<??j{?AsB"?8?)H II7ZK??n?h|bf?Yp?p??f'??tw?????T&M???<]p??Fg????????$??"8?5>??mo?d3iS?B>????\?09?????-_?????????o???7+K????????-:?TG?IU:???M?{?Of??k??H??????????????9z?L?KUY9???=}????x????????q+??????c???????b??KX,S?s?WZ;?#S????????]???????Jpz??gWM?5[?8&???l???NW?C?}?B8?w?C?K?????4/:%??E??4Hy?+06????????|???????s??7????E????J??yP.q???L??????r?K?e?%?\??K\?0/S.1??:?\???y?r???!??.???KL=?)??ta^?\b??uH????2?S?C?%.]??)??zpR.q???L??????r?K?e?%?\??K\?0/S.1??:?\???y??2??
+?6??F?~J?.?????w??vv???????Wh???%Gz????N???????7??????
+m???c4u??m??[OEU??>?]\Y?|??pB6??Z??u??N?e{?^}?O??b??Vq?vw`db??????M??X_{?|ajl???TY?M?tA?Tx????{8>??????k?Y]]^Z?~:????xf???6??fc^??????????Bp?9?,???z?(??Sk????F?~?2?M3?W]uyz?>????#????_???:??A??HK???E?2??d?P??~????????$062<????u????3:???-?????V{E]?????^`????????????????e??(?:SaIE???v??????p|>?????XWUf;??j???&8?!?d??`)t\??mhjis?$W[KSC]?%?-?
+??"?`????.U^v???@??rU?y???3??TYb?B!??@?`??3???"????JK?E??cVz?\??RX??bb??,g? ?:Sg8e??Z??I ??k1?????(ea\?r&?Ng?y???"U?#$?!?H?C?63]?z?{??????
+	]tq??b?T~??ir?L???.??L&X?Ap?@?
+endstream
+endobj
+72 0 obj
+1902
+endobj
+76 0 obj
+<< /Length 77 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???
+???@?$C???P?a?!@Df(?0? "3h?d?
+4L2??&Dd?
+?"2C??I?
+endstream
+endobj
+77 0 obj
+137
+endobj
+69 0 obj
+<< /Length 70 0 R /Type /XObject /Subtype /Image /Width 168 /Height 86 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???7????I?@"4$B?ic?'(?!???"j??"?Rm?e8??AT??*j??t??>??Ht?gIr?]????~??>{??????????????????????????.?????b??^???8<Op??x\???*+2q??/?H"??d?C ??D_oa?W???|?$2??J???W@
+???*?QIj
+b?9?C?????@?A??#??????K"??Jg?y?|~?@ 
+?(?P(????y? BE?^????i?K??19<? ,\|Y"????:TQQ??eq?H?	d????{?G?`&????"?D*?'?OHHt??????4?r???b?($??{???/???#$?1???T?R????h?+?7RS?1?Hq?????}??a???? ? "R&OR(3??srU???CU??R??d????H?_???*???mGQ?????$2y?23;O]T\RZV??TT<r?**4???????j??,????????????LerB??b??Y9???????O???F???Y'?j?
+?u???*J????R??I??\???=<???&?@?28!?hyj?]????
+???????::Az?????{??yk??I???^N?"^&p?T????EU'??l???????????M?????7???????n??ys]??8??2Q&?0?Ih??1U???????v??GO??;{??GF???F???????=<d???7??,Qg#P>??G????E??N??E?o?V?T??v??MLNMM????:Tp???S???G?:??5????	R??@T???`'T?#???UPR?}???l|?vv~??????????~a~v??q????XS????K?<???p?Pwo????%g?Ti??F'???/????o m:L???k?+???f^?
+??h?))?J????x{???????
+"???????=4>5????????????loo??,?OT[U??? 
+C????V???NdgJ???Ik??????????G??????P??2?v???,?5u??i
+o????A42???=?}(t?@"W??Q??a???=????|xx?p???}????????}??UZ|??K???l?????<QtR?????gxrnyc???????????%??????o??{?PQ??"?????v???????????????????3P????A:???????igcifb????A???+?l?`??0=?X???????????o?? ??aOP????????????????(!?N????+Q??0ib?Z????????
+???ht+??????4c4th+??e"?????<?}?????????????{????;?J????07??8??5?%??w?????uI|
+?g?????????G????S?#?'T??????E?e~ ????nL8??.?(???????YX??d???,????M;k??Fa???)?XHv?O??J?~?}???ot
+?????????]??Y_?J?G
+?$?????'????*?C?hq}?dv:'ZM???{?3
+:?? -?
+]%1?3s
+h?k??M?-.Ps????ZSR????????l???k?ER?e?
+??WTV?D????Tw2??pk??z?eI?@,\??H??????W?????????'??T??$?C Deb?????2=#3?%????T?$??"?C?,?,??\nn?N?<%
+@? My5V?????%%&?c?EG?!c???A?>?????A?O6/D(_?DI?e.Q?TyE.	f3i~??uz??Y??
+??w???????e&?
+endstream
+endobj
+70 0 obj
+2680
+endobj
+74 0 obj
+<< /Length 75 0 R /Type /XObject /Subtype /Image /Width 81 /Height 103 /ColorSpace
+/DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >>
+stream
+x???
+???@?$C???P?a?!@Df(?0? "3h?d?
+4L2??&Dd?
+?"2C??I?
+endstream
+endobj
+75 0 obj
+137
+endobj
+84 0 obj
+<< /Length 85 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >>
+stream
+x??wTS????7??" %?z	 ?;HQ?I?P??&vDF)VdT?G?"cE??b?	?P??QDE???k	??5?????Y??????g?}??
+E?6<~&??S??2????)2?12?	??"???l???+????&??Y??4???P??%????\?%?g?|e?TI?
+???6'~?khu_
+???h???s?2z???\?n?LA"S???dr%?,???l??t?
+4?.0,`
+?3p? 
+A1?v?jp
+??K0??i???A????B?ZyCAP8?C???@??&?*???CP=?#t?]???? 4?}???a
+?
+????'?	Zk?!? $l$T????4Q??Ot"?y?\b)???A?I&N?I?$R$)???TIj"]&=&?!??:dGrY@^O?$? _%??P?(&OJEB?N9J?@y at yC?R
+?n?X????ZO?D}J}/G?3?????????k???{%O???w?_.?'_!J????Q?@?S???V?F???=?IE???b?b?b?b??5?Q%?????O?@???%?!B??y???M?:?e?0G7??????????	e%e[?(?????R?0`?3R????????4??????6?i^??)??*n*|?"?f????LUo????m?O?0j&jaj?j??.?????w???_4????????z??j???=????U?4?5?n??????4??hZ?Z?Z??^0????Tf%??9?????-?>???=?c??Xg?N??]?.[7A?\?SwBOK/X/_?Q??>Q?????G?[??? ?`?A???????a?a??c#????*?Z?;?8c?q??>?[&???I?I??MS???T`????k?h&4?5?????YY?F??9?<?|?y??+=?X???_,?,S-?,Y)YXm????????k]c}??j?c????????-?v??};?]???N????"?&?1=?x????tv(??}?????????'{'??I???Y?)?
+????-r?q??r?.d.?_xp??U???Z???M???v?m???=????+K?G???????^???W?W????b?j??>:>?>?>?v??}/?a??v?????????O8?	?
+?FV>2	u?????/?_$\?B?Cv?<	5]?s.,4?&?y?Ux~xw-bEDC??H????G??KwF?G?E?GME{E?EK?X,Y??F?Z? ?={$vr????K????
+??.3\????r???????_?Yq*??????L??_?w?????????+???]?e???????D??]?cI?II?OA??u?_????????)3????i?????B%a??+]3='?/?4?0C??i??U?@??L(sYf????L?H?$?%?Y?j??gGe??Q??????n?????~5f5wug?v????5?k????\??Nw]???????m mH???F??e?n???Q?Q??`h????B?BQ??-?[l?ll??f??j??"^??b????O%????Y}W???????????w?vw?????X?bY^????]????????W??Va[q`i?d??2???J?jG???????????{?????????m???>???Pk?Am?a??????????g_D?H???G?G????u?;??7?7?6??????q?o???C{??P3???8!9??????<?y?}??'?????Z?Z???????6i{L{??????-???|???????gK?????9?w~?B??????:Wt>?????????????^??r?????U??g?9];}?}?????????_?~i???m??p???????}??]?/???}???????.?{?^?=?}????^??z8?h?c???'
+O*????????f??????`???g???C/????O????+F?F?G?G?????z???????????)???????~w??gb???k????J???9???m?d???wi?????????????c?????O?O????w|	??x&mf??????
+endstream
+endobj
+85 0 obj
+2612
+endobj
+73 0 obj
+[ /ICCBased 84 0 R ]
+endobj
+86 0 obj
+<< /Length 87 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >>
+stream
+x?T?kA?6n??"Zk?x?"IY?hE?6?bk??E?d3I?n6??&??????*?E????z?d/J?ZE(??(b?-??nL?????~??7?}ov?
+Y?<??)?t??????9Nyx??+=?Y"|@5-?M?S?%?@?H8??qR>?????inf???O??????b??N?????~N??>?!???F????????a?????=5??`???5?_M'?Tq?.
+????V?J?p?8?da?sZHO?Ln???}&???wVQ?y?g????E??0?
+HPEa??P@?<14?r?#??{2u$j?tbD?A{6?=?Q??<?("q?C???A?*??O?y??\??V????????;????????sM^|??v?WG??yz?????W?1??5??s???-_???)???U??K?uZ17??l;=?.?.??s???7V??g?jH??????U?O^???g??c?)1&v??!???.???K??`m????)?m??$?``???/]?[x?F?Q???T???*d4??o??????????(/l????mSq??e?ns???}??nk?~8?X<??R5? ?v?z?)?????9R?,?????bR?P?CRR?%?eK??Ub?v???n?9B???Je???????R???R?~N????o???E
+endstream
+endobj
+87 0 obj
+737
+endobj
+8 0 obj
+[ /ICCBased 86 0 R ]
+endobj
+88 0 obj
+<< /Length 89 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >>
+stream
+x?T?kA?6n??"Zk?x?"IY?hE?6?bk??E?d3I?n6??&??????*?E????z?d/J?ZE(??(b?-??nL?????~??7?}ov?
+Y?<??)?t??????9Nyx??+=?Y"|@5-?M?S?%?@?H8??qR>?????inf???O??????b??N?????~N??>?!???F????????a?????=5??`???5?_M'?Tq?.
+????V?J?p?8?da?sZHO?Ln???}&???wVQ?y?g????E??0?
+HPEa??P@?<14?r?#??{2u$j?tbD?A{6?=?Q??<?("q?C???A?*??O?y??\??V????????;????????sM^|??v?WG??yz?????W?1??5??s???-_???)???U??K?uZ17??l;=?.?.??s???7V??g?jH??????U?O^???g??c?)1&v??!???.???K??`m????)?m??$?``???/]?[x?F?Q???T???*d4??o??????????(/l????mSq??e?ns???}??nk?~8?X<??R5? ?v?z?)?????9R?,?????bR?P?CRR?%?eK??Ub?v???n?9B???Je???????R???R?~N????o???E
+endstream
+endobj
+89 0 obj
+737
+endobj
+46 0 obj
+[ /ICCBased 88 0 R ]
+endobj
+90 0 obj
+<< /Length 91 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >>
+stream
+x?ZgT]??=y```?i?9??s$	Hr?( ("r%?	???JQ?$AA?? * ?6???????????9??t??Uw??????
+???L?6
+??A
+@)(??2?M???N??0??3?????? ,D?H;D??!IHR?t c???\ O?
+???D(
+??r???5@?P??@??3?5?m"Z3?!??A?"?{????G?!?#???Z?u?]?
+*??",$? ?&?,? B1?9'2*?U???????I??;.vG????????6?w?v?o%??v??%oJ~??r????+?&-.?!?'?/?CFQ&P????,???l?l??9.9;??r?r??r?????O?
+f
+)
+?
++??>?e??JD%3?CJ?J_??????+??p?8??Ry??Q5PMVmS??&??V???.???~F}Z?M?A#W??&????Q?>-???V?V?6???}P???O?d?;:?uuu?v?=}?Cz=?h}S?L???.??QCVCg???sF?F?KF????????[&z&&?????%?sf?f?f?f_?5?S??,?--N[,XJX??l?VfV??&?????7w???5nC???i??nkl{?vj?????mv(;?R??????????W6Ms???????0?????????s??k5??.??B?T???L{}?6?!?????????/y?z???'?/y????'?????+???7?????C???????u?m??)??z????_??????!
+bER??????4?j?q??:?YT=s??|???.??v?ri????????Z?????W??,^u???N???^??Lc????????M?M????w??\?z]????G[?????????m?m?oZ????s??]???????w8?????{??q?c?3?s?+??u?_?B????{.?&z?{?????????~???@??]???C?C???]
+v???>2}??????????1???q???	???'?'?'C'W???6?? g2g?g??r<=;'4W3/???L????V?G\?W_$?D?<???T?,?\?J?U?k??o<??y?v?]?{????>?~4?8???????U??????k?T??}????k????????k6?7?o?l?????*?!???O????ac?????X?o,?7??????????????^?^?b$|D???z
+???????a?#???G???
+?G??<9??
+?Y?GT?????.?xz??,[9?X?T??9?j????]??x9?&?6????qu???R????Q?G?k	h??y?t?e?n|[???]??N?.D?f?j??{c?}}w????
+?27<???|D???o??F;?*?3'??OJM?O?N????=??s?W}??l??????8_????L~?z??z?M???w	??>X}T?D^!?|]]?<?????k????????????"~???6???5?8???0???K?-????U?	?
+?B?"????#?#z?e?6?\?(|#??
+
+f?????????op??\\??d?s<<md??^??|I?$??:#?!?P?????H?(?h???-??????????H_?q?E???Q????*??&+?P?R	QUQ?????5|4???Z?7u?t??????o
+G??_1)3?0?4?Z?[?XUZ??????hGc/?`??tb?u?YW?^7O?"?QO???w?O?????8?78 ?3?)< ?~$w??|?a??x??????SRo????:r?(wVq6??????:r??z?~->V?z?LR?@???C?b?_^,?l[??Jw]B?z?v?????6?[P??;M?]zl{?????????z?=???N?Yg%?t?y,$??[j5??^?c?J???????7??&??h???^??Cx!??L??
+???
+?????:?I?m?J??L??%-)????m?+??UpRTVbW?V~a_W;?~X#T?Q?L[CGR?S????`??p?h?x?d???????E??V?06???????????????@?B{???<?x?{Yx??<????L	??t????H???T?vlE<*!??l?I?????4?????#???Y?????8u8??^?Tx?X???i???????+??T\???}?r?????C
+??-?????q?U???-???;?;?:?w[?<?u??r?v`}0~h????????]???O^LNW??=??;8???`?H}Q?rxi??k?7?o???7?`?????
+???????Q??G?u???
+??????????8?r?6~x???S???m???????y
+??e????4??1?????`v?EPm??''??1??S????????k?
+endstream
+endobj
+91 0 obj
+6030
+endobj
+68 0 obj
+[ /ICCBased 90 0 R ]
+endobj
+92 0 obj
+<< /Length 93 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>
+stream
+x?ROHQ??6??A?x?w
+	?)????vuY?m[???g????3???5??]?<u?ct????????K? ? <u?????(?oy;????~?{Dm???;)ATsC?+??nNM??)E?NX???bq?????????g??????v??=??e`!?-???!?f
+?]???%?{w??;??9\?Ir???<	X}??I<>?U?w???????(??g?R?Vz?W?O?????el??~?v?{|???u??><??z?9???UaVqe???2???'9????YXk?v???L?(?>???U?????E?P>,l%?KTn)??=?J?+?
+endstream
+endobj
+93 0 obj
+704
+endobj
+15 0 obj
+[ /ICCBased 92 0 R ]
+endobj
+4 0 obj
+<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 3 0 R ] >>
+endobj
+94 0 obj
+<< /Type /Catalog /Outlines 2 0 R /Pages 4 0 R /Version /1.4 >>
+endobj
+67 0 obj
+<< /Length 95 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+95 0 obj
+177
+endobj
+66 0 obj
+<< /Length 96 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+96 0 obj
+177
+endobj
+65 0 obj
+<< /Length 97 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??V
+?+?K??\
+endstream
+endobj
+97 0 obj
+150
+endobj
+64 0 obj
+<< /Length 98 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??V
+?+?K??\
+endstream
+endobj
+98 0 obj
+150
+endobj
+63 0 obj
+<< /Length 99 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+99 0 obj
+177
+endobj
+62 0 obj
+<< /Length 100 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+100 0 obj
+177
+endobj
+61 0 obj
+<< /Length 101 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+101 0 obj
+177
+endobj
+60 0 obj
+<< /Length 102 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+102 0 obj
+177
+endobj
+59 0 obj
+<< /Length 103 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??V
+?+?K??\
+endstream
+endobj
+103 0 obj
+150
+endobj
+58 0 obj
+<< /Length 104 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+104 0 obj
+177
+endobj
+57 0 obj
+<< /Length 105 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+105 0 obj
+177
+endobj
+56 0 obj
+<< /Length 106 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+106 0 obj
+177
+endobj
+55 0 obj
+<< /Length 107 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+107 0 obj
+177
+endobj
+54 0 obj
+<< /Length 108 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+108 0 obj
+177
+endobj
+53 0 obj
+<< /Length 109 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+109 0 obj
+177
+endobj
+52 0 obj
+<< /Length 110 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+110 0 obj
+177
+endobj
+51 0 obj
+<< /Length 111 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+111 0 obj
+177
+endobj
+50 0 obj
+<< /Length 112 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??V
+?+?K??\
+endstream
+endobj
+112 0 obj
+150
+endobj
+49 0 obj
+<< /Length 113 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+113 0 obj
+177
+endobj
+48 0 obj
+<< /Length 114 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+114 0 obj
+177
+endobj
+47 0 obj
+<< /Length 115 0 R /Order 1 /Encode [ 0 1364 ] /FunctionType 0 /BitsPerSample
+8 /Decode [ 0 1 0 1 0 1 ] /Domain [ 0 1 ] /Range [ 0 1 0 1 0 1 ] /Size [ 1365
+] /Filter /FlateDecode >>
+stream
+x??gB?
+endstream
+endobj
+115 0 obj
+177
+endobj
+2 0 obj
+<< /Last 116 0 R /First 117 0 R >>
+endobj
+117 0 obj
+<< /Parent 118 0 R /Count 0 /Dest [ 3 0 R /XYZ 0 553 0 ] /Title (Canvas 1)
+>>
+endobj
+118 0 obj
+<< >>
+endobj
+116 0 obj
+<< /Parent 118 0 R /Count 0 /Dest [ 3 0 R /XYZ 0 553 0 ] /Title (Canvas 1)
+>>
+endobj
+119 0 obj
+<< /Length 120 0 R /Length1 13584 /Filter /FlateDecode >>
+stream
+x?{y|T???????ff2??2??L???2?$$@??	&@??
+???E"??,?Upa	*CH!@??????b??.???|m?C?3?=?M?$???G??|~or???;??s?9???????"
+Z?4nZ??9H???"g-jY??'W!???jo?&?\B??9??.J???R??.\?w?	??k????N??????DB?:oQ?}????'?=?????G-j????????iY???o?<u????%?y/C?p???????{a:
+???.$ ?t?kBH?T?B,??~?fg???3??K????????k?/???FP?Q?4(n??9??Rc??Um?????$?M??Au
+m??????l?!??<???%???H?"?ON?G?P?r???????
+7?0/L??=N??????vU???xJ?;???<?????l???=T?????+???i[B?Ah???	?<?ua?p?p??/diB@??`
+?N??jQ)????_??????~Tl?H?E??
+??q????????DcO?? ?{??n-A?0/?????D?+aKK???#?	??`??Q(????C??
+k?a?????_%?r??4?__V??l=?!??j???B??xs??f?_?m?BWkeF??	??/^0???W???nh?<?>?Y=??=?`1??F?@??Y?h??Y?k??,?Uy???
+??C??}U???I
+??[??????????C3+?6
+x???g-???gU????g?????&?=?>??>??>kfx??,J|???????tz????F?&F??Ok?x[?z?nh??q???;??????? B??.?<69?	w?b??a?`Q?R ??rt
+=?v??G{???f?m?<^
+?n@??}?C?;MF?h???S?#?????+HD?a?5??v|L?
+|??????p?(:?????? VF??1g?E???Th4PI)iE??[?
+@?q??\<??+?Sx3~??????,#??O???tf9?.{????????????s?_ r?;?R?
+?;?.???f`.'??2\?g?o5?A??]?(?O???????	G??D2Hy??'??????f?i?7???p?p???y??????????e????*VD?L%??D-@?bT???x~`????????;Q/?;pa??|\???v<????c?;)???? 
+?'?$?L???&? ????b?1??:s???\g96?5?#?:??]?n??nv/?????r????n5??[?????.???
+|??gP?c?????:?Af?????T?>}??Ux&???????????b?obV1#I.H?I?]???h%Z?LG???d:?{ )a??h[?\?VX?P.HQ?/J??T_????t?mV??dL6?u?J??c?Qf????	4G????6??}-??rKC3leo?f??????]F?a??A#??????X?-G?Y??j?7??*??O?
+u?????S?P?#F0???????????b?????AU????2w???L*j????P????t	J???xr
+?o???nv???;????9t?v4?
+???y???3,??r?)'
+?r3??2?q
+?"???pU#????q
+?S ???0*?S?x?|k???s^:?$f?e5L???A?????"?::t?%?=
+n?5? :?????B???H>	?j?<-??)Q???{??
+wl?e???8\?m8<?[q???.??(????8<|
+??_R2??????'?q?!??????F?-q?????u.y??m?	f7??p????????%???N:.sp[???`?
+k ?M?B?Gv??/???<???~q???!/????&DJ	??3?T????!sb????w-y.?}>6???>??????Fc??8??-2?
+7V?????1c?????1????????\T?J?d????<L??d+!!e??DY?I??v"?gk?3&*???E?;???a?????????c?????flz@???b?ZZ
+?+T?$??????`)???A??wvL?2uv?????WD??g?r?</5-]??6-I??I_X\?}b???b??_??l??llw?;q=?^?6???ua???^V??o|_??g@??eyQ???q.???-8?G??	?J???? ?"/??R?y?0??kW"?T ?J?S??~?"???X*?	Jhi)?6;c??????\?? /??????o?I'?P at z??????w
+tz?#c????/(?I#3+??Rw?V??O????)?R;4%5E??N??????P#??P??V???x?rs?V??N????=~}?????wJ?T???A_ZJ??A??4-?b}Z???D ?,????L??????K??J?d ????mV??f EP???*?
+e!????N3$?m?,?d!?J?????I>?
+,???????|???\O?MF?Y^???????[(?um????c????????????Iyw\?l?Vv??????}?O?????!????????w?W????,?~???o?l????????9)es?\}g??????????????0l??	??%?u??9?:o??H?EWA???yFt??,Q??????1?1=w????rZP?tt???r`n?%??}.???%"?P?????F?_m?b??f???6P?7?u9(S????P?N ??	??????????F??????????m;?|e?s???b??
++7?$?h-?}Y????p?x'&a<	3??q?`2???=?2?4?70???K8??g
+???tG??????????????Zq?????????,Y? ?????D?}7?GP+.??k@?%?&????8$???r??pIz.V??8?????:?T4??#_HU?tjWY??)#e??~?N?Dg0?????.?te???HU.??;?B(}o?}?#??,?
+?C???(???\b;]????2?I?!???*????^?V???7TZ?S
+?6?.N???????k?????	?]	??W???z{4??k=kq?????/\N?p\@U??Ux?<?` H?@Qa??d?]:???-???E3?&???&??++??{???p??^?_???g????!??????v?5-?n?F???j?9s?B1??5}???????????La???|?/\???l~1_??????s??N|?????=???L???&B'??n?Je?v?=[??CH??Z?D?M?s?J?g?K]S}?>?=???+??1?
+JHL?%???@?#?Z\?
+??Hd?|?????@
+??????????bR~?n2g????{40?4w:????????X,R??_?????><????=o???XD??{?9{lx?u??ieF??F?1?.??q?"8]??? ??]?????O?C???_?D??????]?E???Q?l?_mR?6YTR??5??%??V?5??!QX?
+r?#???U/??}d??m?>??5l??d?F?????E;w}?n?/???O??P??$~???uU!Z????????sp~?H?\:$?\B???,*.;9[??U?ns{?JK+o%?z<??kk?:J??U?9!A6@J?
+
+_m??r?????s???|??w?]??C|??????O.?A??G????g5??k????Cj??Y;??t?n?V??o????0??$qF???d2??a???????9?s??K?}?%?/}?Z>??????t??R???]??? ?%?SP??*?????y?
+>f???b????[??k<(??7a?m^?}????U??W????>v?]??/??g??G?m????~??
+T???<p????&A??X?w ?T?\????$c?Y??608Z?>d1?$?GK?7?6???4wUB??M?g?????(W?1????|p??AdxS??f?E??Ut?S-N?j????k?f??p:!/<??
+7f3?l?+??a?2?S???/)?????ub??AlT<????????q??
+??9%?=?L???!?Mip)????l??d???B?=W?
+j??N[N?-?jo)????/a??4hAy????K??U?T?.?s(??^??P?V???R8???P??I??)I?"?s?
+??J?b??>?K??zP?e???&??QP??|q??+?k?h??|+`???|5v?p???s?????N??{?????F????w?T,?4????
+5??u?????8q`??%??0?T????p&??"X? L?W?W?5$Hz/??JMH	^?)????i???	????N???n???LF8e%?H?oMw?`???u???v??nP???J_h|6:???>?a????T	|??p84Wv
+? ?<??? ?mH`@a+:???L??L??A?????? ik????_???xS?}?=L?;*%???????-S?93q??HL???[>??}??~v$
+???e?(h?$?h?Z??bTL?m?j?J??+?.?MIX?_rY\^@???g??i?L}>&?]????s8??c??`??L????{5???y???]?8I????????	0^6?????]???%??f???????????_??{h??=?l???S?U??L????
+?!????m??H?/???[te?uaza??"????????|????	?QM?Vx????v?nG????????
+???
+???M?6???k??[?-?P
+@j1????c:?]?y???*U????{
+>??4?`0A????`?X9??B?R??????c?ZBc
+??g?@??-??n???x.?#?<8?????B??t]~??????	?A6gnlc??Wcs?y?E
+/Y??R??7?1P]>,s???:?_l	;>???}Y8??RZ????O.?WzG??wj?_?K???Y`??????mE/???W????	?????K????gO??????_?????????+?m?<? |k?	~q.?CE?
+???KQ?F5??u??9???v?;?	?m?d4ME??)yro??\????I??+G?e??.lom???z?t(;?n??2|???E?+
+PP0	`6@???
+endstream
+endobj
+120 0 obj
+8870
+endobj
+121 0 obj
+<< /Type /FontDescriptor /Ascent 770 /CapHeight 717 /Descent -230 /Flags 32
+/FontBBox [-951 -481 1445 1122] /FontName /TPMBKI+Helvetica /ItalicAngle 0
+/StemV 0 /MaxWidth 1500 /XHeight 637 /FontFile2 119 0 R >>
+endobj
+122 0 obj
+[ 278 0 0 0 0 0 0 0 0 0 0 0 278 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 667 722 722 0 611 0 0 278 500 0 0 833 722 0 0 0 722 667 611 722 667 0 0
+0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556
+0 333 500 278 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 500 ]
+endobj
+16 0 obj
+<< /Type /Font /Subtype /TrueType /BaseFont /TPMBKI+Helvetica /FontDescriptor
+121 0 R /Widths 122 0 R /FirstChar 32 /LastChar 222 /Encoding /MacRomanEncoding
+>>
+endobj
+123 0 obj
+(Untitled)
+endobj
+124 0 obj
+(Mac OS X 10.6.2 Quartz PDFContext)
+endobj
+125 0 obj
+(Randall Hauch)
+endobj
+126 0 obj
+(OmniGraffle)
+endobj
+127 0 obj
+(D:20100108233415Z00'00')
+endobj
+1 0 obj
+<< /Title 123 0 R /Author 125 0 R /Producer 124 0 R /Creator 126 0 R /CreationDate
+127 0 R /ModDate 127 0 R >>
+endobj
+xref
+0 128
+0000000000 65535 f 
+0000084257 00000 n 
+0000073944 00000 n 
+0000008387 00000 n 
+0000065205 00000 n 
+0000000022 00000 n 
+0000008367 00000 n 
+0000008491 00000 n 
+0000057216 00000 n 
+0000013046 00000 n 
+0000013510 00000 n 
+0000028686 00000 n 
+0000029115 00000 n 
+0000012595 00000 n 
+0000013026 00000 n 
+0000065168 00000 n 
+0000083892 00000 n 
+0000010387 00000 n 
+0000010033 00000 n 
+0000010563 00000 n 
+0000011773 00000 n 
+0000012417 00000 n 
+0000011241 00000 n 
+0000010209 00000 n 
+0000009855 00000 n 
+0000009533 00000 n 
+0000011097 00000 n 
+0000013530 00000 n 
+0000021087 00000 n 
+0000011597 00000 n 
+0000010741 00000 n 
+0000010919 00000 n 
+0000009181 00000 n 
+0000012239 00000 n 
+0000009003 00000 n 
+0000009357 00000 n 
+0000009677 00000 n 
+0000011419 00000 n 
+0000011951 00000 n 
+0000012095 00000 n 
+0000021108 00000 n 
+0000028665 00000 n 
+0000029135 00000 n 
+0000036692 00000 n 
+0000036713 00000 n 
+0000044270 00000 n 
+0000058112 00000 n 
+0000073530 00000 n 
+0000073116 00000 n 
+0000072702 00000 n 
+0000072315 00000 n 
+0000071901 00000 n 
+0000071487 00000 n 
+0000071073 00000 n 
+0000070659 00000 n 
+0000070245 00000 n 
+0000069831 00000 n 
+0000069417 00000 n 
+0000069003 00000 n 
+0000068616 00000 n 
+0000068202 00000 n 
+0000067788 00000 n 
+0000067374 00000 n 
+0000066962 00000 n 
+0000066577 00000 n 
+0000066192 00000 n 
+0000065780 00000 n 
+0000065368 00000 n 
+0000064303 00000 n 
+0000050343 00000 n 
+0000053214 00000 n 
+0000047880 00000 n 
+0000049974 00000 n 
+0000056319 00000 n 
+0000053235 00000 n 
+0000053563 00000 n 
+0000049995 00000 n 
+0000050323 00000 n 
+0000044639 00000 n 
+0000047511 00000 n 
+0000044291 00000 n 
+0000044619 00000 n 
+0000047532 00000 n 
+0000047860 00000 n 
+0000053583 00000 n 
+0000056298 00000 n 
+0000056356 00000 n 
+0000057196 00000 n 
+0000057252 00000 n 
+0000058092 00000 n 
+0000058149 00000 n 
+0000064282 00000 n 
+0000064340 00000 n 
+0000065148 00000 n 
+0000065288 00000 n 
+0000065760 00000 n 
+0000066172 00000 n 
+0000066557 00000 n 
+0000066942 00000 n 
+0000067354 00000 n 
+0000067767 00000 n 
+0000068181 00000 n 
+0000068595 00000 n 
+0000068982 00000 n 
+0000069396 00000 n 
+0000069810 00000 n 
+0000070224 00000 n 
+0000070638 00000 n 
+0000071052 00000 n 
+0000071466 00000 n 
+0000071880 00000 n 
+0000072294 00000 n 
+0000072681 00000 n 
+0000073095 00000 n 
+0000073509 00000 n 
+0000073923 00000 n 
+0000074112 00000 n 
+0000073994 00000 n 
+0000074089 00000 n 
+0000074207 00000 n 
+0000083170 00000 n 
+0000083192 00000 n 
+0000083419 00000 n 
+0000084069 00000 n 
+0000084097 00000 n 
+0000084150 00000 n 
+0000084183 00000 n 
+0000084214 00000 n 
+trailer
+<< /Size 128 /Root 94 0 R /Info 1 0 R /ID [ <281a746dbdd187758d95f82fc3710de2>
+<281a746dbdd187758d95f82fc3710de2> ] >>
+startxref
+84383
+%%EOF
+1 0 obj
+<</Author (Randall Hauch)/CreationDate (D:20080919153500Z)/Creator (OmniGraffle 5.2.1)/ModDate (D:20100108231900Z)/Producer 124 0 R /Title (dna-connectors-0.2.graffle)>>
+endobj
+xref
+1 1
+0000087103 00000 n 
+trailer
+<</ID [<281a746dbdd187758d95f82fc3710de2> <281a746dbdd187758d95f82fc3710de2>] /Info 1 0 R /Prev 84383 /Root 94 0 R /Size 128>>
+startxref
+87288
+%%EOF

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Thumbnail.tiff
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Thumbnail.tiff	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/QuickLook/Thumbnail.tiff	2010-01-09 21:29:50 UTC (rev 1570)
@@ -0,0 +1,174 @@
+MM
+?DbQT
+??8
+?J ?$?*?c?@?V????
+??"??3\??G??????	?)
+a?9[????~?
+N?????X?Bi5?7??@Y?n)?b?Pb?8&?(??L???????2?V?`p???1VT<
+??H?$WX?I^
+??+??
+O???Ze?
+? ???5?v?? TV?????l)??y??R?B?j"#PbV?8?T1??)?p?
+?
+??8c?U-L???CSlSM??Q??uEPBIRD,?T7Tt?UUOT?]U?T?eK5cU"-"??x+?GH?X&B?????1C?O?+U<4T?C??Z`
+?Z??+3?@4!?i6\E?3?i?
+X!???b
+X??"9'~?yvZwo)B???1?N?X!w?(??Jv
+O?^{??.?}Tr?????UV?hv?W?UX$??4"?v'?P?? >>56>,P^?mC?!?,J\gD?-"??y?xV?5U["?d5???A,{??`?"V?j??"a??????&5??#k??t
+?(?4A?
+
+q*
+????`#-g$?S2?%??
+<+?B??h
+?1?8`???.?Gg??1???
+"G???A?vw??d$?u*?e??
+
+?,??mF????2??????q???
+
+ +7BMYep|??????????,9FTao|?????????(7GVet????????$5EVgx???????'9L^p???????/BVj~??????		!	6	K	`	u	?	?	?	?	?	?
+
+"
+9
+O
+e
+|
+?
+?
+?
+?
+?4Kc{?????$=Vn?????
+
+ 
+:
+T
+n
+?
+?
+?
+?
+?'B]x????:Vr????;Xv????
+(Fd?????<[z????9Yz????>_????)Km????=`????5Y}???4Y}???8^????Cj???-T|???Cl???7`???0Z???-X???  0 [ ? ? ?!
+!7!c!?!?!?""B"p"?"?"?#%#S#?#?#?$$:$i$?$?$?%$%T%?%?%?&&B&r&?&?''4'e'?'?'?(*([(?(?(?)")U)?)?)?**R*?*?*?++R+?+?+?,",V,?,?,?-)-^-?-?-?.3.i.?.?//A/w/?/?00R0?0?0?101g1?1?22H2?2?2?3*3c3?3?44H4?4?4?505j5?5?66U6?6?77B7~7?7?818m8?8?9#9`9?9?::T:?:?;
+;K;?;?<<D<?<?==@==?=?>>>~>?>??????@
+
+ +7BMYep|??????????,9FTao|?????????(7GVet????????$5EVgx???????'9L^p???????/BVj~??????		!	6	K	`	u	?	?	?	?	?	?
+
+"
+9
+O
+e
+|
+?
+?
+?
+?
+?4Kc{?????$=Vn?????
+
+ 
+:
+T
+n
+?
+?
+?
+?
+?'B]x????:Vr????;Xv????
+(Fd?????<[z????9Yz????>_????)Km????=`????5Y}???4Y}???8^????Cj???-T|???Cl???7`???0Z???-X???  0 [ ? ? ?!
+!7!c!?!?!?""B"p"?"?"?#%#S#?#?#?$$:$i$?$?$?%$%T%?%?%?&&B&r&?&?''4'e'?'?'?(*([(?(?(?)")U)?)?)?**R*?*?*?++R+?+?+?,",V,?,?,?-)-^-?-?-?.3.i.?.?//A/w/?/?00R0?0?0?101g1?1?22H2?2?2?3*3c3?3?44H4?4?4?505j5?5?66U6?6?77B7~7?7?818m8?8?9#9`9?9?::T:?:?;
+;K;?;?<<D<?<?==@==?=?>>>~>?>??????@
+
+ +7BMYep|??????????,9FTao|?????????(7GVet????????$5EVgx???????'9L^p???????/BVj~??????		!	6	K	`	u	?	?	?	?	?	?
+
+"
+9
+O
+e
+|
+?
+?
+?
+?
+?4Kc{?????$=Vn?????
+
+ 
+:
+T
+n
+?
+?
+?
+?
+?'B]x????:Vr????;Xv????
+(Fd?????<[z????9Yz????>_????)Km????=`????5Y}???4Y}???8^????Cj???-T|???Cl???7`???0Z???-X???  0 [ ? ? ?!
+!7!c!?!?!?""B"p"?"?"?#%#S#?#?#?$$:$i$?$?$?%$%T%?%?%?&&B&r&?&?''4'e'?'?'?(*([(?(?(?)")U)?)?)?**R*?*?*?++R+?+?+?,",V,?,?,?-)-^-?-?-?.3.i.?.?//A/w/?/?00R0?0?0?101g1?1?22H2?2?2?3*3c3?3?44H4?4?4?505j5?5?66U6?6?77B7~7?7?818m8?8?9#9`9?9?::T:?:?;
+;K;?;?<<D<?<?==@==?=?>>>~>?>??????@
+
+?M??	T
+
+??l
+@??????????????0O u!?"?#?%&<'s(?)?+,F-y.?/?1"2\3?4?6
+f"??
+{O#???????}~|?????? ?!?#$6%I&l'?(?)?*?,-0.R/t0?1?2?3?56/7X8{9?:?;?<?=??@AEB?C?D?F1GkH?I?KLQM?N?P	QQR?S?UV]W?X?Z[g\?]?_,`pa?cdFe?f?hiUj?k?mnbo?p?rs\t?u?wxKy?z?{?}/~m?????:?o?????	?1?`?????????)?9?K?e?}?????????????
+
+?O??
+>
+??F??i??d(??yB
+??xG??? T!!!?"?#?$h%/&
+??6?K?R?b?|????????????????????
+??'?5???L?V?a?n?????????????????????1???P?e?}??????????????(?B?^?t??????????;?h???????.?k?????-?z???.?????\???M???n????t?<???(?D????????	???
+
+C
+?
+?=??@??
+O
+?
+k?3??c?7?~?h?X?;???d?J?:?(?#?????   ?!4!?"K"?#`#?$?%%?&D&?'k((?)A)?*?+'+?,m--?.l//?0?161?2?3]44?5?6d7.7?8?9?:Z;'<<?=?>??l at LA2BB?C?D?E?F?G?H?I?J?K?L?NO5PHQrR?S?T?VWEX}Y?Z?\!]d^?_?a1bxc?e'frg?i3j?k?mcn?p;q?st?vw?y!z?|9}?e?????'???v????s?.?????G??????q?i?K?8?0??????"?*?=?[?j??????????F?o??????1?n??????G???????9?l??????L????????r??????
+
+r
+?#}?:??
+^
+?1??m?H?-???????x?v?
+S*TOUrV?W?X?Z[.\`]?^?`a9brc?ef9g?h?jkhl?nohp?rs{t?vCw?y
+zw{?}U~??B???(????????????7???E???_?????!???}?"?????(?????P?????z?9???????g?2????????{?P?A?,?????????????+???^?z????????1?m??????Q??????
+p
+?n?s?
+??4?m?^?s?f?a?w1??T?? I!!?"?#]$/$?%?&?'X(,(?)?*?+|,N-+..?/?0?1w2V3544?5?6?7?8?9?:m;U<H=:>+?@	AA?B?C?D?E?F?G?H?I?J?K?L?NOPQ2RDSfT?U?V?W?YZ$[M\|]?^?`aJb?c?efBg?h?j#kll?nohp?rsvt?v=w?yzl{?}F~??/????}???|???p???y??????????2???E???`?????.???^?????5????????_?????6???b?????$???L???\???w???y???]???U???#?????C?????:?????G?t????????-?5?<?C?I?M?C?3????????k?3?????e????]?????????????a???1???e??
+Color LCD
\ No newline at end of file

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/data.plist	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/data.plist	2010-01-09 21:29:50 UTC (rev 1570)
@@ -0,0 +1,6016 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActiveLayerIndex</key>
+	<integer>0</integer>
+	<key>ApplicationVersion</key>
+	<array>
+		<string>com.omnigroup.OmniGraffle</string>
+		<string>138.12.0.121252</string>
+	</array>
+	<key>AutoAdjust</key>
+	<true/>
+	<key>BackgroundGraphic</key>
+	<dict>
+		<key>Bounds</key>
+		<string>{{0, 0}, {756, 553}}</string>
+		<key>Class</key>
+		<string>SolidGraphic</string>
+		<key>ID</key>
+		<integer>2</integer>
+		<key>Style</key>
+		<dict>
+			<key>shadow</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+			<key>stroke</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+		</dict>
+	</dict>
+	<key>CanvasOrigin</key>
+	<string>{0, 0}</string>
+	<key>ColumnAlign</key>
+	<integer>1</integer>
+	<key>ColumnSpacing</key>
+	<real>36</real>
+	<key>CreationDate</key>
+	<string>2008-09-19 10:35:27 -0500</string>
+	<key>Creator</key>
+	<string>Randall Hauch</string>
+	<key>DisplayScale</key>
+	<string>1 0/72 in = 1.0000 in</string>
+	<key>GraphDocumentVersion</key>
+	<integer>6</integer>
+	<key>GraphicsList</key>
+	<array>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>306</integer>
+			<key>Points</key>
+			<array>
+				<string>{416.504, 341.62}</string>
+				<string>{416.504, 363.883}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{382.504, 418.363}, {69, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>305</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC Database\
+schema}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{396.564, 366.626}, {40.8814, 44.2393}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>304</integer>
+			<key>ImageID</key>
+			<integer>1</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{382.504, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>303</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{382.504, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>302</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC Metadata}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>301</integer>
+			<key>Points</key>
+			<array>
+				<string>{578.925, 342.06}</string>
+				<string>{578.925, 364.323}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{544.925, 418.363}, {69, 28}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>300</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 SVN repository}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{558.985, 367.763}, {40.8814, 44.2393}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>299</integer>
+			<key>ImageID</key>
+			<integer>1</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{544.925, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>298</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{544.925, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>297</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 File System}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>296</integer>
+			<key>Points</key>
+			<array>
+				<string>{496.91, 342.06}</string>
+				<string>{496.91, 364.323}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{462.91, 419.242}, {69, 28}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>229</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 File\
+System}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{476.969, 367.763}, {40.8814, 44.2393}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>295</integer>
+			<key>ImageID</key>
+			<integer>1</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{462.91, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>294</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{462.91, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>293</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 File System}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{648.5, 421}, {62, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>292</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Unified, federated repository}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{638, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>197</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0.5, -0.121622}</string>
+				<string>{0, 0.121622}</string>
+			</array>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Federation}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>233</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+			<key>ID</key>
+			<integer>226</integer>
+			<key>Points</key>
+			<array>
+				<string>{679.601, 335}</string>
+				<string>{708, 390.995}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>197</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{638, 269}, {70, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>198</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{683.5, 390.995}, {49, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>8</real>
+			</dict>
+			<key>ID</key>
+			<integer>233</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, -0.5}</string>
+				<string>{-0.5, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.939516</string>
+						<key>g</key>
+						<string>0.939516</string>
+						<key>r</key>
+						<string>0.939516</string>
+					</dict>
+					<key>FillType</key>
+					<integer>3</integer>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.657258</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Width</key>
+					<real>2</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs16 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>290</integer>
+			</dict>
+			<key>ID</key>
+			<integer>291</integer>
+			<key>Points</key>
+			<array>
+				<string>{675.067, 335}</string>
+				<string>{683.5, 380.995}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>197</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>232</integer>
+			</dict>
+			<key>ID</key>
+			<integer>228</integer>
+			<key>Points</key>
+			<array>
+				<string>{670.54, 335}</string>
+				<string>{665.5, 370.995}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>197</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{659, 380.995}, {49, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>8</real>
+			</dict>
+			<key>ID</key>
+			<integer>290</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, -0.5}</string>
+				<string>{-0.5, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.939516</string>
+						<key>g</key>
+						<string>0.939516</string>
+						<key>r</key>
+						<string>0.939516</string>
+					</dict>
+					<key>FillType</key>
+					<integer>3</integer>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.657258</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Width</key>
+					<real>2</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs16 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>289</integer>
+			<key>Points</key>
+			<array>
+				<string>{246.517, 342.06}</string>
+				<string>{246.517, 364.323}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{216.017, 419.242}, {62, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>288</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Infinispan\
+data grid\
+for storage}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{212.517, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>287</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{212.517, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>286</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Infinispan}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>Group</string>
+			<key>Graphics</key>
+			<array>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>278</integer>
+					</dict>
+					<key>ID</key>
+					<integer>265</integer>
+					<key>Points</key>
+					<array>
+						<string>{262.472, 378.845}</string>
+						<string>{262.61, 383.153}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>283</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>279</integer>
+					</dict>
+					<key>ID</key>
+					<integer>266</integer>
+					<key>Points</key>
+					<array>
+						<string>{247.196, 378.845}</string>
+						<string>{247.334, 383.153}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>284</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>280</integer>
+					</dict>
+					<key>ID</key>
+					<integer>267</integer>
+					<key>Points</key>
+					<array>
+						<string>{231.92, 378.845}</string>
+						<string>{232.057, 383.153}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>285</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>273</integer>
+					</dict>
+					<key>ID</key>
+					<integer>268</integer>
+					<key>Points</key>
+					<array>
+						<string>{262.472, 394.345}</string>
+						<string>{262.61, 398.653}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>278</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>274</integer>
+					</dict>
+					<key>ID</key>
+					<integer>269</integer>
+					<key>Points</key>
+					<array>
+						<string>{247.196, 394.345}</string>
+						<string>{247.334, 398.653}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>279</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>275</integer>
+					</dict>
+					<key>ID</key>
+					<integer>270</integer>
+					<key>Points</key>
+					<array>
+						<string>{231.919, 394.345}</string>
+						<string>{232.057, 398.653}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>280</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>273</integer>
+					</dict>
+					<key>ID</key>
+					<integer>271</integer>
+					<key>Points</key>
+					<array>
+						<string>{252.303, 404.259}</string>
+						<string>{257.009, 404.271}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>274</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>274</integer>
+					</dict>
+					<key>ID</key>
+					<integer>272</integer>
+					<key>Points</key>
+					<array>
+						<string>{237.026, 404.259}</string>
+						<string>{241.733, 404.271}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>275</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{258.009, 399.643}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>273</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{242.733, 399.643}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>274</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{227.456, 399.643}, {8.57002, 9.20475}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>275</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>278</integer>
+					</dict>
+					<key>ID</key>
+					<integer>276</integer>
+					<key>Points</key>
+					<array>
+						<string>{252.303, 388.759}</string>
+						<string>{257.009, 388.771}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>279</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>279</integer>
+					</dict>
+					<key>ID</key>
+					<integer>277</integer>
+					<key>Points</key>
+					<array>
+						<string>{237.026, 388.759}</string>
+						<string>{241.733, 388.771}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>280</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{258.009, 384.143}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>278</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{242.733, 384.143}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>279</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{227.456, 384.143}, {8.57002, 9.20475}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>280</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>283</integer>
+					</dict>
+					<key>ID</key>
+					<integer>281</integer>
+					<key>Points</key>
+					<array>
+						<string>{252.302, 373.259}</string>
+						<string>{257.009, 373.271}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>284</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>284</integer>
+					</dict>
+					<key>ID</key>
+					<integer>282</integer>
+					<key>Points</key>
+					<array>
+						<string>{237.026, 373.259}</string>
+						<string>{241.733, 373.271}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>285</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{258.009, 368.643}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>283</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{242.732, 368.643}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>284</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{227.456, 368.643}, {8.57002, 9.20475}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>285</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+			</array>
+			<key>ID</key>
+			<integer>264</integer>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>223</integer>
+			<key>Points</key>
+			<array>
+				<string>{332.879, 341.62}</string>
+				<string>{332.879, 363.883}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{298.879, 418.363}, {69, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>162</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC Database\
+for storage}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{312.939, 366.626}, {40.8814, 44.2393}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>161</integer>
+			<key>ImageID</key>
+			<integer>1</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{298.879, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>160</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{298.879, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>159</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{641, 370.995}, {49, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>8</real>
+			</dict>
+			<key>ID</key>
+			<integer>232</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, -0.5}</string>
+				<string>{-0.5, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.939516</string>
+						<key>g</key>
+						<string>0.939516</string>
+						<key>r</key>
+						<string>0.939516</string>
+					</dict>
+					<key>FillType</key>
+					<integer>3</integer>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.657258</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Width</key>
+					<real>2</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs16 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{622, 363.495}, {49, 23}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>8</real>
+			</dict>
+			<key>ID</key>
+			<integer>231</integer>
+			<key>Magnets</key>
+			<array>
+				<string>{0, -0.5}</string>
+				<string>{-0.5, 0}</string>
+			</array>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.939516</string>
+						<key>g</key>
+						<string>0.939516</string>
+						<key>r</key>
+						<string>0.939516</string>
+					</dict>
+					<key>FillType</key>
+					<integer>3</integer>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.657258</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Width</key>
+					<real>2</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs16 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>231</integer>
+				<key>Info</key>
+				<integer>1</integer>
+			</dict>
+			<key>ID</key>
+			<integer>227</integer>
+			<key>Points</key>
+			<array>
+				<string>{663.934, 335}</string>
+				<string>{646.5, 363.495}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>197</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>221</integer>
+			<key>Points</key>
+			<array>
+				<string>{158.009, 342.06}</string>
+				<string>{158.009, 364.323}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>ID</key>
+			<integer>220</integer>
+			<key>Points</key>
+			<array>
+				<string>{69.5, 341.62}</string>
+				<string>{69.5, 363.883}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{39, 418.363}, {62, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>219</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Transient\
+in-memory storage}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>Group</string>
+			<key>Graphics</key>
+			<array>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>212</integer>
+					</dict>
+					<key>ID</key>
+					<integer>206</integer>
+					<key>Points</key>
+					<array>
+						<string>{55.9202, 393.476}</string>
+						<string>{56.0722, 397.313}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>217</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>213</integer>
+					</dict>
+					<key>ID</key>
+					<integer>207</integer>
+					<key>Points</key>
+					<array>
+						<string>{80.6832, 393.024}</string>
+						<string>{82.5487, 397.616}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>215</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>214</integer>
+					</dict>
+					<key>ID</key>
+					<integer>208</integer>
+					<key>Points</key>
+					<array>
+						<string>{76.7581, 393.133}</string>
+						<string>{75.1199, 397.825}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>215</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>215</integer>
+					</dict>
+					<key>ID</key>
+					<integer>209</integer>
+					<key>Points</key>
+					<array>
+						<string>{70.4571, 376.753}</string>
+						<string>{75.4277, 383.393}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>218</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>216</integer>
+					</dict>
+					<key>ID</key>
+					<integer>210</integer>
+					<key>Points</key>
+					<array>
+						<string>{67.3577, 377.964}</string>
+						<string>{67.5007, 382.287}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>218</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>217</integer>
+					</dict>
+					<key>ID</key>
+					<integer>211</integer>
+					<key>Points</key>
+					<array>
+						<string>{63.9519, 376.806}</string>
+						<string>{59.0575, 383.555}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Tail</key>
+					<dict>
+						<key>ID</key>
+						<integer>218</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{51.4135, 398.299}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>212</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{80.0165, 398.299}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>213</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{68.5975, 398.299}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>214</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{74.3075, 383.276}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>215</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{62.8875, 383.276}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>216</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{51.4135, 383.276}, {8.57001, 9.20474}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>217</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{62.8875, 367.763}, {8.57002, 9.20475}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>ID</key>
+					<integer>218</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>FillType</key>
+							<integer>3</integer>
+							<key>GradientCenter</key>
+							<string>{-0.0761905, -0.114286}</string>
+							<key>GradientColor</key>
+							<dict>
+								<key>w</key>
+								<string>0.666667</string>
+							</dict>
+							<key>MiddleFraction</key>
+							<real>0.48412701487541199</real>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+							<key>Fuzziness</key>
+							<real>5.7921171188354492</real>
+							<key>ShadowVector</key>
+							<string>{3, 4}</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>archive</key>
+								<data>
+								YnBsaXN0MDDU
+								AQIDBAUIISJU
+								JHRvcFgkb2Jq
+								ZWN0c1gkdmVy
+								c2lvblkkYXJj
+								aGl2ZXLRBgdU
+								cm9vdIABpQkK
+								ExceVSRudWxs
+								1AsMDQ4PEBES
+								XxASTlNDdXN0
+								b21Db2xvclNw
+								YWNlV05TV2hp
+								dGVcTlNDb2xv
+								clNwYWNlViRj
+								bGFzc4ACRDAu
+								NQAQA4AE0hQO
+								FRZUTlNJRBAC
+								gAPSGBkaHVgk
+								Y2xhc3Nlc1ok
+								Y2xhc3NuYW1l
+								ohscXE5TQ29s
+								b3JTcGFjZVhO
+								U09iamVjdFxO
+								U0NvbG9yU3Bh
+								Y2XSGBkfIKIg
+								HFdOU0NvbG9y
+								EgABhqBfEA9O
+								U0tleWVkQXJj
+								aGl2ZXIACAAR
+								ABYAHwAoADIA
+								NQA6ADwAQgBI
+								AFEAZgBuAHsA
+								ggCEAIkAiwCN
+								AJIAlwCZAJsA
+								oACpALQAtwDE
+								AM0A2gDfAOIA
+								6gDvAAAAAAAA
+								AgEAAAAAAAAA
+								IwAAAAAAAAAA
+								AAAAAAAAAQE=
+								</data>
+								<key>b</key>
+								<string>0.5</string>
+								<key>g</key>
+								<string>0.5</string>
+								<key>r</key>
+								<string>0.5</string>
+							</dict>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+			</array>
+			<key>ID</key>
+			<integer>205</integer>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{127.509, 419.242}, {62, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>Vertical</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>ID</key>
+			<integer>158</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JBoss Cache\
+for storage}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{127.509, 370.012}, {62, 39.7404}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica-Bold</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>191</integer>
+			<key>Shape</key>
+			<string>RoundRect</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>FillType</key>
+					<integer>3</integer>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+					<key>MiddleFraction</key>
+					<real>0.48412701487541199</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>archive</key>
+						<data>
+						YnBsaXN0MDDUAQIDBAUIISJUJHRv
+						cFgkb2JqZWN0c1gkdmVyc2lvblkk
+						YXJjaGl2ZXLRBgdUcm9vdIABpQkK
+						ExceVSRudWxs1AsMDQ4PEBESXxAS
+						TlNDdXN0b21Db2xvclNwYWNlV05T
+						V2hpdGVcTlNDb2xvclNwYWNlViRj
+						bGFzc4ACRDAuNQAQA4AE0hQOFRZU
+						TlNJRBACgAPSGBkaHVgkY2xhc3Nl
+						c1okY2xhc3NuYW1lohscXE5TQ29s
+						b3JTcGFjZVhOU09iamVjdFxOU0Nv
+						bG9yU3BhY2XSGBkfIKIgHFdOU0Nv
+						bG9yEgABhqBfEA9OU0tleWVkQXJj
+						aGl2ZXIACAARABYAHwAoADIANQA6
+						ADwAQgBIAFEAZgBuAHsAggCEAIkA
+						iwCNAJIAlwCZAJsAoACpALQAtwDE
+						AM0A2gDfAOIA6gDvAAAAAAAAAgEA
+						AAAAAAAAIwAAAAAAAAAAAAAAAAAA
+						AQE=
+						</data>
+						<key>b</key>
+						<string>0.5</string>
+						<key>g</key>
+						<string>0.5</string>
+						<key>r</key>
+						<string>0.5</string>
+					</dict>
+					<key>Width</key>
+					<real>2</real>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{124.009, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>47</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{124.009, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>46</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JBoss Cache}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{35.5, 269}, {69, 29.0002}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Color</key>
+				<dict>
+					<key>w</key>
+					<string>0</string>
+				</dict>
+				<key>Font</key>
+				<string>Helvetica</string>
+				<key>NSKern</key>
+				<real>0.0</real>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>45</integer>
+			<key>Shape</key>
+			<string>Bezier</string>
+			<key>ShapeData</key>
+			<dict>
+				<key>UnitPoints</key>
+				<array>
+					<string>{-0.5, -0.5}</string>
+					<string>{-0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, -0.5}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.5, 0.499996}</string>
+					<string>{0.166667, 0.499996}</string>
+					<string>{-0.333334, 0.500008}</string>
+					<string>{-0.5, 0.499996}</string>
+					<string>{-0.499999, 0.499996}</string>
+					<string>{-0.5, -0.5}</string>
+				</array>
+			</dict>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.284764</string>
+						<key>g</key>
+						<string>0.341238</string>
+						<key>r</key>
+						<string>0.527916</string>
+					</dict>
+					<key>GradientColor</key>
+					<dict>
+						<key>w</key>
+						<string>0.666667</string>
+					</dict>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>CornerRadius</key>
+					<real>9</real>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Connector}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{35.5, 298}, {69, 37}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>ID</key>
+			<integer>43</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Color</key>
+					<dict>
+						<key>b</key>
+						<string>0.441947</string>
+						<key>g</key>
+						<string>0.595697</string>
+						<key>r</key>
+						<string>0.630182</string>
+					</dict>
+					<key>GradientCenter</key>
+					<string>{-0.0761905, -0.114286}</string>
+					<key>MiddleFraction</key>
+					<real>0.4841269850730896</real>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Fuzziness</key>
+					<real>5.7921171188354492</real>
+					<key>ShadowVector</key>
+					<string>{3, 4}</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf250
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 In-Memory}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+		</dict>
+	</array>
+	<key>GridInfo</key>
+	<dict/>
+	<key>GuidesLocked</key>
+	<string>NO</string>
+	<key>GuidesVisible</key>
+	<string>YES</string>
+	<key>HPages</key>
+	<integer>1</integer>
+	<key>ImageCounter</key>
+	<integer>2</integer>
+	<key>ImageLinkBack</key>
+	<array>
+		<dict/>
+	</array>
+	<key>ImageList</key>
+	<array>
+		<string>image1.jpg</string>
+	</array>
+	<key>KeepToScale</key>
+	<false/>
+	<key>Layers</key>
+	<array>
+		<dict>
+			<key>Lock</key>
+			<string>NO</string>
+			<key>Name</key>
+			<string>Layer 1</string>
+			<key>Print</key>
+			<string>YES</string>
+			<key>View</key>
+			<string>YES</string>
+		</dict>
+	</array>
+	<key>LayoutInfo</key>
+	<dict>
+		<key>Animate</key>
+		<string>NO</string>
+		<key>circoMinDist</key>
+		<real>18</real>
+		<key>circoSeparation</key>
+		<real>0.0</real>
+		<key>layoutEngine</key>
+		<string>dot</string>
+		<key>neatoSeparation</key>
+		<real>0.0</real>
+		<key>twopiSeparation</key>
+		<real>0.0</real>
+	</dict>
+	<key>LinksVisible</key>
+	<string>NO</string>
+	<key>MagnetsVisible</key>
+	<string>NO</string>
+	<key>MasterSheets</key>
+	<array/>
+	<key>ModificationDate</key>
+	<string>2010-01-08 17:19:41 -0600</string>
+	<key>Modifier</key>
+	<string>Randall Hauch</string>
+	<key>NotesVisible</key>
+	<string>NO</string>
+	<key>Orientation</key>
+	<integer>2</integer>
+	<key>OriginVisible</key>
+	<string>NO</string>
+	<key>PageBreaks</key>
+	<string>YES</string>
+	<key>PrintInfo</key>
+	<dict>
+		<key>NSBottomMargin</key>
+		<array>
+			<string>float</string>
+			<string>41</string>
+		</array>
+		<key>NSLeftMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSOrientation</key>
+		<array>
+			<string>int</string>
+			<string>1</string>
+		</array>
+		<key>NSPaperSize</key>
+		<array>
+			<string>size</string>
+			<string>{792, 612}</string>
+		</array>
+		<key>NSRightMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSTopMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+	</dict>
+	<key>PrintOnePage</key>
+	<false/>
+	<key>ReadOnly</key>
+	<string>NO</string>
+	<key>RowAlign</key>
+	<integer>1</integer>
+	<key>RowSpacing</key>
+	<real>36</real>
+	<key>SheetTitle</key>
+	<string>Canvas 1</string>
+	<key>SmartAlignmentGuidesActive</key>
+	<string>YES</string>
+	<key>SmartDistanceGuidesActive</key>
+	<string>YES</string>
+	<key>UniqueID</key>
+	<integer>1</integer>
+	<key>UseEntirePage</key>
+	<false/>
+	<key>VPages</key>
+	<integer>1</integer>
+	<key>WindowInfo</key>
+	<dict>
+		<key>CurrentSheet</key>
+		<integer>0</integer>
+		<key>ExpandedCanvases</key>
+		<array>
+			<dict>
+				<key>name</key>
+				<string>Canvas 1</string>
+			</dict>
+		</array>
+		<key>Frame</key>
+		<string>{{88, 198}, {868, 901}}</string>
+		<key>ListView</key>
+		<true/>
+		<key>OutlineWidth</key>
+		<integer>142</integer>
+		<key>RightSidebar</key>
+		<false/>
+		<key>ShowRuler</key>
+		<true/>
+		<key>Sidebar</key>
+		<true/>
+		<key>SidebarWidth</key>
+		<integer>120</integer>
+		<key>VisibleRegion</key>
+		<string>{{22, -90}, {733, 733}}</string>
+		<key>Zoom</key>
+		<real>1</real>
+		<key>ZoomValues</key>
+		<array>
+			<array>
+				<string>Canvas 1</string>
+				<real>1</real>
+				<real>2</real>
+			</array>
+		</array>
+	</dict>
+	<key>saveQuickLookFiles</key>
+	<string>YES</string>
+</dict>
+</plist>

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/image1.jpg
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/image1.jpg	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.graffle/image1.jpg	2010-01-09 21:29:50 UTC (rev 1570)
@@ -0,0 +1,385 @@
+????
+
+
+
+??
+
+
+s?95}3?
+?c?
+u:W??M??2k?W5???????+?????}Q???_???????)$??nm??
+?????
+I$?????%(????????kF???
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.print.PageFormat.PMHorizontalRes</key>
+	<dict>
+		<key>com.apple.print.ticket.creator</key>
+		<string>com.apple.printingmanager</string>
+		<key>com.apple.print.ticket.itemArray</key>
+		<array>
+			<dict>
+				<key>com.apple.print.PageFormat.PMHorizontalRes</key>
+				<real>72</real>
+				<key>com.apple.print.ticket.client</key>
+				<string>com.apple.printingmanager</string>
+				<key>com.apple.print.ticket.modDate</key>
+				<date>2008-01-28T15:44:59Z</date>
+				<key>com.apple.print.ticket.stateFlag</key>
+				<integer>0</integer>
+			</dict>
+		</array>
+	</dict>
+	<key>com.apple.print.PageFormat.PMOrientation</key>
+	<dict>
+		<key>com.apple.print.ticket.creator</key>
+		<string>com.apple.printingmanager</string>
+		<key>com.apple.print.ticket.itemArray</key>
+		<array>
+			<dict>
+				<key>com.apple.print.PageFormat.PMOrientation</key>
+				<integer>1</integer>
+				<key>com.apple.print.ticket.client</key>
+				<string>com.apple.printingmanager</string>
+				<key>com.apple.print.ticket.modDate</key>
+				<date>2008-01-28T15:44:59Z</date>
+				<key>com.apple.print.ticket.stateFlag</key>
+				<integer>0</integer>
+			</dict>
+		</array>
+	</dict>
+	<key>com.apple.print.PageFormat.PMScaling</key>
+	<dict>
+		<key>com.apple.print.ticket.creator</key>
+		<string>com.apple.printingmanager</string>
+		<key>com.apple.print.ticket.itemArray</key>
+		<array>
+			<dict>
+				<key>com.apple.print.PageFormat.PMScaling</key>
+				<real>1</real>
+				<key>com.apple.print.ticket.client</key>
+				<string>com.apple.printingmanager</string>
+				<key>com.apple.print.ticket.modDate</key>
+				<date>2008-01-28T15:44:59Z</date>
+				<key>com.apple.print.ticket.stateFlag</key>
+				<integer>0</integer>
+			</dict>
+		</array>
+	</dict>
+	<key>com.apple.print.PageFormat.PMVerticalRes</key>
+	<dict>
+		<key>com.apple.print.ticket.creator</key>
+		<string>com.apple.printingmanager</string>
+		<key>com.apple.print.ticket.itemArray</key>
+		<array>
+			<dict>
+				<key>com.apple.print.PageFormat.PMVerticalRes</key>
+				<real>72</real>
+				<key>com.apple.print.ticket.client</key>
+				<string>com.apple.printingmanager</string>
+				<key>com.apple.print.ticket.modDate</key>
+				<date>2008-01-28T15:44:59Z</date>
+				<key>com.apple.print.ticket.stateFlag</key>
+				<integer>0</integer>
+			</dict>
+		</array>
+	</dict>
+	<key>com.apple.print.PageFormat.PMVerticalScaling</key>
+	<dict>
+		<key>com.apple.print.ticket.creator</key>
+		<string>com.apple.printingmanager</string>
+		<key>com.apple.print.ticket.itemArray</key>
+		<array>
+			<dict>
+				<key>com.apple.print.PageFormat.PMVerticalScaling</key>
+				<real>1</real>
+				<key>com.apple.print.ticket.client</key>
+				<string>com.apple.printingmanager</string>
+				<key>com.apple.print.ticket.modDate</key>
+				<date>2008-01-28T15:44:59Z</date>
+				<key>com.apple.print.ticket.stateFlag</key>
+				<integer>0</integer>
+			</dict>
+		</array>
+	</dict>
+	<key>com.apple.print.subTicket.paper_info_ticket</key>
+	<dict>
+		<key>com.apple.print.PageFormat.PMAdjustedPageRect</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.printingmanager</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PageFormat.PMAdjustedPageRect</key>
+					<array>
+						<real>0.0</real>
+						<real>0.0</real>
+						<real>734</real>
+						<real>576</real>
+					</array>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.printingmanager</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2008-01-28T15:44:59Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>0</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.PageFormat.PMAdjustedPaperRect</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.printingmanager</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PageFormat.PMAdjustedPaperRect</key>
+					<array>
+						<real>-18</real>
+						<real>-18</real>
+						<real>774</real>
+						<real>594</real>
+					</array>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.printingmanager</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2008-01-28T15:44:59Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>0</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.PaperInfo.PMPaperName</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.print.pm.PostScript</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PaperInfo.PMPaperName</key>
+					<string>na-letter</string>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.print.pm.PostScript</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2003-07-01T17:49:36Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>1</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.PaperInfo.PMUnadjustedPageRect</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.print.pm.PostScript</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PaperInfo.PMUnadjustedPageRect</key>
+					<array>
+						<real>0.0</real>
+						<real>0.0</real>
+						<real>734</real>
+						<real>576</real>
+					</array>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.printingmanager</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2008-01-28T15:44:59Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>0</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.PaperInfo.PMUnadjustedPaperRect</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.print.pm.PostScript</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PaperInfo.PMUnadjustedPaperRect</key>
+					<array>
+						<real>-18</real>
+						<real>-18</real>
+						<real>774</real>
+						<real>594</real>
+					</array>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.printingmanager</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2008-01-28T15:44:59Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>0</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.PaperInfo.ppd.PMPaperName</key>
+		<dict>
+			<key>com.apple.print.ticket.creator</key>
+			<string>com.apple.print.pm.PostScript</string>
+			<key>com.apple.print.ticket.itemArray</key>
+			<array>
+				<dict>
+					<key>com.apple.print.PaperInfo.ppd.PMPaperName</key>
+					<string>US Letter</string>
+					<key>com.apple.print.ticket.client</key>
+					<string>com.apple.print.pm.PostScript</string>
+					<key>com.apple.print.ticket.modDate</key>
+					<date>2003-07-01T17:49:36Z</date>
+					<key>com.apple.print.ticket.stateFlag</key>
+					<integer>1</integer>
+				</dict>
+			</array>
+		</dict>
+		<key>com.apple.print.ticket.APIVersion</key>
+		<string>00.20</string>
+		<key>com.apple.print.ticket.privateLock</key>
+		<false/>
+		<key>com.apple.print.ticket.type</key>
+		<string>com.apple.print.PaperInfoTicket</string>
+	</dict>
+	<key>com.apple.print.ticket.APIVersion</key>
+	<string>00.20</string>
+	<key>com.apple.print.ticket.privateLock</key>
+	<false/>
+	<key>com.apple.print.ticket.type</key>
+	<string>com.apple.print.PageFormatTicket</string>
+</dict>
+</plist>
+8BIM?
+
+
+ESliceType
+leftOutsetlong
+
+
+
+??
+
+
+s?95}3?
+?c?
+u:W??M??2k?W5???????+?????}Q???_???????)$??nm??
+?????
+I$?????%(????????kF???
,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;8728AB7388B6ACF549E46577AA074B58"> <xapMM:DerivedFrom rdf:parseType="Resource"/> </rdf:Description> </rdf:RDF> </x:xmpmeta>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             !
                                                               !
         
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              <?xpacket end="w"?>??XICC_PROFILE
+
+
+'
+=
+T
+j
+?
+?
+?
+?
+?
+?"9Qi??????*C\u?????
+
+
+&
+@
+Z
+t
+?
+?
+?
+?
+?.Id????	%A^z????	&Ca~????1Om????&Ed????#Cc????'Ij????4Vx???&Il????Ae????@e???? Ek???*Qw???;c???*R{???Gp???@j???>i???  A l ? ? ?!!H!u!?!?!?"'"U"?"?"?#
+#8#f#?#?#?$$M$|$?$?%	%8%h%?%?%?&'&W&?&?&?''I'z'?'?(
+(?(q(?(?))8)k)?)?**5*h*?*?++6+i+?+?,,9,n,?,?--A-v-?-?..L.?.?.?/$/Z/?/?/?050l0?0?11J1?1?1?2*2c2?2?3
+3F33?3?4+4e4?4?55M5?5?5?676r6?6?7$7`7?7?88P8?8?99B99?9?:6:t:?:?;-;k;?;?<'<e<?<?="=a=?=?> >`>?>??!?a????@#@d@?@?A)AjA?A?B0BrB?B?C:C}C?DDGD?D?EEUE?E?F"FgF?F?G5G{G?HHKH?H?IIcI?I?J7J}J?KKSK?K?L*LrL?MMJM?M?N%NnN?O
+?k???0?????W????????G????r???;????i???3?????d???0?????c???1?????f???6????n????????z???M??? ?????_???4???
+?u???L???$?????h???B????????d???@????????i???G???&????v???V???8????????n???R???7???????u???\???D???-??????
+?????z???p???g???_???X???Q???K???F???A???=???:???8???6???5???5???6???7???9???<???????D???I???N???U???\???d???l???v??????????????)???6???D???S???c???s?????
+??????2???F???[???p????????(???@???X???r????????4???P???m????????8???W???w????)???K???m????
+
+				
+	
+
+??
+
+
+??EF??V?U(???????eu????????fv????????7GWgw????????8HXhx????????)9IYiy????????*:JZjz????????
+&6E'dtU7????()???????????eu????????FVfv????????GWgw????????8HXhx????????9IYiy????????*:JZjz??????????
+??m?????4????
+????_??????//?????~_9??????X??e?-???????r?J??P????w??)?
+??t?_??
+??
+???R??UY`??Il?A??W??
+]?-?[???l?]?????????H?a*z??1?????'???r?Z??>|?d?<???U??%?K???f[?j|&i	'???rT??~@???'???'??h??????uI??????
+??P??U???Wb??]??v*?U???Wb??^g??
+
+J?ep????C????
+
+?AV?J2?+?F??
+???&P??????&?6??Kj??i	{)??FN????$?b?b??]??v*?U???Wb??]??v*?U???T?
+???9?z????_]????M???R?? ?A?????}?J??b?b??]??v*?U???Wb??]??v*?U??????????l??????S?1??'V??o??#????^QD??1????QGa???r<??G?z???GUk?m at 4?"??????`?AU??????
+????
+?U???Wb??\?????E??G??S(??R=???U??+??????????
+??Wb??]????uO????`!?)?6#???)??}
+?/??2?
+?U???Wb??]??x???
+???,,|??
+??VN?????????&R?\??F??s?t?t?x|????????a???<~????H?ZR?
+?(IjmX??K??{??#L????4?t(?q-???k??eB%'???q???m&?
+??????_:?]_i???.???Rf?
+??`*G?????{F??
+~???6?p?<?o8yJ?)??F?
+???
+X??Wb??m????MC_???
++????YP?#?TP??#??e??
+?Q<?Yv?A@
+?U???V?Td:????Wr(?G?j1T??2jI??s???
+?/???'K???&???9?n.#kv
+jm/?Q??EI????n?U?x???Wb??]??v*?Pz?U?WQz7?ex?
+V??`??4???{??'???????)!??o4 ?q?lU???_?zP&:?\???I5?&??0F??8??Z???????????WZ?k??1Y??z??
+-???]?;?V=N?~??aw:_?p???|?=k?z?T???JS????Ut?"?Eyy????i?W?V??+???????T=???@?????8?Jz~??4??????(????M6??qr&X????r5[=D?<v??????w?*??"?
\ No newline at end of file

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.png
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.png	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors.png	2010-01-09 21:29:50 UTC (rev 1570)
@@ -0,0 +1,597 @@
+?PNG
+
+
+???L?6
+??A
+@)(??2?M???N??0??3?????? ,D?H;D??!IHR?t c???\ O?
+???D(
+??r???5@?P??@??3?5?m"Z3?!??A?"?{????G?!?#???Z?u?]?
+*??",$? ?&?,? B1?9'2*?U???????I??;.vG????????6?w?v?o%??v??%oJ~??r????+?&-.?!?'?/?CFQ&P????,???l?l??9.9;??r?r??r?????O?
+f
+)
+?
++??>?e??JD%3?CJ?J_??????+??p?8??Ry??Q5PMVmS??&??V???.???~F}Z?M?A#W??&????Q?>-???V?V?6???}P???O?d?;:?uuu?v?=}?Cz=?h}S?L???.??QCVCg???sF?F?KF????????[&z&&?????%?sf?f?f?f_?5?S??,?--N[,XJX??l?VfV??&?????7w???5nC???i??nkl{?vj?????mv(;?R??????????W6Ms???????0?????????s??k5??.??B?T???L{}?6?!?????????/y?z???'?/y????'?????+???7?????C???????u?m??)??z????_??????!
+bER??????4?j?q??:?YT=s??|???.??v?ri????????Z?????W??,^u???N???^??Lc????????M?M????w??\?z]????G[?????????m?m?oZ????s??]???????w8?????{??q?c?3?s?+??u?_?B????{.?&z?{?????????~???@??]???C?C???]
+v???>2}??????????1???q???	???'?'?'C'W???6?? g2g?g??r<=;'4W3/???L????V?G\?W_$?D?<???T?,?\?J?U?k??o<??y?v?]?{????>?~4?8???????U??????k?T??}????k????????k6?7?o?l?????*?!???O????ac?????X?o,?7??????????????^?^?b$|D???z
+???????a?#???G???
+?G??<9??
+?Y?GT?????.?xz??,[9?X?T??9?j????]??x9?&?6????qu???R????Q?G?k	h??y?t?e?n|[???]??N?.D?f?j??{c?}}w????
+?27<???|D???o??F;?*?3'??OJM?O?N????=??s?W}??l??????8_????L~?z??z?M???w	??>X}T?D^!?|]]?<?????k????????????"~???6???5?8???0???K?-????U?	?
+?B?"????#?#z?e?6?\?(|#??
+
+f?????????op??\\??d?s<<md??^??|I?$??:#?!?P?????H?(?h???-??????????H_?q?E???Q????*??&+?P?R	QUQ?????5|4???Z?7u?t??????o
+G??_1)3?0?4?Z?[?XUZ??????hGc/?`??tb?u?YW?^7O?"?QO???w?O?????8?78 ?3?)< ?~$w??|?a??x??????SRo????:r?(wVq6??????:r??z?~->V?z?LR?@???C?b?_^,?l[??Jw]B?z?v?????6?[P??;M?]zl{?????????z?=???N?Yg%?t?y,$??[j5??^?c?J???????7??&??h???^??Cx!??L??
+???
+?????:?I?m?J??L??%-)????m?+??UpRTVbW?V~a_W;?~X#T?Q?L[CGR?S????`??p?h?x?d???????E??V?06???????????????@?B{???<?x?{Yx??<????L	??t????H???T?vlE<*!??l?I?????4?????#???Y?????8u8??^?Tx?X???i???????+??T\???}?r?????C
+??-?????q?U???-???;?;?:?w[?<?u??r?v`}0~h????????]???O^LNW??=??;8???`?H}Q?rxi??k?7?o???7?`?????
+???????Q??G?u???
+??????????8?r?6~x???S???m???????y
+??e????4??1?????`v?EPm??''??1??S????????k?
+Z?uW??b???????????Wmi??nEPT\YDD?}???:?	?s??;?I???L&!??|&o???{???s?=??s]?Q?38p"?D???'N?8?????r9??D???'N?8p"?D at B??V?u:h????Y??<dEmoR????????pqq1?q}?=>???o?????ZZ?????W_?j4FM?4=?\?	W??>????v]qu?i????tS]-Z?z?????G?<????)?????8vE[????>H?=2?}???????G??q2??ovv?kk$?L?N`H(J??
+?????q?0??C??z]ctMM??NCW
+<IV?????d????zW}????XS%?O?#???B9|?o????x?q0?3??????h??s??Td?????????_??;?? D??)???[q-????????z
+U?k?za\??%#~?4?
+?-?]?@t????,?Yq????o6????7!4ap??YWQ?K{?F???.*??????n?????8?c&!v?i???+?????????z\????<??????z?*?????????=???????h/v\\?5?/??	?????u???#a??#f?D??7b???,??Z!|f?Y????E476??E???B4??#?"???????i;g???Z???T?U??8???$???&?^'j?d$?q?|}%????.}
+?VP?j?c@??	 c?.;)?z?Ty!)?:]3Z\\?q??S*??F?$??&3??`??l????????1?~?k3?T???
+J?,?a???3??]???z?W?FX?Op???T??W??`??\???????PM8c?'xJtJ?I????????}????5B?q1?vd??????)AN}3B???MK`u?y??\
+?
+?u>???q e??????b???e??)M?s?C???????n\??+?
+???6???3?&?????????F??pm,-B??o???F???2'?~?g1??C{;?ge~Rwn1??D?????^?Gx???C?i???=????K4???@m??I^????????????????C??????F??m],?i[cV???y???q?svoCqa?DUUU???HK|??b??c???!m??????????\??+???/+/?~??f?,?#??????G??t?VYV?????;???ajr?:1?d?qq??(?Sm????QI?9D?S?!?g;?_(??!C?E??8??????`?R???
+???PKS?5???X??#+'????	??R?????RY=??0eP?t?$"7??)??
+??
+?!?[??3?O???x????\0	??HM??;??L?B????\???"????	G???2\m?Dr???P Tq?(?b!((H??Y\?<?c?????	\?M????Zj?fj<
+W?r????e??x:????g??cp?b7??????t?????a?L???f?xa??\???!???W?XV<??=
+QJ??l at 4a?
+K???<z9?d???R????U <??zo'?(????6 &:???#F}-??CX?X47?
+??7??????}&gb?????}t?o?w+?Bs???????(????(Y?'?Ktg
+?5??`?$?b???k{????
+3??2  @?U??????;?y`?
+?????U?"?Y?`Z??T???b?g[?x?n??0????J
+vQ
+?xa?nd?$q?????(3eee??????8?e&"??&??WG????q]?_???v??c??q?b?;?RN?|i???????-?<*?????=,??+1??|,?x??D4?\?U[??/??<F?^?????]Ho???? ^xo7.])???4??????qI?A??c????[??&\i at TL?Agqe?
+6?????`??"\>ne[??+.????T?????HZV??"@I??M?
++7}??.R/f?[!j????g'A
+v)]=????B??&:?????bIS?Z???:??a?x???????"???z??^?+1???y?9~??]??S?N
+3?????6???w????lI}?????V????0??B?)?aR??????????	e?@%r???K?G??`.V.????$?bl,???*?????????O
+:	???N?a????
+h???g1k?X8?5?C????+?[I??j?u?J?Z`???v
+???gW?????NkJ?T?n?????B??a?)?????"V??o???_?4??1?;????X??t??&?Fzc?VeZZ?L?dX*??+ ?????F??q??h?^E?\;??t????s???`j???de[?V?KkS??????????jY??*??????g/n???Je???;q,i=G@#?1???P?????4c7`????ghp??H?l!34%?&D???oq|?D?5g?48)???????Qf?A_?	???eZ?p??SY??V????j$A??T?E?c?????Q?`??xu??n
+M?c??DZ??b>"?<)????N5?P??????+???v???}?q??`??.?,??1H???T??X_?&N?S?j?[\??G????)xc?R?h?RX???}C???1??????6e?O????pYX7?5???B?M('V;???	G?{????Y??k??????t'?n?? @??@wl?c-???X{d????@-?N??%???0?d2?j"+???=??????b??E#?????Z??b???????4??5z??z????%zW??8??2r}Cv?????a????????YoZ???Mt'?W?w???
+u????-?]e??r?(?|?FR??5%?vCN?J.??y????+?Y??????~?+1h?D???0>????X?????cL?Mw`l???ZC??yW?*?rN?
+$?????d?M??n????}?BW??O??????i&??@?Z?????i?h??iq"?6.	??
+#&?@1?B??J?A??h????w?????&7??<8Qk4h0@??w&PDL?1???`?,?1?????^???@?
+?^!??'?6?? ?t?F????Wz???)??|??#U ?HF???*???g`?zr???\??d?9??(L?m?5?n?p?\??O??6???S???Y??m??Z\[H??\%:e[=?`/???g?k???N[,tf<xoX????`?????v'??LB????p??K?mi2??K??<"Th??#x?a at L?o??|??j4???l1My??2M???B`m?C??*U????q#?Q????cr????&?T?T???Adp??~('????k2?d4??Lq[s?8,????%=??L?hU;?@B?
+???}?p?0S0?2???&???????t?i?L?=?[?????????L1??????#>?#??D??u?jup1????J??#?0?=??Y?Y0#9??M?????@~R+?????^?3jZH@??<?'??F?@??I???P?#?\wr???:E??+h?
+???mPM?I?:j??d??O??i???V?~????b:-th????b???????h???#""!!!*??l3?G?g?U??hw???????_??????u?5?h??/L?2&&qqq?yhh??+O?Y???O7 c??v?J????+?K/a?W??w0?
+Zx???q.???4???*GBD???<??d??J9???:!w{?w>????5?&!?}??U?????"??n???r?@<???[K??)Km?Sx?????W?bjm?^CuY???#?S???hR????I?TZ\?~\?q??$9??Y? ?}3?????v???l???WYR???_?[.???????9?_x?!???<_wS??^?:2k??s}M??d?Q????
+?j?
+?UcE.?+??c??yGd??[?7?'r?????q&?u??0n?O2????c??6??????u%?u%/,%%?Ewe???,?
+????t????-?n???w?f6???v?cZ}zxx?$+?)??Z?3??Gd???A??x?x ??&?9?F??z??z??j??p?q?D?B??a???IXA-???w?9?U'?hu???*?i!m3?c?^bR?i??|-?1??????q%!??*^?x?l=G?u?*c?(?);?k?P%????????x
+????=???????%????M??m?|?I?l??Z'??????x:??w?v????g?kK?iR????I?HL??Ci?$/?g??.?:??v??v.(?F??i??S/??????U2?????W???4I?????`????82v,0?O)t?n??.???????I|??????f?Zh????U>?#+Y?]zd??:D?j?F
+??s?y)??l?Ko????AX5
+?iSkc??K??y???ytV^m????+	b???}?t,???u????`?m1?kk??????'???G???r?h."?v??;q???u?oxZK?????0???K?%????a\??\~?l??J?&??.?5rFM3z???]my??LM?w~}????`%????2?>??f?y`jJ?|.p???o?s3?????q?i?pZ??????@+?"??J??DkeF]?'?Jz
+? L????b?
+m?g?Ju???,???????T=
+?^?g??^?!?????<??u?4*??L;??@;?%???(???????????L?v??????b-?&?nK?m?E|{?v???u%
+v??\????ESG???`??rYB;
+???????ct]??v
+?N\?????B?_WY????<??>??"?(?-:;|OE??kC?????q/?8??sO?
+?A????x??????Ji?4???u????m?|U?`?k?uGw?'???u??~??M??(G0?{
+g????$??O????3??h?f??s????y?n?j???~??({K??j?;??Z??-1????V?q?xv?Q?1??/???{??{???9X6w??????J7?M?qF]C???|??????G??????F^B??0????Y??{x??=??Z1????a?XZU???a5??? M_????*??????(y1JBX(??VFBlx|???????e??????P?p???%??R???+?D??????Zd? 0?9y(????!q??????+p,?
+?H????Bw????9H?hDH?
+????]??x`T?@??Jq????
+1/ej?????j??????E[?cj???K$?_<??????A8???x?????Q?m?0l???j??@????l?Z?F?V??Z??gy`??h??s?k]e?Z????nW?#??q5?Eg?+????s??m???????n?;??}wK(???fiGwu?k(qQ?;?J????
+??%?)?????
+?%'??cu	???k?*m?{?f????+m????i??O?VVj?d?;F
+k?G??h<??T?'???ACv;d?R??U???s??E
+??>
+????L??I?rY???#zWQ?t
+?f?v?????'??5?mg4?iS????}???b????5?,??$0q^?????$fV
+49!?\*??x???Kv5??H?{???>xz?e?5x????i3?????_[b??fJ????CS?|??Dk
+X??RY??&;???)??)!???*?M&?rm.???$?7?????8T??2Z???3????(<=?????
+EY???C?[???-??s?Q??.??#<L??.??gO????j?C?(W?)?????M???w?U???R"?y???????{
+?u??-??&4??????$??? ?rM??2
+????zp??AFZ??"@???bw??T???????s??=??_O<?|i?+??Pdb2~,?p???v???~J?&??]???1????????Y??I???}Y%]G??v???L5,???~?A????C?[p??8?e?F??nd???f??j???
+@?U?7J[?#?????I??m5J[?s?[?M?%??y???Q????-tW?e??
+}7?7??Fw?|???Z??I?????"?6	??b???p?~??A5|??Fp??0??????H
+??fTS'?N}??"M??_g?sg???<???`W_?Rg}?4?
+W&% B?u|?I?Y?:w???c???????=???$q??s?1?g?D?-???c?=?Jwd?G~???z??/??D?
+??[??K??_O?&9?vlnD>m?j??^???C??W??=??'??EDfe?u???S????f??R???w'?P/?w????????4gg?G?6??????;??Q?]?0Vz?r?Gw??E???~???????Ct)?
+4????"???a???
+???)??u'q????H??????c??8???????6G?P???Mt'????E?L
+?????a?:??l7?T?!??S?WzO3????U??$??
+??H}?ncY??m???v
+????b)??:?~??5A???h???_?T?$???-????I{:c??A??=-_??o(?&???F?????H??Y$"{ ???G?rk?4?5+X?V ???8/?????(???Z??}V)????f????%?jf?????/???{i?pf%????????????n???%?S??
+??qtg(?-?????????"?6iXi?9???9?w;?????o8w?-????44m????x~?IP?????d???)~&os#C?WyJ??????FL?6s??????????x}8k%???????=X|_????xb?+???o?X9?????k?|	?q???Ip0???d????X??u???x?????L5?5?$?q;>?n?x?e?0????sg????x??~&v?T,b{?r??H??u?
+??%????u???F?\???o??u???Y?????1??N?u{?#6?n?TQ?.:????R?????p<s?x,?B[??3w?\?'??????%&??K>??
+?oh?,]?![?m?#???
+t?v????](??D??=??
+???@???A?]h?????Wj?Z|?-??:???ilj??fM4$y??q???5?ZG?O??>???3n?????;xQ?I??I?J????b?x?t4???????%?V???N??????A||<???j\??+5-????????,E???\/6????re\?i?1?u?@r?Cv?????2X????>@?w;???-???WA??>zW?q?I\":-??N????=??k??!?z??fbV
+??????????#????u??B??????J??G]C34?????3????W?????,U?i??5?!??x\\??????:?z???????+l????z??;q?1M???i??n??Z\4?M???????Q'88???????~???????Fk>80?????c;~h???.?S??Gw?$??w?S?;????;[???????h?0??Q???`?U?WC? ??p??????e%?U?-??>]B??FN??"x0?b)\x?['?)*??'?-?q
+9??rA??X?`G???g??@p?a?!t?,?????m???x???5?u??\	?vX2v?V?????8??J6???^;???Sq?'N<[i??f?????????*?? ??sS?????D??k?5?5??n??????`Y?}????????G:????N?H?G?a=p+|???JjE?~??
+>?kq???O?*?--?]?Ww??r????V?:[?c!???>??U?g"}??j??k?v.?x?k5???oX?M???1?L???????ppt]?p?w8???N\;?_??v?i0???/?I?ru?y(?R?2????150^?t?q
+k?????c???v?]?M???_????6n&??|?G#(`$m??B?9?G??????uw"????A??o`,<?k?V#?L??Cp?l??g?
+????72N???2|l<"?t??6?(?-?????c??k???k??xz2?j?v-?Il
+???5?V?#Y???R???S????h"s"O?b?iU??0VJ?jo?V???????Af8????8J?h???W??*?????????|???*v??d\y?HCv??~?)??Y??{?5	Wf L;/[pe<??J??ZO???????S??{U??????$9???|L???X'?L??|??I??P???<T?k???X?}?????\(T???	??c`<?A??Cq4??1;?NF?????????)?g???f=yI???
+<???^L???^]?????+???*???>??V'??I?????,K?K?q?? ?i1??W?O????!k
+???????K?w?4?$??C??W'??? ?)?[?t???#c??P?P?|?????[+n|?x?
+?(/??0`ze???Q`?L????jo}4????????A0Yk?r??}??????rA?N\??e?f??????(??A??
+????o?{w\?~?y????%j*?b?ss?
+?lE?>E???q???D<?'??????O???4?(???D????L??<??1?q????v]???D`?GA[?(?.???r5?3??V??N%???	??????5?b? ?|?????Z?h4??? ?<??8???NG?7???F??!?5A?*?5	?A?T??d%???Q?D?V`???=H????^\?x*?i;?2???7?c????????t:	?O??Mq?????FM?;???1?3q??t'??G?G,?][??E??TJ????1}2????*??t??>wD0??JZ'?9??=>??MM2?3??????a8??5K???? v???W'?F?dz?[qm??	?
+???UqO:?????j??1??1??|??BG?f????C0??G??V_??
+??`?????z_\??-Oh????8ff?
+???=*????fy ??.?G?
+?xXmz}O???kY?p ?G??????U??????????u5m?>WN???e????????????)?w??????T<?-4#??[?#???O2?;????;k\
+~??L?2*????`~??0	*?'?$???[???7?D	??q????l
+N???????3???? F??????_eK?v???Q?$?6?i[^?A\mQ:6nOh
+?M?z??????.`/a??8
+??4)a?E??+??2R???]????7???mYl??D?&??U?I
+?x`e?v?f??+2Oc??\?F?!&??{	??7????????q7l??&z?H<!&??~??N?A?`NlZ?%$?&.z???,????i^?\. ???iJ??Th?_ ?????/??AK??????w????
+?Z?Oe????N}?i??Zo)?.&?Un??????\`fV??"<????????L???e?????????QK?CCW?????k???$?n:?(??BK?T??R?>??1r?jW???3?o??G?V??"??G? Z?? D?????k??NDL??_.???xU??8x*:?
+(jFC?1<??;H?oF?tR??z??dE?)v=WG????p??8????G?????l???CS?(?yV?
+?W4???U??8??	`?$??s?e1??U????a??S*?1M
+??||T????>??????T???%??????<w????iA??ux???U???????? ??.3~?)n????`z?????r-??i?
+???S{???@&?????W????
+?=?w????<N]	?8{qnz??k?	?N???L??N?o~????au\??*????qC?.??????L???????m???ho??)??/???g??)l?5	????????x?G?
+???i??|??Z]Q?O?@f??w!w`[??=?v????G??8??????????????%<-=3???N?o4)???
+*Ua??1????????q??A;k?
+???????9S?T?I???/VOI??*6?D???y??8q????4
+K?gb?????a???3???j|?=w?9??[??!:}?a	K??s??.??
+?=??$?H?|?I??'?h????G??c??8?t????x?OG???;e
+?In?8e>&0???yg?yu6???^`-p?J|??c????v4j?rm6?n?
+?????S_}?K?a??c?IO?@?5RpE(-???e??D???x??C??????bF???(?7d?<8p"???w?????!$??5c8	???-?t???]?????????#M??f5"1),????6????b???-iVA{?Rm???V[#?????I??,:Lh2?m???????????'S?h?'????,????n??\??<???QM??])?*?y? `???????y?tL`???g?????P????7Q?:?O??b??iC1?
+???t
+????L???o?<}C%??^????F?/???*???X'??`%?6?
+?u_b+i?????O???3Z1?F????xo?????v????%???(???n?E???8]I.??G?`?x?8$?@??U+??U???.??#??F?:??w
+??%^b??K?6?G??8,x(???????hIk5*	sH;VO?VdR?v.TL????l???K??`???+???G?d3?\^????|&?KW.A)`?=Jr??i??l??\{!?f???yz
+?&???~l8????????hp?b??E??	Vz???w?b??3??????l???????YJ?:(Z??~???2?lA>Rn??s?f
+?u8?~v|?y??o%?(Mo:2?<p&?V? ?r6]y?S???M??"??
+y???V?V.iM`??}??%?R
+}u6?????9q(????;??Q?|?x??????e?????0XG????x???9???k????4bUq/?[?\]???k?%??????G$?n??&i??6,]?g|?&k?:\??-????J???y?xu?O1?j'?{b
+?Twk???e?{v??????*??E??????gc&
+f?P???r??6???I#????t????H-???Q???A?b?S?+?V?{z??b?6V?;"J??f??W?H2?????/??b?
+]?1??w	M'kjoD??"???X???>?%/
+VWZ??=??J??Nc!b???x????j?????MABy???????4???<???0cJ????[Ja??<?M?ih
+???X???YP^?Y??K?xV?!?P??F`???????	1
+X32N????:F?c
+??U?rY]1??
+???!?c(i'????CKc?+?????.<0????????????OS[	4
+??P8??2?:a?l???T?r????~?I???p?=?5??z?)????$????UcB0P??????vkp?/?$-5i?c
++???F???u?2?/E
+C?$,???????*^????<??/?J???z"?Y?H?';t0??A9
+???%O??(???????????Sl??S?C1??\=a?????d?|'??]Gc??????,]???Db?????u?????iO???H?{x6?????$"?>h??34}=S?7?V^???????????????a??????.<??
+??????????????d?S?y
+??~??[?#?j??W$?????:?z?/?'?=?????I?
+.?????+6?dQ?U???????'?Z??G?3?y"I??}?$??Pf?X????3?????i$????d????????????M?.????<H???)B??;q???+s3T?Ck?0????oX-???#6??7>;????2Z?9? p??X?????_??$??X???}t5?g?7?#??Z?#]q?}/V?#?u
+.0a???h?`??e?.?XB?g{`???}22r	V0?Q??>??sG?v??L?????????D?3??Nd??????sH?|??0`~2/?-M?????ACZ??????&?}[????tW????????M?#l???Ah ?<?=s|????????%>?x?}?Zx????????|T?? 6?`U_?N?$D?j $???D?^s???[WCo__??1?R??X?7?'u??jz??tA?=/KV?*yQx?o|??????J3@????<??-?'7U???*O-?u(?}?????^%??;?~i??????Q?]T?O<"???O&??????{?@?-o$??K?@fj-??|?????fvJj4??c???h [???>???x??????b??H,>P?;"??M??????[Z????+ad?	CM??Xa?j
+??????W?d?)??d[??H????<?49?.???8?~r???~)??0?y????.M????????R?*xww???o???
+X???1o??
+????h?ZjI??)??
+?g?\?v??-* ?? ?4????|?D????"?LO???k?">v??X???4;??|?.???:???Gxy???? 3?4?w?I`?
+????T?O??iA6?w?N???{d&E?NN{=??)?R?
+?,?o?????(?? ?4??\?wG?????c??A???????R"?9(????s"?????8}?$h?]U*?|?t[?0ISfH?7h8f?5??>
+(????5s????"??H???\?(=?{?N?N???(?
+@?????M;??%~???k??<??_b?}r????7?x?0X??A??????????????3>)8yY4
+J????J?V???0?T5g???4?#?:lY?~??9V3p?N?t#
+^$?0???q?0^????r???W?Fe3?Ls)??CJi?$q???????]? 3?????????????H??jE??`?`28???gb??8z?^@????t?Q?nl;U.????1?)??Hin??V?0?}8???????v??-?8????r???s?b?9???q??+8?????o??1??xm?J?OkB???>wUV?>}Ho??W??`?<??4???fZ???qH??V?u??f=?-??z????&???WGM?
+'?#?|C???g??QP*?^O?~/??q?????F?????x?=?Y`^? %?????<??'R?_vcd??????kv?H??73???z}??K|i?g?j?]??&?
+????yv????????.??k>???o??mD??Z]?a?+????%????????~????l?-???@?^?P?0?|???@??5b??w?)O?? J?_K??w?u???z??/?????D6???l??Z?]?3?4?lNj?RY?4
+m?
+??4???n\?????b|<?Jt??4i8aa%f???L}????L?S/?2?^2?????
+r/Jjw??C??h??}?n?????????Z?|????p?/?????Z?4?.V???lY6`?`[???j??3o? ???d?jqU1
+?5??f0???)
+????zu???dK????IHX?????R????? k?;?t?B???-??F???D??b%?)?9/?j ???????n??[Ee"q?N`?,lj:\?>???&????1??C???\?Z?]W?N???p?o&?${P??????7g0:f"?k???A_??~?_?{?D?W?h~??(ku?a?/$??yj?H|?qb/Y$S?
+?????fa????????}?~7?Do???U3v<J??_~&GP?Q?????cx?~?Yp?V>???cx??7???%??}o?I?}?v??\/7???_`?????>??~??#?jV?I?b??]?
+?4d?j?OD?P?OF??;F?
+P?O??k?td???i?F??O{?64?r?$???	?????5????K4??_N~?O^?Bp|????[?b?<??]??M?J|??*?9??e/?B? ?.?:?"**??p1????m<..N?M??????Z,??PEy	|?V??*???O? Vnx?
+t??<?{???_?x
+?YW??r???d??l????)??2?5<??n?e?c??Wq?#??C8??#<???^?/=?y:??8??v}HW??,?gKS?Zx??}??yE??=?g*?9????hA?T?G??e?3?b1?=?6a	?j}`??8????k??Fc??$??V9c??B;a???????`???????*??Xf2??#NL?==?<]\7????#f`?XYs??/th?n$? NI??F~??U?????kn!s??6?{~???9?g?????S$?)~ob}z%F?7????????d?E??????J??)??]?????8?k?L&m?j|?=w??J????????i%??4???????? ???J?? ??????KB>??i??7`d?I??8*?m?5a?/?????X???p????b?????a2?h>?
+???&E~Q???+????Q_???~;???X???d???7????1Xv+??3?]"??,?o?d?3s? i?#j?<??_???[?]Rp?wG?q??????H?"?x????K0??(l?F
+???bab???)?????.?b?F?ES??'????8r???Rjp?2W!?L!????4??sM?2?"O??#????%?t?6???_??g?+bF?S?^???jj?K?X???F$&E"??(|??7???????0Z????9s?.???!LO2?????}??? ?\Yr5f??y??7??????Q????@????~??4
+'hk??/???Cr?Z??m8R3/,??*?}??d?????Q|1?v????~D????4q??m?e??M?3aVm??????n??|??/?;?__?w?!a?xj:???T?#_0??A?7Kk5t?SQ[??Z?nE?KB")8?????0:
+0?&??????????q?(??FnF6??
+??j??w?q???c%?q,?F6y7?Nv?~???}%?KK??5.+Y??X%8???~&???o?D???-?P1Q??A?&????tM??UC????_-???
+?5??4cR?h??i?x1?'???;v?
+?
+}/R+Hh?+??????W?@!??????u?r"?D?????Dl^????!???K?m??g=?j?hPk???&*o|s	??oC?e|MV,[???d?i?]?Xv?C?z@?9???-??}??zF3??a*[(????;???xd?G??? y?X??G? ?}Y??????P??
+?V?S???n?!???{^??\??? Z???+?????	i???????ydk??5?1??$???*~&t??Gz?w??eqjX{?7?}k??K?????%??fF???M??e??K??B?p?q??*??3??[?b??k<?6??1M???2?b?wy?ic???????'?C??BOI at JO-?Z0??	??6?R???-l???w?Vi?3????O?????Hij??q?U??oSRZ]???u?9w?6??????2,??j|?????I?0?r???a?X?????.7&xj??d?????????7??<?VqG????I[yg??^r????/?S??????e???????]??P?}A
+???#e7W?j??7????x??????^??????7?L?"?????1<6?m8?sL?W=??U?=???)<?.?w??g?3^-d??@????Z-Y??
+AY????dm???J?4?9i*:?j????I_ukeR??r??Z] ???vke[1?\??6????m??????&Z?L?????????2?R=??????b?4?:#?+?????ka?M???L???+ ^]-??o|?CO????(????<,h??R?	ArsU?>[4????2~?tI???eV:?\?VJ????????s?Ki??)?6dFm???3e;???@?o?i6%vFv"?D?1??m???J???k?????`cD????iZ?5?&??iM?.?zdP?W???S??y???6?M??XPU??	??A
+??}?L?W?v?R?{?4????u?`3a?????)]R$???s??;0m???^???8p"?D??@7 ???v@?_A?N???c?"?`^a9?????A?)?v
+??\?8p"?D?G ???^w?e??9????Y?~???K@?????;p"?D???'Nz
+?Ko(w?????p???~q?kk
+?y9?@?S???]??	??6?j?N4?L??4i
+?"?I.????!??????]???
+?.?G>????<??{%0??%??!?????j|?3?????#??4	??"???+???H?@??d?G  ?J?oMp??AR?c??0?:q?
+?&w?5;d
+??P?,7??j?
+?5?o??@???>???P-?CN-??6??W????lR`????Z????}??????1cc
+??5H?q?z????5N??Y??>?????0s0x+??T??????<????C????E?	??>??????
+*?	e??4P{6,??M???c??c?B??Z?H*deQ?e^?????+???i0?Ac??pjL?gKI??x??d8?Y?F>?????N?#???2??
+?p11m??is??????????"?h|x?	??^-_C_??G?p?????h|N?w?'??9????FBw????=
+>-8?_?p??????pE???O???)??????<
+;???i??0s??6?5?j|?xiu<?o?hB>T???F??9?W?;?j?;????1!??????.?vg???;?????7???B`?\ ~????????????????????????
+??O??????x?=??V"y?U?)??_1??YG??????????t??-?>??x??j??R????????]??V?Dzc????Z}????E?4??G?/?]oP???]k??8?Ub?pf??????L~;K????????^p???j?K?=??#?l4x?`Y?r???_?8PN:?$????!??z?????
+?vm??}?X}?u?,??;{oB?????????)??k?`?%???????????$|????
+?84|???1??X?????fWo?kK?_?x2??5?|????|????i\m?rrr????qH
+`_???/????:?)
++?rDkMv????????_???^c??K
+:??d?*????a??/f?E?Ne??U????f_,???'???6m?8?????????F???8??~X??~??!2r?Hn?P_|?EwT$??8?&O;??r??Qs??u'?_?y?=???G&iwE(,,?????':???^??]?????-????C?y?A?????}?:?	?lm???Cj?k??F8l?+f?
+N`~f?v??8????????k\?>2?W??bkr;?O???,??A+.0Fj?????;$?;w??Cx<??L????L?P;???c???>?D??1??8?|?NB??-[???
+VA?u??l?3??}V?'L??6E???R???????????????w???Dm??XC??q?9`c??????+}???0??o?*??????XBD3`??_?8?
+~m???Jd???LK?|F?3*? ????]}?I??oFC??;??????~Vw??+3N????????X?Q%??Hc?h??????0pj???Ih???z%?26?D?m??????i14?e\`??>??.?d???1??(0
+?E2?J????m??????q??M\???~???U?l?%??v?mr?1?8?%??"???E?wl?p????W^q??j*?|?d?????????????p??[uy?:<*V??g]S#????Y??84,???1
+?S6??'U;?O?]?{?O???G?'?0?eCL????Sg?
+?????FH?={??,G????]??f??)Y?qx????,????6@????H?O?K?w?y?<?????,??????X?T3????
+
++???oX?n?s????#F??WYS!-??????Y?j????%?B8??m????Vk?s????????????6?????6??/C??*E(??5???????q?&p???5?C??????6m?*^???i??????<???a`??5?N~h?y?H??5?6???????????	??	?????{???~?5???JnIG???bIC????[??0??
+??6m??d??}?~???
+???!BB$???????? ??^{?M??sF??+h?????v?1?^?4#?Y^?9??w?x????'??`???v?????/?7l?T?q?#n???LHJ???p at Y????U?*,,rZ???7??_~%???$2t??
+?L?*???)?????H?#YY}-#??h.?{#??C?g??t?Y?r???f)*.?6{?{Rb??c]???>??J??~??7?	??h???vw??7??oZ????fU??????P&?{"?N?P??\??????9?=????2??GdYz+Y??????od`?w?????Wyr?w?/G%???K^?d??w?-r??iU?Z???5rw?j??????;???m??Ko?s???=-?+????~???O?????V?>?????>;XW??????Y ??)
+??r?Z?|?C9d???d?dy??
+Y>?b3??_???*?W5?}?l?I9f?D???i6\?`H?L?V?Z?&U???e????????lWhYLb?O??&/?SV?E/? ?Z~="S
+?*??*W?~W?~?'????H?m?2????????__<GZ~!w??@?????y?)?'?H???6I??0)?q?9
+xN??8? ???)?????_???SRp?7????b]???-G!mu???Z?????????+?e??T??????o+???????j????Yj?~?????????P????[d?]??&?Q?!&??A??um????j???L??F?}??? g????u}_m????}X?Jtu3??$*on???tX0_?:?.??{?|???ds??6???I?Q????dE?=r?y????7W???U??????????~V=\?j?g??_??g?????w7?X1?2?@?o????T~???n?&???/??????n?*_??o??fX??
+?a??t??YN8?xy????"????????K?????Xj~??t???	<:v?r?k??"-/?t?{=6UMF?p?G?=?????:I?=?7?D+?@;???}?*{???<??^?N?x?	???d??3QZ?rM?N?x7`c????????.?=3???G????(y???2??????+?g}u%L??????????GN?/??????>?5Ijb??)?q(kLPel??l3W`'
+`??z??????S,1)?s???{?????S??@9?"?w`??*?????7????ee????zG/2??A]?Z,:?o~.p?A???m?8fc?` T:?J?e??????t?!?????'???[9????
+???knJ?l???C^??V6m?4??????4m?tg??%???U???+?NMK?<P???W??
+????g?f?2K??z??????i?
+W(?R?`?????e?n??V?1??9s?????? #?????1D??
+]?L?????f??????&X?x????Rl\??b	???????\MH?????????+V?h??D?~??.]:K???????
+h?D??;??}??^7{}?k?&???y????~??+??op?~b?s??j?j'@?&?9??;?0O?????S'K??M%?????J??-99U???NX?|UC]?rl??LU????^;_RcG?b
+?x??W??R?D??)?Rme???M????????n<
+7??M????x???????|??|?d)??o?????n
+??????!T3??l???U0??|??N?ZS???k6???a??Rqc?.yH8`?.??????q_eeeUi???
+?????i?#r?X9?????????X?]A7??_ ???Sz?X??A???Y~J?
+????c]???????????$?oC????0?bw??2n?????8??)KB??b?f?	40~\ ??8b?!??,???????G{RS?T???Q ?????$X??&????jj?l?T;?????xJl????)\???{?????[???,?<??!?5?]?t???j?????[]???????O/j	??????2;&J?Um?{?7?W?9???T?~j?
+V?R?UX??'??s???????V??u??VMW|&?
+W
+??F???K??7r???x?%@?.?????5?8??Xh???g??W?
?'???!r?E?b?R?p??;?~G??r??.2??W??{??~W~,???????%_?R?????XM$z?????d????6g???O?.?Ig#????L%E+rd??L/?0?????%?p???_m@;1e?Hs?q`???;?????
+??+?(?4#G?tN??????
+}?
+?H??????5??g??????W??=?x{,???I'?1?l*??h??
+TH?,}????)?Ul??d??pv?1???pv1?I?Y???i?z??
+BQg????bM???h???Vv????O?6??"m????X~W???
+K"?_??E???t?~?QE?B??V:\?r???Kb?FZ???????0?T?h?v??A>?:Y?????"c8?{????????W??d?p&)O???;?f??z?m?
+???`??rcb?P???9r??3u?A{??p_????? G??}??7p?l??OR???????{?6???]????H?a??	????_V??uH?zd?????{??%??\?[?????_C  ?~?nO>??;???|????????U4?3z??!\?!Y/??p??2??X?(???
++f06?L?4?	???h*??M????????????aW??=W?=??8?-=???n??d??ii??;`???iW#J+???o?\ym?<?a~0A??F??_t??d??i??rm???6&W??_????tyisM
+???????q?&XV?&?U???-??K>??bm"PA?Qd?????
+??J?cII?n????<"?1!???????jV???X5?*??3
+?T???w?????|^e???{{vi?p???Z???a?1`?=?jU)+?N??{c>????+??\?g`u???H? e?????|?<??;r=4?)WO\`???*?)??'?`L6=hQm999n?Q??d6#?7o?3??2e??3????I?<#?"?r*?9???:?+<???
+??????q?v?{?I???B????-?].?o`?A????i??????~?M(??h:???r|,'??\?2?T?y?egg??????Xg%/a?9B(^/??]h^x??7??q?EC???>q???c	(??A)w?:??kg}??c??G[?@?=?
+}??4k?? 4b,????<V?????*?r!?y?????????
+?t???	?VU!???I??S?+??;??u?n?*V?D?2??bTq?F>@???~Sp??X4xa"
+Y?	?'!???&?????vG??M???ii?
+?Z???;?#3
+??????b-[?60?????4?AZ?PR??D???F??'??B??07AR???D?????h?Y-??W???_JS?J&???$)?L?2??*??6?????????6?>??o??(??J?o? ?d?]u?*??Df?????=????????c?h?5???3???\?;ykV????????.???g?k??+e
+:?o??
+?vU{h? ???????O?*Z??9iZ#X???a
+?????0/?w?4\?G:????<[??md?M?p??J?????	ZS\?a?N+??5?U?]0>?fi``sM^6	?????6?2???L\????????O?????7?Sw?}FF['t?T?J??h?OB??U@?C?+&Ha!}d?w@?:?~?>n???(??-?%4[
+?v??X??W?
+??S???????y?X]U?pG???YL'??O???p?????????E ?6?_????E?l???h??h7m?????(?Dae
+????ZXh:d?*dR"?}A???????-???????(??:Q2??2m?e??w?????;??L~??h%?}???:???i??&>?a????,?g?4??l?\?[2J????}???J?q?K]??r??????????B+k???????AVlQ??????-?3?#???t?Oh?? ?&,-??<????l4u????+g??????
+?
+V????????,???r??!(???m?e%??]??%nkwe??????z????!&????B???~`P???????K?01O+~?F??B???@
+LL^??t??
+?? ??Z???t????=???H?i%??G??^???1????
+?I7?"??[??
+}??#???n?W????c??S~?W?<t??????r???=???0T,????[?-?'???I?v?}???~??r??By???e~E?Z ?/???)?Q??
+????????	??\??|?p??`[??AVfh?9?5Bp??!?
+?????W:???IWvv?.M??-
+qv??>N?r?????*??	? ??(??"??	@$??5?@p??
+??u?o??~?t0U?U$?DCorw????g????X?Jq8????9
+_]?i??ZQ?8LTbC?B'U??d???CF??????!})]??\?J?jKV???_w4????.?x36??T??.Mh&????e?V??+V_?j?h?!6??
+?91??W??=K??P?kx?A?\3?T??6?ARk?j?+??7'g??]?Z?^]j?S?{???[?2?_?r????T??D?????)6n'??'#?????????C~x?Zy??a?n??2??i?j???W?\??$?y[?M??????W^????.?+??Y?g??g~#_???<??S2???}???k??????k??/?n?????\???????????j'?|?FJ?,???}??/??????8G??yB??^.????4?d???T?i??d?3???N?7N??}NY=d?????s|??eLc?o??d)3S? ?g?w?T>	??e`GxeI??????f?|???
+??&??Q??:?	BTBg@??&???
+???_8????
+-???q?MX??Es?*VR<p?????md{???*?g)#??BWG'??_?-?kK?e?{?????b?M$?>_Z?,l?????g?? 
+???h?vc#~J??S?s4))?	j?)>|?t??
+??$?qt??%?XW???1N1X?b????}?-Pr2???9?&?C?Z~?6?M??{?	~q??g?j???
+!?????????^??e_
+M?3???1????i???AV
+F??Y
+???0??%T?????}T?VZ?4t???Y?h?0?????1c?8???q?zo3??'m?G?<??????g??W??;?'??k??p?????A^??J~?'?????;?????|??????
+???????[?n*$8?T?0??,??tL?b???,???a?NN???+?'???fu?-e????$??{H?rm?a??:?R@?&
+=?+?:??%?*??v??v?O??"??????:1???NR?$v??c?????9R.??~)y??[?K%M?'yBz9??k?d??7??}79??k??n(i?O_????P6????3
+????E???0x???h?yu4\?????g????????D}????????i??4&?GMS?,?~?:{???BP???Qu?\???V???~???a?????lLeE?W???????J?????Q?G"??$j??T0e?n?@????? 'G?:aw?d??s?J,?|??`.}PG???h?*??G..0?[^W@?????=??m??S?
+??O?ir??S???*???=????????G>?Es?U+?/?6????Ue????_qE?`a<?:`b?~3???????V*A?,_!D>??15?7K:~4?W????
+?w?y.???_g>?k??ku?4w?	A|??0???
+??`?-?}TgF????ii??s??+????q???3??}&?\Wv *??aH??;XH?`FB?E?\?`??]fv??8?:24??#??/v?-Lb?0`"\~f?'?pB??+?(
+?m5??p?EC??o?+?;?_????9:Q
+??k?
+?v%=???ZD?ft?H??????2v(?)?X?Geb?@i??U+T8??&???P at P2???;L??Ry??Dk?C?/?/?+???
+m??W?>Vt?^+????i~wi??|?<??f?``??c?+e?<V??I?
+??px?0v+#?i??++?pbW\?!C?l]}`E+??136????~
+|?u?????;?P?????????5{_4^??
+~U?ph?*?????b\?Q?L??@xV??*????L6;w??6?y4S???V?&?Ap??Vi?=?5?@}???L?W?29}:??.J????Y+t^??\?"??????w??Q?Z???n????K^??PY??KY???0j??.?*y?o??%??5TtI?M???x?Y?M=/??{S???q?HVOU7Y?????"???"???
+?1?4I?????UH???_mk??>O6?]!?????;C?K?,??????+#????d?????,??N?1 at z?8^?:?????e???3?i'9???i}d?^j?S?E6??r??
+????|?U?fY?%I?v?\{????{?N:?$??qM??g?1;3ck?????l?a??c^?(M????
+! {?7?Ul??????F??/????8^}??Y*i?G????+-????!$??F~?{Ko??.?|?????6??M`?g]?ug?N{g}??h?uA?r??G????????&o?9E7l?9S?Q?u????"JsOR?pp??7_?a??F????N??]?n?{??7?>?G?q??:??7????sa??mT?Q??+@P
+???S?:?)??<??UK?????H??gO?e Z???????K
+i???SFB[?\?2gB? ??}\KGZ?	???B??,??[?*???g?\??V???"??
+KF??n'v??<f
+????r?OE??.K??w?~??(??O(-\`???_~????2?j,}?\?i?$???6[S???Fa?A??V??????p??o??>(?yl??/? '?|rT?!Ps?;?M`??h3?3N???	?'+@??]]??_PShJ?@???$???h_??y?A?{???[KG???+?)Ks8?8??7Z???}????X??D???S?F?e????T?f?
+-3?o?Pf???-??U??#?ci??]??C?p??}??rK=?b"?+??+???l??n?\
+??!?'??????v????`t?????n&`????$???78Dh???w?????7?9_?ezx*~??w?M?k{?kp?V??N=??OUp?4??p?'?mr??u?\??????x???E'?yy?d]?:o???
+?}?f?ac??J?`-'_?????????h?~+Ny??V?????????ML{f??B&O???nC4U?
+?b?	T??
+U???$???8??R???ht????N2?9?X??l??q?:?qW??}???????[?$???O??#>+?*r????V$[%SZ'??}????O??[IMv4\XR??????'T!???????/??J??	}??)?d{????PY???f?G???Z?3=???[?E:ti/?[?b-???"?AiR??W}?a?X???w?K??-Z	?t???I??%T?\??o??|O?oW?p]]?C?? ??
+??)???
+?v?A
+0F?M?M???g?N?????l???4~?p[???p???v?????[????-]???
+ep06??:??Uq??s????Tz.r
+P?????_?%c????9i??r???e??}e???????????.?M???s?~??R+%9#]?????9Y????<?za??L5?k?U?>?-???)???????d???????2??g??????O???.<P??>/?]p???B??%?\<I???\??69??K???Y?????P?????4!G???&?3o??????Z?:???H?=RXx?]?R??'?3??Jy?I|?
+?hQ?.]??Q(????bO??a?h??B???28e??A&???<,W??qq????
+????e???V?????&??5?%?t?!(?B3!"??8?p???p`?-???j?q??q??:??4?????F????
+??7?r,
+?,?-h??A??A`?X:??????P
+~\x???K-Q????xt?j??`??|????F@??"?m????`????????????8???Togph?
+?{????>??-?wp
+?t
+?????3~?MTy?R????3???\w~????;e?e????IBL??V0?+??~L?9??-?6}?Pb?/Be????(?b8??y??=vl2?^3???xR?_??Dw?"???A?xq??S?#?????T??Cf&DK????0%\x????/??
+?]?+?=???\??<y?c??y?c???A???s2GT	'<???;?v`9*?6W?UN???-f?t*&?Hf???qX?fe?U~a???#??b?*&N???i?N????4P.?r?4?????|?vJ???a?4???{?????a???~JxuzJx^}?6%eL??7?ec?????FE????v??X?4?cS?G3c?????Er,????:H???d??/R?????y>????????bn?r8?'?????|?V??R?<?)?K	????O?55I~??u????????DE???U:???7S?Y???????!s?CA?r???? @?f9p?u???u_????}.????i>?Lp???i?"<R?????^?s??"0?q
+i???)WC:4? ?????????@h?E1??._v<^q???C????Lzw.????7??1?q???xLe?;?_j?]5En{??B???????k??|??1?E}V??8??V????[HV>?F?<M???????X????}??)4B?????Oq?p~95bP???????=???r??????????L<2?P????c9?????q$??vr<?3??:?????C??	/??WTXqX&by[?e?7Z?W???;???={?????c?6x??xS>?<(?<????????z???
+'????????=???????^?)????_?
+????b?N??????)Z&?]
+
+?v?v??.v????\7?q6??[????{v?!?????}??>ix\??v?R>%??~?:?(?iZhn????(E1?z??'??
+"
+????!??p??
+???<0J}?}?]aO^P>4?UNd*?_?????S?????
+??+?|U?+e`??} ?5E?????G?m
+?????????=???,s?y???I?`=??	Q???4At??[6?m???I)2????'O???8<?+??
+ ===?69.oA*??9??)??b?????g}???????'?I?
+??????D/?o???????cC????NZ??????R?M???f?????*?	w???????8???c???3?r??0c(x??x?+???v^x(L?(Q??7?fV?y?b????N5???`?1V?????|?w?{
+??????o	y??\$?????'/?>???r???p?X?+????0?:?3@???1??Wy?t???46?H???8?A???33?"?????????}M???{)o????w????????????T??\???5?~??z????4?y????=?|?O?Gaa)???o?l5?_?6???sx?=??????zNAg\?#????d.?G?7?aW?????bM????\?K????_?4?H?T?&R????G?????c?
+???????J?6Vp??'???1Tj???EJ?t???7?"Fb?j??g?VM?'I|???F?*??B6?? ???;.???_?,????V???&??|J??kO???????ns?<?r???^/??)S?b????E??m?IF{?
+L??x?}?rJ??`ob??????4????????5???7????>?x?Qd'??W?V??~1????<2?}?????p?_???
+?p?G+q??;??6f??_???~?;?x,?^|?p+FL?o???/>?????(}????Sv?????12??K???9??"???U??s??#??"?e?	??r?xR????0e???U&
+e?S??u????????9??N??cbT?W_??, ???9?<?~????????????RJ?????7?!N????{?H??bn*/?cn?}??'??r??6????????C??@w????G&?\??rD??v$%?.?q?b??r???E?.i?g?LP?~???X???bX
+?O!?/???"(?f??????6??E???)S&?y??#&?v?^?????p??r[eL???Uv{3?'??d<^?]%e!????????_?J~??]?Oo?C?:j?N;????\????Rq?)7??+e??s6?X$?J????h>`?<?qq???k??!?????t?;?!???.???f??G=???????@cLm>?'Y?H?pl???8-0??w?F2??3	_??qg0?_????????w?=sN???X??g??w?qt??
+???w??+????#7t???n?,??ncW?`e?y?fE????????8>???????gL??8?r?|???&,?1P???b?*c?
+/?? ?J??'>VK?z?y{?f?z???t?j+?9??/????c?,/???#0?k`.5?????$?|??2k94?????y????~G^U?'n??i???p??]?SHs??q?? ??i_[??C??c?:?9?.??Iv?3?\D?s?Y?v?N?1??????0a?9?jb??H-?cB"???h?0????n*????`?q??	A???e????95<>qe???! ?
+s?y???:R?Oyx???&?p???p}?
+'??={?I??D?v??	Bk0`?,6???'?c?}UU??[=F?Q?????Q?g?A???#?b?9??b???3???c&?u7?????"==}P?}AT????:=??/Oyw?:?gY?????O???^|??>?.?:??W??v????q????
+s????x???C_};??????qwF<?{?a?sn??g??C?bQ??|??????B
+???????????p?????)?Y??u?jNC?'??o?0q?[??D?2??9/
+'K6'?7??"??????:???Z??'??0??!???P?t???0?Dp at xra1?/???????E????c??n???$??a???????~?c??L???E{??N????]`??A
+??p?IE????/?L`?#??r??
+']J???d"????-?????????? ?d??#M???L|????f?Z??????5E?l??gv;???u???h???nB??0?C???????@$.??;?n?????????t?~S?G??O???????????a??dmc?{?4W=???.???Ps??^??W????b{eMI?}???kQ??I?`x??e?d./???J?^_?e[????
+t?j?y^#o??x?V?K????\?
+??C??)?2%8?
+?'%bc?)?????(????)??????x??2 ????????<>??U??ja??@?)?H?????(??a+??&?????6m???????????]?C?Z??v?!?????E?j??L6?kaZzr?N?????b;?q'??X????1scZT???b#6V4^.?f?(L?a??,Xj??6????? ??-h?K???7a?5!sMS?n=?	?	d????[?????x?=???6???,I/?@Z?k?<pY?W_B???7??[?V[%??Q2??$;???$??L*))????????]?????.??L???(?k?T|?F?\j?8?o??}?f?jk?????uX?2?Q2???z?\??^??????R??D2??%7??n?Jl?!?????7n+c??j??6???uRqi?TJ???3?????\?^*?G?DX???????6O??I??$?????%??^???^?"`3?%????[2?!????K=,:j??R#??mF?7H6??????????kK(-??6???dR}??t?w??*??????+I?Zn??J??n1?Q??????p?%????{JH?????J?7?Rqq?TTT$??UR???[??I????U?+TZo})?	?T?????E????$k?1?}?Q"[?<??7?U????*??? D??8????K?}??M??s?6;)???$?/p???<7	Y?m?m???????????<dMJ????????`???]M?.?h???&a]U3???????tb;?t/???u??????f4???????hn???^??1)??p??-?X23???????nv????WzJ??5v?(u???&?u5~?l?-[?5???9??{[?f-??c?????e????-
+5??y???????Hp ?L??xGkj?4?T?l??[?kd???^???(Ihl??X??;i??u5Gp?????????L?:???_?????]?L?r???M?=R??S?P?y???? ?ho!
 i@?vJs?TR??W??Hpw[?????a???t??#?] ?I8???????	{vl?9???9??w????IL?%????????{S????E?????P???;??|4??},JQ??YcB??????_	e?6??`x??M#%??>?5k?`??u??vV?????Q???ph:R?-?O?+????s-\??Q5m??a;???i?@????|VdS?b?a??o??7Zh?=@?v???1??Tl?S??ASp????qO??.???P??E'h????h??C?,?0r?v???????9?	?W?;???v?'?k???b????~?q?k?:??"?<sJ?dkvuz>]?*?~?[??_ >?m7??6;??
+F?????;^?????????X?t!???GU)?\O?<v?E,???qSpt?3x?e?y6~w??0:XG????/????mx3bw)??uF??n????????>B?????V?4??U??fL`??S?????????vp)t???J??sl????????Qw
+r7????|h;?q????;?P??\??$x_??"?;?`?d??????=???\3M:????.???s?5/?????z7?9??I<=??O>?J???F??????:d???t?q??#?x_??????6?v??A??s%????C!&%r?8?f0Z5=??y?FlY?*?@??X^xogZ?9k??!???}?f|???n????? ?b`??4??????1??4?V?t?;?AW?f:???z?!??
+lyt
+????L???????H?syw1?K
+?fe6??}???&?1(X?xf>????'1??
+?7?s
+L8??b??F-???E~??2'??#??c?????"??s????v??;???q??Is?b?"Y??q?x????:?@:?3??j?Se@|?6?n?~????????w????i ???z?M??2??j]X}???W?}~???2f?u
+mH!?N??V?~???!??p???c?2_???`??,
+?
+?x??n 	V`A?j?4???T?5??1	J????m`
+J???2?????????Y?^???o?jb?1.?Q????R????D??????-?:Qr??%??/??V?
+???????
+?o(????J=?:$NzpT??k?II?+??" VsT????K6????n???????????p?
+???h??	????#?z???~?]I@]??UY???{V?Dj??M?fTt(	u,?*1?m??i?$VkUob?.?7????Bm??BG??g??v?
+ZC????|???C????????n?SrPV?~???+????T?????Ej^??p?%G?????????????e???#??d????????M?H??????*t??7?T???[????u?}_C??NU?????????V??*k???:n?as?S?????M4????
+/?O?{+?4?F?Cj??%;??Xj????)?P????;???T?$???<??O
+??#?}nyB??(d????
+QjbW???B?xV?0?p{?k?a??"?2`v?"{???$z 6:0?[0I?5????8???????`F?1y=?	`?t?_
+
+?^E??>????1F[?*?Zb?:??|??Rc??2???_?v2????A???!Z?d?NU?`??N|???e?T??.>?^????????????????????? @??????l????j???+???????????_????N?[C??E?t?m)z?
+N"t????k? ]?A??r??Z+???A?@?P????9?????a???K?@S?z???????q????T??k+:?-???????b:4???-4N?=???{?&xoL???)?KB?
+????N?q?(
+??Gb??n0o#K:d0j*???e`?f&??-??J(*>?xj>?l,4? z?h9???????L??Lzz??(z???bs???|:>???*??mML?s6!?y?	k)\sD_??C?2???p'c?!??-z?n??&*??B??????7e???>??????s?_?o?C??A??????l?E??4?|????f9?<?1N%Q????????v?m???!s&(?~2?2m??"c????YX at V???f??????}?????p8`v5?t???PN??`??n??
+/T?v?o???"??o?h???7?s??;k???-?L??????3???U?B???j]???????t??Hm?I?c?KE?ER?????(9??1??zj?????@*.????z?K??????????8_CL?8?F?,>J?NK?I?o???????\?.??@?4??D
+?A?J??m?J????h ?Ky?8kin??s???E4?E??Mm?? c????u5F?>????P?#??cj??q???????
+?|??N2?#??}?_X>?z.?N?U???
+?:???*?9???J??*???
+?A?R#?}FI???U???rJLR????a???F?Xf??);????????Z*?w?Z???:??SzF?T?=0??}???OYU??T'E?n?????OER????
+]?n?L?
+??J??6?+z<??k1???a?Q?U?3H??SQ?q??&????r?r?%????Re?}?_??????z??<??R????F??{`/??????\+??pB9??hJh?&??;?'?X?????:???<qHRcOJ4????%?;V?^/???$Bf?(\????Y|1Q????a???K??QV?Pv??_???%#uJ????D]?)XlR*??A4??E?h?'?????|?~t_B???&???hR?'By?m0?:??|?*]p?j7??/?8C?U-?????c???_???m/?]?-,???H?(??ZU???@?T?_ U??BW5?G???W_Jm??W?Z???'??|???t????B???p??@	)?F?????9????*??dT#?/
+f??I?p?u???E??C???)??]?????????n+q?(??#?_???$
+-?<
+TK?\C5N;???n??Z?:???Gp?F&?d?q?1?@}m,[
+?6??*?LY?G%?;??f??b???7w`??	?M$)jj????t!nJ?????I???3????1/;?j????
+???q?&?+t???q03???c?[???U?{??a2c??Mv?|?????7<??U	???#?T??'O????N0
+?S??H?(!??Ff-D??????S^+???????(?m???"??p?yP??????a???p?o?????????x??(??Z'??Q?4
+?????[0-??OF????????
+h?????bw)??????%???p5??t?5????????d?/?",1???	?-8?$d??E=	?,X?FX????????8???T+^??K?? ?????{
+????P????????</?/????A?P??I?&?%?eF??8?z?????g?K.???9K]?M?n???????da?	;N???UD????6?C?B???k?????b;Y?+???ua?Q0$?_^L??i[Z?T?????@????K?}ha?????p!.o[???j?V?8TT??/???-ay#C?	/???
+>??"?O?T???|>?TO??3R???t?? ???
+xK??I????&?f?.?????!2?'(??r_??
+?????????@;?R??!5??t??V??!AY??@h???D??d?!v~????j?v?$??"??j??h?uU9????s?>(???$aa>c|i??tH?????E4?????<?#??"1q'???j??OD4?He???bB2??S?]->"f?`???E???????X?a??	mqz?]????@P-id?Z?`???Or9??K?R??S|???N??o??-9)\0?[?/??P??E?v??+??W"`xlp2{?OyLt?D#;??p%?)?KN*?9????4?{=???$????>J?!9]Jy?????'Y?B?m??T???D?Z?YO?EN(a?X%??7??`???:?
+??f?]???v???\M?S???????`?^????-?`h?N^?H?A?????&X??3Rh&???q??aDz??^kd9VY?5Z?p??+&??<E???]??j ???+??^*`?
+d?i?+????-&2A?'?D?A8??b&?N?Y ?{?D???dL{/??Ns?Y?;#;?z??)Z??Ii
+
+?????q?t@?hDO?E???b????]r)?????U??q???*??z>?9H???Q?F?a???T???O?
+?Hv??"k???h?]??q???2?????iVBk?;2N???7?/??9????VZ??u????
+??????U?f?Z]X6}d?+?V
+?k??>?%???b??????J_F;?\w?F}?S#??^F??
+?_???M?7?O??t???????A?????P????(U-?Gy'??hmi%Y????A????G?q;???0?-=??RB???O??ze??R? ?B?????;?;?z???G?????E?n4?1?????Zu?14????Zu5444444???*z?;?i????EF?G??%=??Q'?[DuI?l+?s?"??zIm&j$
+???\?d?{????l*a????????+?<??a?????i?j?o?~??6??}?????
+??Gb?6????E?????Y5<{??M?????n??\P???&???????\?4??*`Gk^?m????8;_?	??[s???????1?_hG]?N??????A????
+????7mm???????)?&?yl?^??'??_H?	7%)?i<??????????????G?n?XJ???O???
+:q
+???b??p1???m???|?????+?-_???6?|?N???<??0?&???$Y??9???/????-???\
+??%??X??????[R?i????A??n??f??????9m?[???????6??H?????????gH????k??c5d??
+???
+????a??_??=??}Y-??????^?)&?5
+e?????H?{???
+?8G6?3I????X?Z)?TTR,+????maY???????M???b?????"??I???F~???NpYe?????c.?1??~??U????????<?~?L????J?v????CjD???~???"?2?????j1?????o6????{h{?5/?-??CE5???OXo?????
+??x?K??b?0\?hw?!M)???g`z?;R???K?w9?R?P??'?{???~???R=?r?f\??
+yy???u;???`??B??S6Bj.h,??CacN?V\KLC at C??"?%?+9?&?Cz^YeY????R??^?????????7uT?JF???FYV???[/?cdE????? +?
+?G?'+%???1\L??4t?bq?-,??E?r+;??O23a[?t?u?!|A|??	?????v????V???K4@}???D??Il??????????@??[?o?????4V??????He?:???KY??]"????Y??+V???l??~g????'?]?;
+?~
+?u????c">??T??c???oU????,[g??Ld??????aPX0?mrz??????6??????|?Q?+uI??N?????/0???HR-)2???Z7-????????,YY???R*?????uX?2?Q2???z??d???[kk?????D2U?t{sZN[?d,.?J?e??G??WK?^??[?y?%???YU?JaN?Ijt??"?????V2??(?J???}U??,7*??X+U??A??u???I?F???dR< ??s????T???e?|d??w?m???.Ej?-X at l@Y??m?cn?l?=??EH?}??B?4l??????4~
+?u
+1?<???K-ld?b%^??X~w?EC???Z?d+?kIH???{b<v,(D??[gP?'?9????:????s>??????o??O]?~(v????F?\??"Or`?????6$????+v,????T??]?????)?oc?3}?N?O]?qX=?????p?8
+1Z??Ti???"?4?????a
+?n?);?cn_????????????v?;o???v?'???H$@??~?Z????+???%9?z?S?(r??m??h+;?Q?a?yR?8DE???^UHCg??>$??I~?????r\?W?^NI?{???Qq?L?C?T-??k????"?R?T??????FY?:??dS#???	?6c@?4??a?I??????4??????0??&[/u??????i??W
+?u????c??Z??)?Z^i????!?'?]??8?c?|?eX?t@???qTG???!Z~?9
+
+??C?????O???K?u?%??.??VI?Z;??a:'HI3=?p?*6?6eJ?3*??????N??h?Jfc???????m??Mt??-??^??!"2W???[?'??"??|(TWP*-?s?a???+?R.??@wH? ???'y???/?????q???S???^>S??|??M??Y?,?;-?!d-J8'???R????/c?p8?zRv???#x????
+z?gi?(?Sr)??N?{???T&U7*?:?"j?!???:
+?????'???0=mw??h????????7???7Z~?>y1}??OM^!CqO??%.??!?r????h?44B!X?w????C?&s??M_Z8?n?u??"4??t?TLD??F??GZ=hF"??5?????H+???	V>???")???g???*?]{?`e???#?-?H??????`N???ZL?(???O???\????/???K????f????_V??w??R???M:??E??????9S??0??-?HUv]t?e?x
+???@???`??VVAI????TK??(?Ha?1r?R????]?"?@?iP???hm???7q??Y\?z??ESj?'_??c???r;???a??b????Or??h???????]<??44?,hiq?y??)????mFb?P???
+??????{%.
\ No newline at end of file

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-client.png
===================================================================
(Binary files differ)

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-navigating.png
===================================================================
(Binary files differ)


From dna-commits at lists.jboss.org  Sat Jan  9 16:30:14 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:30:14 -0500
Subject: [dna-commits] DNA SVN: r1571 -
	trunk/docs/gettingstarted/src/main/docbook/en-US.
Message-ID: <201001092130.o09LUEWA009539@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:30:13 -0500 (Sat, 09 Jan 2010)
New Revision: 1571

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
Log:
DNA-621 Corrected version in the Getting Starting guide.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:29:50 UTC (rev 1570)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:30:13 UTC (rev 1571)
@@ -1,4 +1,4 @@
-<!ENTITY versionNumber "0.6">
+<!ENTITY versionNumber "0.7">
 <!ENTITY copyrightYears "2008-2010">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 


From dna-commits at lists.jboss.org  Sat Jan  9 16:30:32 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:30:32 -0500
Subject: [dna-commits] DNA SVN: r1572 - in
	trunk/docs/gettingstarted/src/main/docbook/en-US: content and
	1 other directory.
Message-ID: <201001092130.o09LUWQG009574@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:30:31 -0500 (Sat, 09 Jan 2010)
New Revision: 1572

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
Log:
DNA-621 Made more corrections to the Getting Started guide, and added a new section on deploying DNA via JNDI.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-09 21:30:13 UTC (rev 1571)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-09 21:30:31 UTC (rev 1572)
@@ -47,8 +47,7 @@
       Maven can be downloaded from <ulink url="http://maven.apache.org/">http://maven.apache.org/</ulink>, and is installed by unzipping the
       <code>maven-2.0.9-bin.zip</code> file to a convenient location on your local disk. Simply add <code>$MAVEN_HOME/bin</code>
       to your path and add the following profile to your <code>~/.m2/settings.xml</code> file:</para>
-		<programlisting role="XML"><![CDATA[
-<settings>
+		<programlisting role="XML"><![CDATA[<settings>
   <profiles>
     <profile>
       <id>jboss.repository</id>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-09 21:30:13 UTC (rev 1571)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-09 21:30:31 UTC (rev 1572)
@@ -152,12 +152,12 @@
 			</listitem>
 		</itemizedlist>
 		<para>
-			<figure id="dna-connectors-0.2">
+			<figure id="dna-connectors">
 				<title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
 				<graphic align="center" scale="100" fileref="dna-connectors.png"/>
 			</figure>
 	  	And the JBoss DNA project has plans to create other connectors, too.  For instance, we're going to build a connector 
-	    to other JCR repositories.  And another to existing databases so that some or all of the existing data (in whatever structure)
+	    to other JCR repositories.  And another to access existing databases so that some or all of the existing data (in whatever structure)
 	    can be accessed through JCR.  Of course, if we don't have a connector to suit your needs, you can write your own.
 			<figure id="dna-connectors-future">
 				<title>Future JBoss DNA connectors</title>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:30:13 UTC (rev 1571)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:30:31 UTC (rev 1572)
@@ -46,27 +46,21 @@
 			Obtaining a &JcrEngine; instance is very easy - assuming that you have a valid &JcrConfiguration; instance.  We'll see
 			how to get one of those in a little bit, but if you have one then all you have to do is build and start the engine:
 		</para>
-    <programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
+    <programlisting role="JAVA"><![CDATA[JcrConfiguration config = ...
 JcrEngine engine = config.build();
-engine.start();
- ]]></programlisting>
+engine.start();]]></programlisting>
 		<para>
 			Obtaining a JCR &Repository; instance is a matter of simply asking the engine for it by the name defined in the configuration:
 		</para>
-    <programlisting role="JAVA"><![CDATA[
-javax.jcr.Repository repository = engine.getRepository("Name of repository");
- ]]></programlisting>
+    <programlisting role="JAVA"><![CDATA[javax.jcr.Repository repository = engine.getRepository("Name of repository");]]></programlisting>
 		<para>
 			At this point, your application can proceed by working with the JCR API.
 		</para>
 		<para>
 			And, once you're finished with the &JcrEngine;, you should shut it down:
 		</para>
-    <programlisting role="JAVA"><![CDATA[
-engine.shutdown();
-engine.awaitTermination(3,TimeUnit.SECONDS);	// optional
- ]]></programlisting>
+    <programlisting role="JAVA"><![CDATA[engine.shutdown();
+engine.awaitTermination(3,TimeUnit.SECONDS);	// optional]]></programlisting>
 		<para>
 			When the <code>shutdown()</code> method is called, the &Repository; instances managed by the engine are marked as being shut down,
 			and they will not be able to create new &Session;s.  However, any existing &Session;s or ongoing operations (e.g., event notifications)
@@ -148,8 +142,7 @@
 				Loading the JBoss DNA configuration from a file is actually very simple:
 			</para>
     	<programlisting role="JAVA"><![CDATA[JcrConfiguration config = new JcrConfiguration();
-configuration.loadFrom(file);
- ]]></programlisting>
+configuration.loadFrom(file);]]></programlisting>
 			<para>
 				where the <code>file</code> parameter can actually be a &File; instance, a &URL; to the file, an &InputStream; 
 				containing the contents of the file, or even a &String; containing the path to the file.  
@@ -169,8 +162,7 @@
 				Here is the configuration file that is used in the repository example, though it has been simplified a bit and most comments 
 				have been removed for clarity):
 			</para>
-    	<programlisting role="JAVA"><![CDATA[
-<?xml version="1.0" encoding="UTF-8"?>
+    	<programlisting role="XML"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
 <configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
 	  <!-- 
 	  Define the JCR repositories 
@@ -221,8 +213,7 @@
     <dna:mimeTypeDetectors>
         <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
     </dna:mimeTypeDetectors>
-</configuration>
- ]]></programlisting>
+</configuration>]]></programlisting>
 		</sect2>
 		<sect2 id="loading_from_repository">
 			<title>Loading from a configuration repository</title>
@@ -231,11 +222,9 @@
 				&RepositorySource; instance to point to the desired repository, and then call the <code>loadFrom(&RepositorySource; source)</code>
 				method:
 			</para>
-    	<programlisting role="JAVA"><![CDATA[
-RepositorySource configSource = ...
+    	<programlisting role="JAVA"><![CDATA[RepositorySource configSource = ...
 JcrConfiguration config = new JcrConfiguration();
-configuration.loadFrom(configSource);
- ]]></programlisting>
+configuration.loadFrom(configSource);]]></programlisting>
 			<para>
 				This really is a more advanced way to define your configuration, so we won't go into how you configure a &RepositorySource;.
 				Suffice to say that you can create a &JcrConfiguration; that uses a &RepositorySource;, programmatically define the configuration,
@@ -264,13 +253,11 @@
 				<para>Each repository source definition must include the name of the &RepositorySource; class as well as each bean property
 					that should be set on the object:
 				</para>
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
+    		<programlisting role="JAVA"><![CDATA[JcrConfiguration config = ...
 config.repositorySource("source A")
       .usingClass(InMemoryRepositorySource.class)
       .setDescription("The repository for our content")
-      .setProperty("defaultWorkspaceName", workspaceName);
- ]]></programlisting>
+      .setProperty("defaultWorkspaceName", workspaceName);]]></programlisting>
 				<para>
 					This example defines an in-memory source with the name "source A", a description, and a single "defaultWorkspaceName" bean property.
 					Different &RepositorySource; implementations will the bean properties that are required and optional.
@@ -289,8 +276,7 @@
 				<title>Repositories</title>
 				<para>Each repository must be defined to use a named repository source, but all other aspects (e.g., namespaces, node types, options) 
 					are optional.</para> 
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
+<programlisting role="JAVA"><![CDATA[JcrConfiguration config = ...
 config.repository("repository A")
       .addNodeTypes("myCustomNodeTypes.cnd")
       .setSource("source 1")
@@ -299,12 +285,10 @@
       
       /*
        * As a convenience, DNA allows guest users full access by default.  In a production system,
-	   * you would want to limit this access by adding one of the lines below to modify this option:
+       * you would want to limit this access by adding one of the lines below to modify this option:
        * .setOption(JcrRepository.Option.ANONYMOUS_USER_ROLES, ""); // No access
        * .setOption(JcrRepository.Option.ANONYMOUS_USER_ROLES, "readonly"); // Read-only access
-       */
-       
- ]]></programlisting>
+       */]]></programlisting>
 				<para>
 					This example defines a repository that uses the "source 1" repository source (which could be a federated source, an in-memory source,
 					a database store, or any other source).  Additionally, this example adds the node types in the "myCustomNodeTypes.cnd" file as those
@@ -325,15 +309,13 @@
 				<para>Each defined sequencer must specify the name of the &StreamSequencer; implementation class as well as the path expressions
 					defining which nodes should be sequenced and the output paths defining where the sequencer output should be placed (often as a function
 					of the input path expression).</para> 
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
+    		<programlisting role="JAVA"><![CDATA[JcrConfiguration config = ...
 config.sequencer("Image Sequencer")
       .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
       .loadedFromClasspath()
       .setDescription("Sequences image files to extract the characteristics of the image")
       .sequencingFrom("//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data]")
-      .andOutputtingTo("/images/$1");
- ]]></programlisting>
+      .andOutputtingTo("/images/$1");]]></programlisting>
 				<para>
 					This shows an example of a sequencer definition named "Image Sequencer" that uses the &ImageMetadataSequencer; class 
 					(loaded from the classpath), that is to sequence the "jcr:data" property on any new or changed nodes that are named 
@@ -356,11 +338,9 @@
 				<title>MIME type detectors</title>
 				<para>Each defined MIME type detector must specify the name of the &MimeTypeDetector; implementation class as well as any
 					other bean properties required by the implementation.</para> 
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
+    		<programlisting role="JAVA"><![CDATA[JcrConfiguration config = ...
 config.mimeTypeDetector("Extension Detector")
-      .usingClass(org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector.class);
- ]]></programlisting>
+      .usingClass(org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector.class);]]></programlisting>
 				<para>
 					Of course, the class can be specified as Class reference or a string (followed by whether the class should be loaded from
 					the classpath or from a specific classpath).
@@ -375,6 +355,93 @@
 			</sect3>
 		</sect2>
 	</sect1>
+	<sect1 id="dna_and_jndi">
+		<title>Deploying JBoss DNA via JNDI</title>
+		<para>
+			Sometimes your applications can simply define a &JcrConfiguration; and instantiate the &JcrEngine; instance directly.
+			This is very straightforward, and this is what the <link linkend="downloading_and_running">JBoss DNA examples</link> do.
+		</para>
+		<para>
+			Web applications are a different story. Often, you may not want your web application to contain the code that initializes
+			a JBoss DNA engine.  Or, you may want the same &JcrEngine; instance to be reused in multiple web applications deployed 
+			to the same web/application server. In these cases, it is possible to configure the web/app server's JNDI instance to
+			instantiate the &JcrEngine;, meaning the web applications need only use the standard JNDI and JCR APIs.
+		</para>
+		<sect2 id="dna_and_jndi_application">
+			<title>Example application using JCR and JNDI</title>
+			<para>
+				Here's an example of how such a web application would obtain a JCR &Repository; instance, use it to create a &JcrSession;,
+				and then close the session when completed.  
+			</para>
+    	<programlisting role="JAVA"><![CDATA[Session session = null;
+
+try {
+  // Look up the JCR Repository object ...
+	InitialContext initCtx = new InitialContext();
+	Context envCtx = (Context) initCtx.lookup("java:comp/env");
+	Repository repo = (Repository) envCtx.lookup("jcr/local");		// name in JNDI is defined by configuration
+	
+	// Obtain a JCR Session using simple authentication
+	// (or use anonymous authentication if desired)
+	session = repo.login(new SimpleCredentials("username", "password".toCharArray()));
+	
+	// Use the JCR Session to do something interesting
+	
+} catch (Exception ex) {
+	ex.printStackTrace();
+} finally {
+	if (session != null) session.logout();
+}]]></programlisting>
+			<para>
+				Note that the location of the &Repository; instance in JNDI depends upon the configuration. In this example, we used
+				"<code>jcr/local</code>", but the only requirement is that it match the location where it was placed in JNDI.
+			</para>
+			<para>
+				We showed how web applications can use an existing &Repository; instance. In the next section, we describe how to configure
+				the web server so that the &Repository; instance is available in JNDI.
+			</para>
+		</sect2>
+		<sect2 id="dna_and_jndi_configuring">
+			<title>Configuring JCR and JNDI</title>
+			<para>
+				Each kind of web server or application server is different, but all servlet containers do provide a way of configuring
+				objects and placing them into JNDI.  JBoss DNA provides a &JndiRepositoryFactory; class that implements &ObjectFactory;
+				and that can be used in the server's configuration. The &JndiRepositoryFactory; requires two properties:
+				<itemizedlist>
+					<listitem>
+						<para>
+							<emphasis role="strong"><code>configFile</code></emphasis> is the path to the 
+							<link linkend="loading_from_file">configuration file</link> resource, which must be available on the classpath
+						</para>
+					</listitem>
+					<listitem>
+						<para>
+							<emphasis role="strong"><code>repositoryName</code></emphasis> is the name of a JCR repository that exists
+							in the &JcrConfiguration; and that will be made available by this JNDI entry
+						</para>
+					</listitem>
+				</itemizedlist>
+			</para>
+			<para>
+				Here's an example of a fragment of the <code>conf/context.xml</code> for Tomcat:
+			</para>
+<programlisting role="XML"><![CDATA[<Resource name="jcr/local" 
+          auth="Container"
+          type="javax.jcr.Repository"
+          factory="org.jboss.dna.jcr.JndiRepositoryFactory"
+          configFile="/resource/path/to/configuration.xml"
+          repositoryName="Test Repository Source" />]]></programlisting>
+			<para>
+				Note that it is possible to have multiple <code>Resource</code> entries. The &JndiRepositoryFactory; ensures
+				that only one &JcrEngine; is instantiated, but that a &Repository; instance is registered for each entry.
+			</para>
+			<para>
+				Before the server can start, however, all of the JBoss DNA jars need to be placed on the classpath for the server.
+				JAAS also needs to be configured, and this can be done using the application server's configuration or in your
+				web application if you're using a simple servlet container. For more details, see the &ReferenceGuide;.
+			</para>
+		</sect2>
+	</sect1>
 	<sect1 id="using_dna_whats_next">
 		<title>What's next</title>
 		<para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:30:13 UTC (rev 1571)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-09 21:30:31 UTC (rev 1572)
@@ -126,6 +126,7 @@
 <!ENTITY JcrConfiguration		       		"<ulink url='&API;jcr/JcrConfiguration.html'><classname>JcrConfiguration</classname></ulink>">
 <!ENTITY JcrRepository			       		"<ulink url='&API;jcr/JcrRepository.html'><classname>JcrRepository</classname></ulink>">
 <!ENTITY JcrSession					       		"<ulink url='&API;jcr/JcrSession.html'><classname>JcrSession</classname></ulink>">
+<!ENTITY JndiRepositoryFactory			  "<ulink url='&API;jcr/JcrRepository.html'><classname>JndiRepositoryFactory</classname></ulink>">
 
 <!-- Types in extensions/ -->
 


From dna-commits at lists.jboss.org  Sat Jan  9 16:30:51 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:30:51 -0500
Subject: [dna-commits] DNA SVN: r1573 -
	trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene.
Message-ID: <201001092130.o09LUp3Q009614@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:30:51 -0500 (Sat, 09 Jan 2010)
New Revision: 1573

Modified:
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
Added the name of the nodes to be included in full-text searches.

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-09 21:30:31 UTC (rev 1572)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-09 21:30:51 UTC (rev 1573)
@@ -380,9 +380,12 @@
             }
         }
 
+        // Always include the local name in the full-text search field ...
+        StringBuilder fullTextSearchValue = new StringBuilder();
+        fullTextSearchValue.append(localNameStr);
+
         // Index the properties
         String stringValue = null;
-        StringBuilder fullTextSearchValue = null;
         for (Property property : properties) {
             Name name = property.getName();
             Rule rule = workspace.rules.getRule(name);
@@ -446,12 +449,7 @@
 
                 if (rule.getIndexOption() != Field.Index.NO) {
                     // This field is to be full-text searchable ...
-                    if (fullTextSearchValue == null) {
-                        fullTextSearchValue = new StringBuilder();
-                    } else {
-                        fullTextSearchValue.append(' ');
-                    }
-                    fullTextSearchValue.append(stringValue);
+                    fullTextSearchValue.append(' ').append(stringValue);
 
                     // Also create a full-text-searchable field ...
                     String fullTextNameString = processor.fullTextFieldName(nameString);
@@ -460,7 +458,7 @@
             }
         }
         // Add the full-text-search field ...
-        if (fullTextSearchValue != null && fullTextSearchValue.length() != 0) {
+        if (fullTextSearchValue.length() != 0) {
             doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
         }
         getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);


From dna-commits at lists.jboss.org  Sat Jan  9 16:31:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 16:31:34 -0500
Subject: [dna-commits] DNA SVN: r1574 - in trunk/docs:
	reference/src/main/docbook/en-US and 6 other directories.
Message-ID: <201001092131.o09LVYVd009661@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 16:31:34 -0500 (Sat, 09 Jan 2010)
New Revision: 1574

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
   trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors.png
Removed:
   trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-0.2.png
Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/text.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-future.png
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
DNA-621 More improvements to the Getting Started and Reference Guide. The query language section is incomplete, but that will be finished very soon.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -191,8 +191,7 @@
 		<para>The <code>main(String[] argv)</code> method is of course the method that is executed when the application is run.  This code
 		  creates the JBoss DNA configuration using the programmatic style.
 		</para>
-		<programlisting role="JAVA"><![CDATA[
-// Create the configuration. 
+		<programlisting role="JAVA"><![CDATA[// Create the configuration. 
 String repositoryId = "content";
 String workspaceName = "default";
 JcrConfiguration config = new JcrConfiguration();

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -440,8 +440,123 @@
 				JAAS also needs to be configured, and this can be done using the application server's configuration or in your
 				web application if you're using a simple servlet container. For more details, see the &ReferenceGuide;.
 			</para>
+			<note>
+				<para>
+					The JBoss DNA community has solicited input on how we can make it easier to consume and use JBoss DNA in applications
+					that do not use Maven. Check out the <ulink url="http://community.jboss.org/thread/146589">discussion thread</ulink>,
+					and please add any suggestions or opinions!
+				</para>
+			</note>
+			<para>
+				Then, your web application needs to reference the <code>Resource</code> and state its requirements in its 
+				<code>web.xml</code>:
+			</para>
+<programlisting role="XML"><![CDATA[<resource-env-ref>
+   <description>Repository</description>
+   <resource-env-ref-name>jcr/local</resource-env-ref-name>
+   <resource-env-ref-type>javax.jcr.Repository</resource-env-ref-type>
+</resource-env-ref>]]></programlisting>
+			<para>
+				Note that the value of <code>resource-env-ref-name</code> matches the value of the name attribute on the 
+				<code>&lt;Resource></code> tag in the <code>context.xml</code> described above.  This is a must.
+			</para>
+			<para>
+				At this point, your web application can perform the lookup of the &Repository; object, create and use a &Session;,
+				and then close the &Session;.  Here's an example of a JSP page that does this:
+			</para>
+<programlisting role="JAVA"><![CDATA[
+<%@ page import="
+	javax.naming.*,
+	javax.jcr.*,
+	org.jboss.security.config.IDTrustConfiguration
+	" %>
+<%!
+
+static {
+	// Initialize IDTrust
+	String configFile = "security/jaas.conf.xml";
+	IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+	try {
+	    idtrustConfig.config(configFile);
+	} catch (Exception ex) {
+	    throw new IllegalStateException(ex);
+	}
+}
+%>
+<%
+Session sess = null;
+try {
+	InitialContext initCtx = new InitialContext();
+	Context envCtx = (Context) initCtx.lookup("java:comp/env");
+	Repository repo = (Repository) envCtx.lookup("jcr/local");
+	sess = repo.login(new SimpleCredentials("readwrite", "readwrite".toCharArray()));
+
+	// Do something interesting with the Session ...
+	out.println(sess.getRootNode().getPrimaryNodeType().getName());
+} catch (Exception ex) {
+	ex.printStackTrace();
+} finally {
+	if (sess != null) sess.logout();
+}
+%>
+]]></programlisting>			
+			<para>
+				Since this uses a servlet container, there is no JAAS implementation configured, so note the 
+				loading of IDTrust to create the JAAS realm.  (To make this work in Tomcat, the security
+				folder that contains the <code>jaas.conf.xml</code>, <code>users.properties</code>, and
+				<code>roles.properties</code> needs to be moved into the <code>%CATALINA_HOME%</code> directory.
+				Moving the security folder into the <code>conf</code> directory did not allow those files
+				to be visible by the JSP page.)
+			</para>
+			<note>
+				<para>
+				If you use an application server such as <ulink url="http://www.jboss.com/products/platforms/application/">JBoss EAP</ulink>,
+				you could just configure the JAAS realm as part of the server configuration and be done with it.
+			  </para>
+			</note>
 		</sect2>
 	</sect1>
+	<sect1 id="using_dna_via_maven">
+		<title>Using JBoss DNA via Maven</title>
+		<para>
+			JBoss DNA is a Maven-based project. If your application is using Maven, it is very easy to add a dependency on 
+			JBoss DNA's JCR library (plus any extensions), and Maven will ensure your application has access to all 
+			of the JBoss DNA artifacts and all 3rd-party libraries upon which DNA depends. 
+			Simply add a dependency in your application's POM:
+		</para>
+<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-jcr</artifactId>
+  <version>0.7</version>
+</dependency>
+]]></programlisting>
+			<para>
+				plus dependencies for each optional extension (sequencers, connectors, MIME type detectors, etc.):
+			</para>
+<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-connector-store-jpa</artifactId>
+  <version>0.7</version>
+</dependency>
+...
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-sequencer-java</artifactId>
+  <version>0.7</version>
+</dependency>
+]]></programlisting>
+		<para>
+			Then, continue by defining a &JcrConfiguration; and building the engine, as discussed <link linkend="jcr-engine">earlier</link>.
+			This is very straightforward, and this is exactly what the <link linkend="downloading_and_running">JBoss DNA examples</link> do.
+		</para>
+		<note>
+			<para>
+				The JBoss DNA community has solicited input on how we can make it easier to consume and use JBoss DNA in applications
+				that do not use Maven. Check out the <ulink url="http://community.jboss.org/thread/146589">discussion thread</ulink>,
+				and please add any suggestions or opinions!
+			</para>
+		</note>
+	</sect1>
 	<sect1 id="using_dna_whats_next">
 		<title>What's next</title>
 		<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -64,22 +64,47 @@
 				<title>JBoss DNA's JCR implementation delegates to a connector</title>
 				<graphic align="center" scale="100" fileref="dnajcr-and-connector.png"/>
 			</figure>
-			That single connector could use an in-memory repository, a JBoss Cache instance (including those that are clustered and replicated), 
-			or a federated repository where content from multiple sources is unified.
-			<figure id="dna-connectors-0.2">
-				<title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
-				<graphic align="center" scale="100" fileref="dna-connectors-0.2.png"/>
-			</figure>
+				That single repository connector could access:
+		</para>
+ 		<itemizedlist>
+			<listitem>
+				<para>a transient, in-memory repository</para>
+			</listitem>
+			<listitem>
+				<para>an Infinispan data grid that acts as an extremely scalable, highly-available store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a JBoss Cache instance that acts as a clustered and replicated store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a JDBC database used as a store for repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses existing JDBC databases to project the schema structure as read-only repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses a file systems to present the files and directory structure as (updatable) repository content</para>
+			</listitem>
+			<listitem>
+				<para>a repository that accesses an SVN repository to present the files and directory structure as (updatable) repository content</para>
+			</listitem>
+			<listitem>
+				<para>a federated repository that presents a unified, updatable view of the content in multiple other systems (which are accessed via connectors)</para>
+			</listitem>
+		</itemizedlist>
+		<figure id="dna-connectors">
+			<title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
+			<graphic align="center" scale="100" fileref="dna-connectors.png"/>
+		</figure>
+		<para>
 			Really, the federated connector gives us all kinds of	possibilities, since we can use that connector on top of lots of connectors 
 			to other individual sources.  This simple connector architecture is fundamentally what makes JBoss DNA so powerful and flexible.
 			Along with a good library of connectors, which is what we're planning to create.
 		</para>
 		<para>
-			For instance, we want to build a connector to <ulink url="&JIRA-39;">other JCR repositories</ulink>, and another that accesses
-			the <ulink url="&JIRA-34;">local file system</ulink>.  We've already started on a <ulink url="&JIRA-36;">Subversion connector</ulink>, 
-			which will allow JCR to access the files in a SVN repository (and perhaps push changes into SVN through a commit).  
-			And of course we want to create a connector that accesses <ulink url="&JIRA-199;">data</ulink>
-			and <ulink url="&JIRA-37;">metadata</ulink> from relational databases.  For more information, check out our
+			For instance, we want to build a connector to <ulink url="&JIRA;-39">other JCR repositories</ulink>, and
+			another to access <ulink url="&JIRA;-199">existing databases</ulink> so that some or all of the existing data (in whatever structure)
+	    can be accessed through JCR.  For more information, check out our
 			<ulink url="&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
 			Of course, if we don't have a connector to suit your needs, you can <link linkend="custom-connectors">write your own</link>.
 			<figure id="dna-connectors-future">
@@ -248,7 +273,7 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
 </dependency>
 	 ]]></programlisting>
 			<para>
@@ -264,14 +289,14 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-common</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -314,7 +314,7 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
 </dependency>
 	 ]]></programlisting>
 			<para>These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
@@ -325,14 +325,14 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-common</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
@@ -370,7 +370,7 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-jcr</artifactId>
-  <version>0.6</version>
+  <version>0.7</version>
   <scope>test</scope>
 </dependency>
 <!-- Java Content Repository API -->

Modified: trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -138,15 +138,18 @@
 			behavior.
 	  </para>
 	  <para>
-		  JBoss DNA has not yet passed enough of the TCK tests to publish the results.  We still have to implement
-		  queries, which is a required feature of Level 1 repositories.  However, suffice to say that JBoss DNA has passed
-		  many of the individual tests that make up the Level 1 and Level 2 tests, and it is a major objective of the next
-		  release to pass the remaining Level 1 and Level 2 tests (along with some other optional features).
-    </para>
+		  JBoss DNA has implemented all of the JCR Level 1 and Level 2 features, along with the optional locking and observation
+		  features. The only optional feature not implemented is versioning, and that will be coming soon.
+		</para>
 		<para>
-			JBoss DNA also frequently runs the JCR unit tests from the Apache Jackrabbit project.  (Those these tests are not
+			The JBoss DNA project also frequently runs the JCR TCK unit tests from the reference implementation.  (Those these tests are not
 			the official TCK, they apparently are used within the official TCK.)  These unit tests are set up in the
 			<code>dna-jcr-tck</code> project.
 		</para>
+		<para>
+		  The 0.7 release passes 96% of the JCR TCK tests, and all of the failures are because of a handful of known issues.
+		  Fortunately, most of these are either less-frequently-used features of JCR or issues that can be worked around.
+		  The JBoss DNA project plans to focus on resolving all the remaining JCR TCK failures, and will publish the results.
+		</para>
   </sect1>
 </chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -38,8 +38,65 @@
 		and compile preferences to ensure no warnings or errors.
   </para>
 	<para>
-		The rest of this chapter talks in more detail about these different tools and how to set them up.
+		The rest of this chapter talks in more detail about these different tools and how to set them up. But first, we briefly describe
+		our approach to development.
 	</para>
+  <sect1 id="methodology">
+    <title>Development methodology</title>
+    <para>
+			Rather than use a single formal development methodology, the JBoss DNA project incorporates those techniques, activities, and 
+			processes that are practical and work for the project. In fact, the committers are given a lot of freedom for how they develop 
+			the components and features they work on.
+		</para>
+		<para>
+			Nevertheless, we do encourage familiarity with several major techniques, including:
+			<itemizedlist>
+				<listitem>
+					<para>
+						<emphasis role="strong"><ulink url="&Wikipedia;Agile_software_development">Agile software development</ulink></emphasis>
+					  includes those software methodologies (e.g., Scrum) that promote development iterations and open collaboration.  While the
+						JBoss DNA project doesn't follow these closely, we do emphasize the importance of always having running software
+						and using running software as a measure of progress.  The JBoss DNA project also wants to move to more frequent
+						releases (on the order of 4-6 weeks)
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						<emphasis role="strong"><ulink url="&Wikipedia;Test-driven_development">Test-driven development (TDD)</ulink></emphasis>
+						techniques encourage first writing test cases for new features and functionality, then changing the code to add the
+						new features and functionality, and finally the code is refactored to clean-up and address any duplication or inconsistencies.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						<emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
+						is an evolution of TDD, where developers specify the desired behaviors first (rather than writing "tests").
+						In reality, this BDD adopts the language of the user so that tests are written using words that are meaningful
+						to users.  With recent test frameworks (like JUnit 4.4), we're able to write our unit tests to express
+						the desired behavior.  For example, a test class for sequencer implementation might have a test method
+						<code>shouldNotThrowAnErrorWhenStreamIsNull()</code>, which is very easy to understand the intent.
+						The result appears to be a larger number of finer-grained test methods, but which are more easily understood
+						and easier to write.  In fact, many advocates of BDD argue that one of the biggest challenges of TDD is knowing what
+						tests to write in the beginning, whereas with BDD the shift in focus and terminology make it easier for more
+						developers to enumerate the tests they need.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						<emphasis role="strong"><ulink url="&Wikipedia;Lean_software_development">Lean software development</ulink></emphasis>
+						is an adaptation of <ulink url="&Wikipedia;Lean_manufacturing">lean manufacturing techniques</ulink>,
+						where emphasis is placed on eliminating waste (e.g., defects, unnecessary complexity, unnecessary code/functionality/features), 
+						delivering as fast as possible, deferring irrevocable decisions as much as possible,
+						continuous learning (continuously adapting and improving the process), empowering the team (or community, in our case),
+						and several other guidelines.  Lean software development can be thought of as an evolution of agile techniques
+						in the same way that behavior-driven development is an evolution of test-driven development.  Lean techniques
+						help the developer to recognize and understand how and why features, bugs, and even their processes impact the development
+						of software.
+					</para>
+				</listitem>
+			</itemizedlist>
+    </para>
+  </sect1>
 	<sect1 id="jdk">
 		<title>JDK</title>
 		<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -221,62 +221,6 @@
 			the issues appropriately.
     </para>
   </sect1>
-  <sect1 id="methodology">
-    <title>Development methodology</title>
-    <para>
-			Rather than use a single formal development methodology, the JBoss DNA project incorporates those techniques, activities, and 
-			processes that are practical and work for the project. In fact, the committers are given a lot of freedom for how they develop 
-			the components and features they work on.
-		</para>
-		<para>
-			Nevertheless, we do encourage familiarity with several major techniques, including:
-			<itemizedlist>
-				<listitem>
-					<para>
-						<emphasis role="strong"><ulink url="&Wikipedia;Agile_software_development">Agile software development</ulink></emphasis>
-					  includes those software methodologies (e.g., Scrum) that promote development iterations and open collaboration.  While the
-						JBoss DNA project doesn't follow these closely, we do emphasize the importance of always having running software
-						and using running software as a measure of progress.  The JBoss DNA project also wants to move to more frequent
-						releases (on the order of 4-6 weeks)
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						<emphasis role="strong"><ulink url="&Wikipedia;Test-driven_development">Test-driven development (TDD)</ulink></emphasis>
-						techniques encourage first writing test cases for new features and functionality, then changing the code to add the
-						new features and functionality, and finally the code is refactored to clean-up and address any duplication or inconsistencies.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						<emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
-						is an evolution of TDD, where developers specify the desired behaviors first (rather than writing "tests").
-						In reality, this BDD adopts the language of the user so that tests are written using words that are meaningful
-						to users.  With recent test frameworks (like JUnit 4.4), we're able to write our unit tests to express
-						the desired behavior.  For example, a test class for sequencer implementation might have a test method
-						<code>shouldNotThrowAnErrorWhenStreamIsNull()</code>, which is very easy to understand the intent.
-						The result appears to be a larger number of finer-grained test methods, but which are more easily understood
-						and easier to write.  In fact, many advocates of BDD argue that one of the biggest challenges of TDD is knowing what
-						tests to write in the beginning, whereas with BDD the shift in focus and terminology make it easier for more
-						developers to enumerate the tests they need.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						<emphasis role="strong"><ulink url="&Wikipedia;Lean_software_development">Lean software development</ulink></emphasis>
-						is an adaptation of <ulink url="&Wikipedia;Lean_manufacturing">lean manufacturing techniques</ulink>,
-						where emphasis is placed on eliminating waste (e.g., defects, unnecessary complexity, unnecessary code/functionality/features), 
-						delivering as fast as possible, deferring irrevocable decisions as much as possible,
-						continuous learning (continuously adapting and improving the process), empowering the team (or community, in our case),
-						and several other guidelines.  Lean software development can be thought of as an evolution of agile techniques
-						in the same way that behavior-driven development is an evolution of test-driven development.  Lean techniques
-						help the developer to recognize and understand how and why features, bugs, and even their processes impact the development
-						of software.
-					</para>
-				</listitem>
-			</itemizedlist>
-    </para>
-  </sect1>
   <sect1 id="modules">
     <title>JBoss DNA modules</title>
     <para>
@@ -288,11 +232,9 @@
             contains JBoss DNA's implementation of the JCR API. If you're using JBoss DNA as a JCR repository, this is the
  						top-level dependency that you'll want to use.  The module defines all required dependencies, except for
  						the repository connector(s) and any sequencer implementations needed by your configuration.
-						As we'll see later on, using JBoss DNA as a JCR repository is easy: simply create a configuration, start the JCR engine,
-						get the JCR &Repository; object for your repository, and then use the JCR API.
-						This module also contains the Jackrabbit JCR API unit tests that verify the behavior of the JBoss DNA implementation.
-						As DNA does not fully implement the JCR 1.0.1 specification, there are a series of tests that are currently commented 
-            out in this module.  The <code>dna-jcr-tck</code> module contains all of these tests.
+						As we'll see later on, using JBoss DNA as a JCR repository is easy: simply create a <link linkend="configuration">configuration</link>, 
+						start JBoss DNA's <link linkend="jcr_engine">JCR engine</link>,	get the JCR &Repository; object for your repository, and then use the JCR API.
+						This module also uses the JCR unit tests from the reference implementation to verify the behavior of the JBoss DNA implementation.
           </para>
         </listitem>
         <listitem>
@@ -304,21 +246,21 @@
         </listitem>
         <listitem>
           <para>
+            <emphasis role="strong">dna-cnd</emphasis>
+            provides a self-contained utility for parsing CND (Compact Node Definition) files and transforming
+						the node definitions into a graph notation compatible with JBoss DNA's JCR implementation.
+          </para>
+        </listitem>        
+        <listitem>
+          <para>
             <emphasis role="strong">dna-graph</emphasis>
             defines the Application Programming Interface (API) for JBoss DNA's low-level graph model,
-						including a DSL-like API for working with graph content.  This module also defines the
+						including a fluent-style API for working with graph content.  This module also defines the
  						APIs necessary to implement custom connectors, sequencers, and MIME type detectors.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-cnd</emphasis>
-            provides a self-contained utility for parsing CND (Compact Node Definition) files and transforming
-						the node definitions into a graph notation compatible with JBoss DNA's JCR implementation.
-          </para>
-        </listitem>        
-        <listitem>
-          <para>
             <emphasis role="strong">dna-common</emphasis>
             is a small low-level library of common utilities and frameworks, including logging, progress monitoring,
             internationalization/localization, text translators, component management, and class loader factories.
@@ -329,14 +271,6 @@
       <itemizedlist>
         <listitem>
           <para>
-            <emphasis role="strong">dna-jcr-tck</emphasis>
-            provides a separate testing project that executes all Jackrabbit JCR TCK tests on a nightly basis to track implementation
-            progress against the JCR 1.0 specification.  This module will likely be retired when the <code>dna-jcr</code> implementation
-            is complete.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
             <emphasis role="strong">dna-integration-tests</emphasis>
             provides a home for all of the integration tests that involve more components that just unit tests. Integration
             tests are often more complicated, take longer, and involve testing the integration and functionality of multiple
@@ -345,87 +279,87 @@
           </para>
         </listitem>
       </itemizedlist>
-      The following modules are optional extensions that may be used selectively and as needed (and are located in the source
-      under the
-      <code>extensions/</code>
-      directory):
+      The following modules are optional extensions that may be used selectively and as needed
+ 			(and are located in the source under the <code>extensions/</code> directory):
       <itemizedlist>
         <listitem>
           <para>
-            <emphasis role="strong">dna-classloader-maven</emphasis>
-            is a small library that provides a
-            <code>ClassLoaderFactory</code>
-            implementation that can create
-            <code>java.lang.ClassLoader</code>
-            instances capable of loading classes given a Maven Repository and a list of Maven coordinates. The Maven Repository
-            can be managed within a JCR repository.
+            <emphasis role="strong">dna-connector-infinispan</emphasis>
+            is the preferred DNA repository connector for persistently storing content.
+            <ulink url="http://infinispan.org">Infinispan</ulink> is an extremely scalable, highly available data grid platform
+ 						that distributes the data across the nodes in the grid.
+            This connector makes it possible for repository content to be stored in a very efficient, fast,
+            highly-concurrent (essentially lock- and synchronization-free), and reliable manner, 
+            even when the content size grows to massive sizes. This connector is capable of storing any kind of content, and
+						dictates how the content is stored on the data grid.  Therefore, this connector cannot be used to access the content
+						of existing data grids created by/for other applications.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-common-jdbc</emphasis>
-            contains several helpful utility classes for interacting with JDBC connections.
+            <emphasis role="strong">dna-connector-jbosscache</emphasis>
+            is a DNA repository connector that stores content within a
+            <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink>
+            instance. JBoss Cache is a powerful cache implementation that can serve as a distributed cache and that can persist
+            information. The cache instance can be found via JNDI or created and managed by the connector.
+						This connector is capable of storing any kind of content, and dictates how the content is stored in the cache.
+						Therefore, this connector cannot be used to access the content
+						of existing cache instances created by/for other applications.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-federation</emphasis>
-            is a DNA repository connector that federates, integrates and caches information from multiple sources (via other
-            repository connectors).
+            <emphasis role="strong">dna-connector-jdbc-metadata</emphasis>
+            is a DNA repository connector that provides read-only access to metadata and schema information from relational databases 
+						through a JDBC connection.  This connector provides an optional and configurable caching facility to prevent frequent
+						requests to the database.
           </para>
-        </listitem>
+        </listitem>        
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-filesystem</emphasis>
-            is a DNA repository connector that provides read-only access to file systems, allowing their structure and data to be 
-            viewed as repository content.
+            <emphasis role="strong">dna-connector-store-jpa</emphasis>
+            is a DNA repository connector that stores content in a JDBC database, using the Java Persistence API (JPA) and the
+						very highly-regarded and widely-used <ulink url="http://www.hibernate.org">Hibernate</ulink> implementation.
+						This connector is capable of storing any kind of content, and dictates the schema in which it stores the content.
+						Therefore, this connector cannot be used to access the data in existing created by/for other applications.
           </para>
         </listitem>
-        <!--listitem>
-          <para>
-            <emphasis role="strong">dna-connector-jdbc-metadata</emphasis>
-            is a prototype DNA repository connector that provides read-only access to metadata from relational databases through a JDBC 
-            connection.
-                        <emphasis>This is still under development.</emphasis>
-          </para>
-        </listitem-->        
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-jbosscache</emphasis>
-            is a DNA repository connector that manages content within a
-            <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink>
-            instance. JBoss Cache is a powerful cache implementation that can serve as a distributed cache and that can persist
-            information. The cache instance can be found via JNDI or created and managed by the connector.
+            <emphasis role="strong">dna-connector-filesystem</emphasis>
+            is a DNA repository connector that accesses the files and folders on (a part of) the local file system, providing that
+  					content in the form of <code>nt:file</code> and <code>nt:folder</code> nodes. This connector <emphasis>does</emphasis>
+						support updating the file system when changes are made to the <code>nt:file</code> and <code>nt:folder</code> nodes.
+						However, this connector does not support storing other kinds of nodes.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-infinispan</emphasis>
-            is a DNA repository connector that stores content in a deployed instance of <ulink url="http://infinispan.org">Infinispan</ulink>.
-            Infinispan is an extremely scalable, highly available data grid platform that distributes the data across the nodes 
-            in the grid.  This connector makes it possible for repository content to be stored in a very efficient, fast,
-            higly-concurrent (essentially lock- and synchronization-free) and reliable manner, 
-            even when the content size grows to massive sizes.
+            <emphasis role="strong">dna-connector-svn</emphasis>
+            is a DNA repository connector that accesses the content of an existing Subversion repository, providing that content in
+						the form of <code>nt:file</code> and <code>nt:folder</code> nodes. This connector <emphasis>does</emphasis>
+						support updating the SVN repository when changes are made to the <code>nt:file</code> and <code>nt:folder</code> nodes.
+						However, this connector does not support storing other kinds of nodes.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-store-jpa</emphasis>
-            is a DNA sequencer that provides for persistent storage and access of DNA content in a relational database.  This connector
-            is based on JPA technology.
+            <emphasis role="strong">dna-sequencer-cnd</emphasis>
+            is a DNA sequencer that extracts JCR node definitions from JCR Compact Node Definition (CND) files.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-connector-svn</emphasis>
-            is a prototype DNA sequencer that obtains content from a Subversion repository, providing that content in
-						the form of <code>nt:file</code> and <code>nt:folder</code> nodes.
+            <emphasis role="strong">dna-sequencer-ddl</emphasis>
+            is a DNA sequencer that extracts the structure and content from DDL files.
+            <emphasis>This is still under development and includes support for the basic DDL statements in
+							in the Oracle, PostgreSQL, Derby, and standard DDL dialects.</emphasis>
           </para>
         </listitem>
         <listitem>
           <para>
             <emphasis role="strong">dna-sequencer-zip</emphasis>
-            is a DNA sequencer that extracts from ZIP archives the files (with content) and folders.
+            is a DNA sequencer that extracts the files (with content) and directories from ZIP archives.
           </para>
         </listitem>
         <listitem>
@@ -436,22 +370,23 @@
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-images</emphasis>
-            is a DNA sequencer that extracts the image metadata (e.g., size, date, etc.) from PNG, JPEG, GIF, BMP, PCS, IFF,
-            RAS, PBM, PGM, and PPM image files.
+            <emphasis role="strong">dna-sequencer-classfile</emphasis>
+            is a DNA sequencer that extracts the package, class/type, member, documentation, annotations, and other information
+            from Java class files.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-mp3</emphasis>
-            is a DNA sequencer that extracts metadata (e.g., author, album name, etc.) from MP3 audio files.
+            <emphasis role="strong">dna-sequencer-java</emphasis>
+            is a DNA sequencer that extracts the package, class/type, member, documentation, annotations, and other information
+            from Java source files.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-java</emphasis>
-            is a DNA sequencer that extracts the package, class/type, member, documentation, annotations, and other information
-            from Java source files.
+            <emphasis role="strong">dna-sequencer-jbpm-jpdl</emphasis>
+            is a prototype DNA sequencer that extracts process definition metadata from jBPM process definition language (jPDL) files.
+						<emphasis>This is still under development.</emphasis>
           </para>
         </listitem>
         <listitem>
@@ -465,38 +400,47 @@
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-cnd</emphasis>
-            is a DNA sequencer that extracts JCR node definitions from JCR Compact Node Definition (CND) files.
+            <emphasis role="strong">dna-sequencer-images</emphasis>
+            is a DNA sequencer that extracts the image metadata (e.g., size, date, etc.) from PNG, JPEG, GIF, BMP, PCS, IFF,
+            RAS, PBM, PGM, and PPM image files.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-jbpm-jpdl</emphasis>
-            is a prototype DNA sequencer that extracts process definition metadata from jBPM process definition language (jPDL) files.
-						<emphasis>This is still under development.</emphasis>
+            <emphasis role="strong">dna-sequencer-mp3</emphasis>
+            is a DNA sequencer that extracts metadata (e.g., author, album name, etc.) from MP3 audio files.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-java</emphasis>
-            is a DNA sequencer that extracts the structure (methods, fields) from Java source files.
+            <emphasis role="strong">dna-sequencer-text</emphasis>
+            is a DNA sequencer that extracts data from text streams. There are separate sequencers for character-delimited sequencing 
+						and fixed width sequencing, but both treat the incoming text stream as a series of rows separated by line-terminators
+						with each row consisting of one or more columns. 
           </para>
         </listitem>  
         <listitem>
           <para>
-            <emphasis role="strong">dna-sequencer-ddl</emphasis>
-            is a DNA sequencer that extracts the structure and content from DDL files.
-                <emphasis>This is still under development and only includes a limited number of dialects and basic DDL statements.</emphasis>
+            <emphasis role="strong">dna-search-lucene</emphasis> is an implementation of the &SearchEngine; interface that
+						uses the <ulink url="http://lucene.apache.org/java/">Lucene</ulink> library. This module is one of the few
+						extensions that is used directly by the <code>dna-jcr</code> module.
           </para>
-        </listitem>      
+        </listitem>
         <listitem>
           <para>
             <emphasis role="strong">dna-mimetype-detector-aperture</emphasis>
-            is a DNA MIME type detector that uses the
+            is a &MimeTypeDetector; implementation that uses the
             <ulink url="http://aperture.sourceforge.net/">Aperture</ulink>
-            library to determine the best MIME type from the filename and file contents.
+            library to determine the best MIME type given the name and contents of a file.
           </para>
         </listitem>
+        <listitem>
+          <para>
+            <emphasis role="strong">dna-classloader-maven</emphasis> is a small library that provides a
+            &ClassLoaderFactory; implementation that can create &ClassLoader; instances capable of loading classes given 
+						a Maven Repository and a list of Maven coordinates. The Maven Repository can be managed within a JCR repository.
+          </para>
+        </listitem>
       </itemizedlist>
       The following modules make up the various web application projects (and are located in the source
       under the
@@ -522,7 +466,7 @@
         <listitem>
           <para>
             <emphasis role="strong">dna-web-jcr-rest-client</emphasis>
-            is an API that uses POJOs to access the REST web service. This API eliminates the need for applications to know how
+            is a library that uses POJOs to access the REST web service. This module eliminates the need for applications to know how
             to create HTTP request URLs and payloads, and how to parse the JSON responses. It can be used to publish (upload) 
             and unpublish (delete) files from DNA repositories. 
           </para>
@@ -555,21 +499,80 @@
           </para>
         </listitem>
       </itemizedlist>
-      Finally, there is a module that represents the whole JBoss DNA project:
+      Another module provides some utility functionality:
       <itemizedlist>
         <listitem>
           <para>
-            <emphasis role="strong">dna</emphasis>
-            is the parent project that aggregates all of the other projects and that contains some asset files to create the
-            necessary Maven artifacts during a build.
+            <emphasis role="strong">dna-jpa-ddl-gen</emphasis> provides a standalone utility that can generate the DDL
+						for the database schema used by the JPA connector. Because it uses Hibernate, it can generate DDL for any
+						of the databases that the connector can use.
           </para>
         </listitem>
       </itemizedlist>
+      There is another module that runs the full suite of JCR TCK tests, and which at the moment still contains some failures.
+      <itemizedlist>
+        <listitem>
+          <para>
+            <emphasis role="strong">dna-jcr-tck</emphasis> provides a separate testing project that executes all reference implementation's
+ 						JCR TCK tests on a nightly basis to track implementation progress against the JCR 1.0 specification. 
+						This module will likely be retired when the JBoss DNA JCR implementation is complete, since <code>dna-jcr</code> and
+						<code>dna-integration-tests</code> will be running the full suite of JCR TCK unit tests.
+          </para>
+        </listitem>
+      </itemizedlist>
+      Finally, there is a Maven parent <code>pom.xml</code> file that aggregates all of the other projects, provides common
+      defaults for Maven plugins and dependency versions used throughout the modules, and definition of various asset files
+      to help build the necessary Maven artifacts during a build.
+    </para>
+  	<para>
       Each of these modules is a Maven project with a group ID of
       <code>org.jboss.dna</code>
       . All of these projects correspond to artifacts in the
       <ulink url="&JBossMaven;">JBoss Maven 2 Repository</ulink>
       .
     </para>
+	</sect1>
+  <sect1 id="whats_new">
+    <title>What's new?</title>
+	  <para>
+			With version 0.7, JBoss DNA introduces support for JCR <link linkend="jcr-query-and-search">query and search</link> 
+			with a number of query languages, including the <link linkend="jcr-xpath-query-language">JCR XPath language</link> 
+			(required by the 1.0 specification), the <link linkend="jcr-sql2-query-language">JCR-SQL2 dialect</link>
+			defined by the JCR 2.0 specification, and a <link linkend="fulltext-search-query-language">full-text search language</link>.  
+			This release also adds support for JCR locking and observation.
+		</para>
+		<para>This means that <emphasis role="strong">JBoss DNA now implements all of the JCR Level 1 and Level 2 features, 
+			along with the optional locking and observation features</emphasis>. 
+			The only optional feature not implemented is versioning, and that will be coming soon.
+		  This version passes more than 95% of the JCR TCK tests, and all of the failures are because of a handful of known issues.
+		  Fortunately, most of these are either less-frequently-used features of JCR or issues that can be worked around.
+		</para>
+		<para>
+			This release also introduces a number of new and improved connectors.  Both the <link linkend="file-system-connector">file system connector</link>
+			and <link linkend="subversion-connector">SVN connector</link> were reworked to support reads and updates, and they 
+			both offer a preview of an optional caching system.  The <link linkend="jdbc-storage-connector">JPA storage connector</link>
+			was dramatically improved and is significantly faster, more capable, and more efficient.
+			The new <link linkend="jdbc-metadata-connector">JDBC metadata connector</link> is a technology preview of a connector
+			that provides read-only access to the schema information of relational databases through JDBC.
+		</para>
+		<para>
+			JBoss DNA 0.7 includes a number of new and improved sequencers. The new <link linkend="text-sequencer">text sequencer</link>
+			is able to extract structured data from comma-separated or fixed-width text files. The new <link linkend="ddl-file-sequencer">DDL sequencer</link>
+			is capable of parsing a number of DDL dialects to extract the more important DDL statements. The <link linkend="cnd-sequencer">CND sequencer</link>
+			was rewritten and dramatically simplified to perform better, fix a number of known issues, and eliminate a dependency on a third-party library.
+			There is also a new <link linkend="java-class-sequencer">Java class file sequencer</link> that operates on Java class
+			files and produces output that is very similar to the <link linkend="java-source-sequencer">Java source file sequencer</link>,
+			and that can be used in conjunction with the <link linkend="zip-file-sequencer">ZIP file sequencer</link> to extract the Java metadata
+			from JARs, WARs, and EAR files.
+		</para>
+		<para>
+		  This release also brings numerous bug fixes and improvements, and upgrades all third-party dependencies to the latest
+		  versions available at the time of release. The build system now supports 
+			<ulink url="http://jbossdna.blogspot.com/2009/09/running-tests-against-different-dbmses.html">running all of the tests against a variety
+		  of databases</ulink>, making it very easy to test against DBMSes that JBoss DNA doesn't directly test against.
+			A new DDL generation utility was also introduced that produces the DDL for the database used by the JPA connector.
+			And JCR repositories now support the use of <link linkend="jcr-guess-access">anonymous users</link>, and this is 
+			enabled by default but can easily be changed for production purposes.
+		</para>
   </sect1>
 </chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -167,7 +167,7 @@
 				Here is the configuration file that is used in the repository example, though it has been simplified a bit and most comments 
 				have been removed for clarity):
 			</para>
-    	<programlisting role="JAVA"><![CDATA[
+    	<programlisting role="XML"><![CDATA[
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
 	  <!-- 
@@ -365,6 +365,208 @@
 			</sect3>
 		</sect2>
 	</sect1>
+	<sect1 id="dna_and_jndi">
+		<title>Deploying JBoss DNA via JNDI</title>
+		<para>
+			Sometimes your applications can simply define a &JcrConfiguration; and instantiate the &JcrEngine; instance directly.
+			This is very straightforward, and this is what the <link linkend="downloading_and_running">JBoss DNA examples</link> do.
+		</para>
+		<para>
+			Web applications are a different story. Often, you may not want your web application to contain the code that initializes
+			a JBoss DNA engine.  Or, you may want the same &JcrEngine; instance to be reused in multiple web applications deployed 
+			to the same web/application server. In these cases, it is possible to configure the web/app server's JNDI instance to
+			instantiate the &JcrEngine;, meaning the web applications need only use the standard JNDI and JCR APIs.
+		</para>
+		<sect2 id="dna_and_jndi_application">
+			<title>Example application using JCR and JNDI</title>
+			<para>
+				Here's an example of how such a web application would obtain a JCR &Repository; instance, use it to create a &JcrSession;,
+				and then close the session when completed.  
+			</para>
+    	<programlisting role="JAVA"><![CDATA[Session session = null;
+
+try {
+  // Look up the JCR Repository object ...
+	InitialContext initCtx = new InitialContext();
+	Context envCtx = (Context) initCtx.lookup("java:comp/env");
+	Repository repo = (Repository) envCtx.lookup("jcr/local");		// name in JNDI is defined by configuration
+
+	// Obtain a JCR Session using simple authentication
+	// (or use anonymous authentication if desired)
+	session = repo.login(new SimpleCredentials("username", "password".toCharArray()));
+
+	// Use the JCR Session to do something interesting
+
+} catch (Exception ex) {
+	ex.printStackTrace();
+} finally {
+	if (session != null) session.logout();
+}]]></programlisting>
+			<para>
+				Note that the location of the &Repository; instance in JNDI depends upon the configuration. In this example, we used
+				"<code>jcr/local</code>", but the only requirement is that it match the location where it was placed in JNDI.
+			</para>
+			<para>
+				We showed how web applications can use an existing &Repository; instance. In the next section, we describe how to configure
+				the web server so that the &Repository; instance is available in JNDI.
+			</para>
+		</sect2>
+		<sect2 id="dna_and_jndi_configuring">
+			<title>Configuring JCR and JNDI</title>
+			<para>
+				Each kind of web server or application server is different, but all servlet containers do provide a way of configuring
+				objects and placing them into JNDI.  JBoss DNA provides a &JndiRepositoryFactory; class that implements &ObjectFactory;
+				and that can be used in the server's configuration. The &JndiRepositoryFactory; requires two properties:
+				<itemizedlist>
+					<listitem>
+						<para>
+							<emphasis role="strong"><code>configFile</code></emphasis> is the path to the 
+							<link linkend="loading_from_file">configuration file</link> resource, which must be available on the classpath
+						</para>
+					</listitem>
+					<listitem>
+						<para>
+							<emphasis role="strong"><code>repositoryName</code></emphasis> is the name of a JCR repository that exists
+							in the &JcrConfiguration; and that will be made available by this JNDI entry
+						</para>
+					</listitem>
+				</itemizedlist>
+			</para>
+			<para>
+				Here's an example of a fragment of the <code>conf/context.xml</code> for Tomcat:
+			</para>
+<programlisting role="XML"><![CDATA[<Resource name="jcr/local" 
+          auth="Container"
+          type="javax.jcr.Repository"
+          factory="org.jboss.dna.jcr.JndiRepositoryFactory"
+          configFile="/resource/path/to/configuration.xml"
+          repositoryName="Test Repository Source" />]]></programlisting>
+			<para>
+				Note that it is possible to have multiple <code>Resource</code> entries. The &JndiRepositoryFactory; ensures
+				that only one &JcrEngine; is instantiated, but that a &Repository; instance is registered for each entry.
+			</para>
+			<para>
+				Before the server can start, however, all of the JBoss DNA jars need to be placed on the classpath for the server.
+				JAAS also needs to be configured, and this can be done using the application server's configuration or in your
+				web application if you're using a simple servlet container. For more details, see the &ReferenceGuide;.
+			</para>
+			<note>
+				<para>
+					The JBoss DNA community has solicited input on how we can make it easier to consume and use JBoss DNA in applications
+					that do not use Maven. Check out the <ulink url="http://community.jboss.org/thread/146589">discussion thread</ulink>,
+					and please add any suggestions or opinions!
+				</para>
+			</note>
+			<para>
+				Then, your web application needs to reference the <code>Resource</code> and state its requirements in its 
+				<code>web.xml</code>:
+			</para>
+<programlisting role="XML"><![CDATA[<resource-env-ref>
+   <description>Repository</description>
+   <resource-env-ref-name>jcr/local</resource-env-ref-name>
+   <resource-env-ref-type>javax.jcr.Repository</resource-env-ref-type>
+</resource-env-ref>]]></programlisting>
+			<para>
+				Note that the value of <code>resource-env-ref-name</code> matches the value of the name attribute on the 
+				<code>&lt;Resource></code> tag in the <code>context.xml</code> described above.  This is a must.
+			</para>
+			<para>
+				At this point, your web application can perform the lookup of the &Repository; object, create and use a &Session;,
+				and then close the &Session;.  Here's an example of a JSP page that does this:
+			</para>
+<programlisting role="JAVA"><![CDATA[
+<%@ page import="
+	javax.naming.*,
+	javax.jcr.*,
+	org.jboss.security.config.IDTrustConfiguration
+	" %>
+<%!
+
+static {
+	// Initialize IDTrust
+	String configFile = "security/jaas.conf.xml";
+	IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+	try {
+	    idtrustConfig.config(configFile);
+	} catch (Exception ex) {
+	    throw new IllegalStateException(ex);
+	}
+}
+%>
+<%
+Session sess = null;
+try {
+	InitialContext initCtx = new InitialContext();
+	Context envCtx = (Context) initCtx.lookup("java:comp/env");
+	Repository repo = (Repository) envCtx.lookup("jcr/local");
+	sess = repo.login(new SimpleCredentials("readwrite", "readwrite".toCharArray()));
+
+	// Do something interesting with the Session ...
+	out.println(sess.getRootNode().getPrimaryNodeType().getName());
+} catch (Exception ex) {
+	ex.printStackTrace();
+} finally {
+	if (sess != null) sess.logout();
+}
+%>
+]]></programlisting>			
+			<para>
+				Since this uses a servlet container, there is no JAAS implementation configured, so note the 
+				loading of IDTrust to create the JAAS realm.  (To make this work in Tomcat, the security
+				folder that contains the <code>jaas.conf.xml</code>, <code>users.properties</code>, and
+				<code>roles.properties</code> needs to be moved into the <code>%CATALINA_HOME%</code> directory.
+				Moving the security folder into the <code>conf</code> directory did not allow those files
+				to be visible by the JSP page.)
+			</para>
+			<note>
+				<para>
+				If you use an application server such as <ulink url="http://www.jboss.com/products/platforms/application/">JBoss EAP</ulink>,
+				you could just configure the JAAS realm as part of the server configuration and be done with it.
+			  </para>
+			</note>
+		</sect2>
+	</sect1>
+	<sect1 id="using_dna_via_maven">
+		<title>Using JBoss DNA via Maven</title>
+		<para>
+			JBoss DNA is a Maven-based project. If your application is using Maven, it is very easy to add a dependency on 
+			JBoss DNA's JCR library (plus any extensions), and Maven will ensure your application has access to all 
+			of the JBoss DNA artifacts and all 3rd-party libraries upon which DNA depends. 
+			Simply add a dependency in your application's POM:
+		</para>
+<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-jcr</artifactId>
+  <version>0.7</version>
+</dependency>
+]]></programlisting>
+			<para>
+				plus dependencies for each optional extension (sequencers, connectors, MIME type detectors, etc.):
+			</para>
+<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-connector-store-jpa</artifactId>
+  <version>0.7</version>
+</dependency>
+...
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-sequencer-java</artifactId>
+  <version>0.7</version>
+</dependency>
+]]></programlisting>
+		<para>
+			Then, continue by defining a &JcrConfiguration; and building the engine, as discussed <link linkend="jcr-engine">earlier</link>.
+			This is very straightforward, and this is exactly what the <link linkend="downloading_and_running">JBoss DNA examples</link> do.
+		</para>
+		<note>
+			<para>
+				The JBoss DNA community has solicited input on how we can make it easier to consume and use JBoss DNA in applications
+				that do not use Maven. Check out the <ulink url="http://community.jboss.org/thread/146589">discussion thread</ulink>,
+				and please add any suggestions or opinions!
+			</para>
+		</note>
+	</sect1>
 	<sect1 id="using_dna_whats_next">
 		<title>What's next</title>
 		<para>

Added: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ JBoss DNA (http://www.jboss.org/dna)
+  ~
+  ~ See the COPYRIGHT.txt file distributed with this work for information
+  ~ regarding copyright ownership.  Some portions may be licensed
+  ~ to Red Hat, Inc. under one or more contributor license agreements.
+  ~ See the AUTHORS.txt file in the distribution for a full listing of 
+  ~ individual contributors.
+  ~
+  ~ JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+  ~ is licensed to you under the terms of the GNU Lesser General Public License as
+  ~ published by the Free Software Foundation; either version 2.1 of
+  ~ the License, or (at your option) any later version.
+  ~
+  ~ JBoss DNA is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"	[
+<!ENTITY % CustomDTD SYSTEM "../../custom.dtd">
+%CustomDTD;
+]>
+<chapter id="jcr-query-and-search">
+  <title>Querying and Searching using JCR</title>
+  <para>
+	</para>
+  <sect1 id="jcr-query-api">	
+    <title>JCR Query API</title>
+	  <para>
+		</para>
+	</sect1>
+  <sect1 id="jcr-xpath-query-language">	
+    <title>JCR XPath Query Language</title>
+	  <para>
+		</para>
+	</sect1>
+  <sect1 id="jcr-sql2-query-language">	
+    <title>JCR-SQL2 Query Language</title>
+	  <para>
+		  The JCR-SQL2 query language is defined by the <ulink url="&JSR283;">JCR 2.0 specification</ulink> as a way to express
+		  queries using strings that are similar to SQL. JBoss DNA includes full support for this query language, and even
+		  adds several extensions to make it even more powerful.
+		</para>
+	</sect1>
+  <sect1 id="fulltext-search-query-language">	
+    <title>Full-Text Search Language</title>
+	  <para>
+		  There are times when a formal structured query language is overkill, and the easiest way to find the right content
+		  is to perform a search, like you would with a search engine such as Google or Yahoo! 
+		  This is where JBoss DNA's <emphasis role="strong">full-text search language</emphasis> comes in, because it allows
+		  you to use the JCR query API but with a far simpler, Google-style search grammar.
+		</para>
+		<para>
+			This query language is actually defined by the <ulink url="&JSR283;">JCR 2.0 specification</ulink> as the full-text 
+			search expression grammar used in the second parameter of the <code>CONTAINS(...)</code> function of the JCR-SQL2 language.
+			We just pulled it out and made it available as a first-class query language.
+		</para>
+		<para>
+			This language allows a JCR client to construct a query to find nodes with property values that match
+			the supplied terms. Nodes that "best" match the terms are returned before nodes that have a lesser match.
+			Of course, JBoss DNA uses a complex system to analyze the node content and the query terms, and may perform
+			a number of optimizations, such as (but not limited to) eliminating stop words (e.g., "the", "a", "and", etc.), treating terms
+			independent of case, and converting words to base forms using a process called <emphasis>stemming</emphasis> (e.g., "running"
+			into "run", "customers" into "customer").
+		</para>
+		<para>
+			Search terms can also include phrases by simply wrapping the phrase with double-quotes.  For example, 
+			the search term '<code>table "customer invoice"</code>' would rank higher those nodes with properties containing
+			the phrase "customer invoice" than nodes with properties containing just "customer" or "invoice".
+		</para>
+		<para>
+			Term in the query are implicitly AND-ed together, meaning that the matches occur when a node has property values
+			that match <emphasis>all</emphasis> of the terms. However, it is also possible to put an "OR" in between two terms
+			where either of those terms may occur.
+		</para>
+		<para>
+			It is also possible to specify that terms should <emphasis>not</emphasis> appear in the results. This is called
+			a <emphasis>negative term</emphasis>, and it reduces the rank of any node whose property values contain the
+			the value. To specify a negative term, simply prefix the term with a hyphen ('-').
+		</para>
+		<sect2 id='fulltext-grammar'>
+			<title>Grammar</title>
+			<para>
+				The grammar for this full-text search language is specified in Section 6.7.19 of the 
+				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, but it is also included here as a convenience:
+			</para>
+<programlisting><![CDATA[
+
+FulltextSearch ::= Disjunct {Space 'OR' Space Disjunct}
+
+Disjunct ::= Term {Space Term}
+
+Term ::= ['-'] SimpleTerm
+
+SimpleTerm ::= Word | '"' Word {Space Word} '"'
+
+Word ::= NonSpaceChar {NonSpaceChar}
+
+Space ::= SpaceChar {SpaceChar}
+
+NonSpaceChar ::= Char - SpaceChar /* Any Char except SpaceChar */
+
+SpaceChar ::= ' '
+
+Char ::= /* Any character */
+
+]]></programlisting>
+			<para>
+			  As you can see, this is a pretty simple and straightforward query language. But this language makes it extremely
+			  easy to find all the nodes in the repository that match a set of terms.
+ 		 	</para>
+		 	<para>
+			  When using this query language, the &QueryResult; always contains the "jcr:path" and "jcr:score" columns.
+ 		 	</para>
+		</sect2>
+	</sect1>
+</chapter>


Property changes on: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -271,7 +271,7 @@
 			The DNA REST server is deployed as a WAR and configured mostly through its web configuration file (web.xml).  
 			Here is an example web configuration that is used for integration testing of the DNA REST server along with
 			an explanation of its parts.
-<programlisting role="xml"><![CDATA[
+<programlisting role="XML"><![CDATA[
 <?xml version="1.0"?>
 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                          "http://java.sun.com/dtd/web-app_2_3.dtd">
@@ -283,7 +283,7 @@
 		</para>
 		<para>
 			The next stanza configures the <link linkend="jcr_rest_spi">repository provider</link>.
-<programlisting role="xml"><![CDATA[
+<programlisting role="XML"><![CDATA[
   <!--
     This parameter provides the fully-qualified name of a class that implements
     the o.j.d.web.jcr.rest.spi.RepositoryProvider interface.  It is required
@@ -301,7 +301,7 @@
 
 		<para>
 			Next we configure the DNA &JcrEngine; itself.
-<programlisting role="xml"><![CDATA[
+<programlisting role="XML"><![CDATA[
   <!--
     This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
     the name of the configuration file to initialize the repository or repositories.
@@ -320,7 +320,7 @@
 
 		<para>
 			This is followed by a bit of RESTEasy and JAX-RS boilerplate.
-<programlisting role="xml"><![CDATA[
+<programlisting role="XML"><![CDATA[
   <!--
     This parameter defines the JAX-RS application class, which is really just a metadata class
     that lets the JAX-RS engine (RESTEasy in this case) know which classes implement pieces
@@ -361,7 +361,7 @@
 		
 		<para>
 			Finally, security must be configured for the REST server.
-<programlisting role="xml"><![CDATA[
+<programlisting role="XML"><![CDATA[
   <!-- 
     The JBoss DNA REST implementation leverages the HTTP credentials to for authentication and authorization
     within the JCR repository.  It makes no sense to try to log into the JCR repository without credentials,
@@ -418,7 +418,7 @@
 	  <para>
 	  		If you are using Maven to build your projects, the WAR can be built from a POM.  Here is a portion of the 
 	  		POM used to build the JBoss DNA REST Server integration subproject.
-<programlisting role='xml'>	<![CDATA[
+<programlisting role='XML'><![CDATA[
 <project xmlns="http://maven.apache.org/POM/4.0.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
@@ -426,7 +426,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.6</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest-war</artifactId>
@@ -438,7 +438,7 @@
 		<dependency>
 			<groupId>org.jboss.dna</groupId>
 			<artifactId>dna-web-jcr-rest</artifactId>
-			<version>0.6</version>
+			<version>0.7</version>
 		</dependency>
 
 		<dependency>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -38,7 +38,7 @@
   
   <para>
   	This sequencer can be added to the repository configuration like so:
-<programlisting>
+<programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("CND Sequencer")
@@ -47,7 +47,6 @@
       .setDescription("Sequences CND files to extract the node type definitions")
       .sequencingFrom("//(*.cnd[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/nodeTypes/$1");
-
-</programlisting>  	 
+]]></programlisting>  	 
   </para>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -31,24 +31,33 @@
 <chapter id="ddl-file-sequencer">
   <title>DDL File Sequencer</title>
     <para>
-        The DDL file sequencer is included in JBoss DNA and is capable of parsing the more important DDL statements from several 
-        different dialects, and constructing a graph structure that is largely the same for all dialects (though some dialects will 
-        result in dialect-specific properties and maybe nodes). The sequencer attempts to detect the dialect by running multiple 
-        parsers and finding the one with the "best fit".</para>
+        The DDL file sequencer included in JBoss DNA is capable of parsing the more important DDL statements from SQL-92,
+				Oracle, Derby, and PostgreSQL, and constructing a graph structure containing a structured representation of these statements.
+				The resulting graph structure is largely the same for all dialects, though some dialects have non-standard additions
+				to their grammar, and thus require dialect-specific additions to the graph structure.
+		</para>
+		<para>
+			  The sequencer is designed to behave as smart as possible with as little configuration. Thus, the sequencer
+			  automatically determines the dialect used by a given DDL stream. This can be tricky, of course, since most dialects
+			  are very similar and the distinguishing features of a dialect may only be apparent in some of the statements.
+		</para>
+		<para>
+			To get around this, the sequencer uses a "best fit" algorithm: run the DDL stream through the parser for each of
+			the dialects, and determine which parser was able to successfully read the greatest number of statements and tokens.
+		</para>
     <para>
         One very interesting capability of this sequencer is that, although only a subset of the (more common) DDL statements 
         are supported, the sequencer is still extremely functional since it does still add all statements into the output graph, 
         just without much detail other than just the statement text and the position in the DDL file. Thus, if a DDL file 
-        contains statements the sequencer understands and statements that the sequencer does not understand, the graph will 
-        still contain all statements and those statements understood by the sequencer will have their full detail. 
+        contains statements the sequencer understands and statements the sequencer does not understand, the graph will 
+        still contain all statements, where those statements understood by the sequencer will have full detail. 
         Since the underlying parsers are able to operate upon a single statement, it is possible to go back later 
         (after the parsers have been enhanced to support additional DDL statements) and re-parse only those incomplete statements 
         in the graph.
     </para>
     <para>
-        Initially the following ddl dialects are included with this sequencer: Oracle, Derby, Postgres and MySql.</para>
-    <para>
-        Each specific dialect extends a basic parser framework implementing the SQL 92 spec and includes
+        At this time, the sequencer supports SQL-92 standard DDL as well as dialects from Oracle, Derby, and PostgreSQL.
+        It supports:
         <itemizedlist>
             <listitem>
                 <para>Detailed parsing of CREATE SCHEMA, CREATE TABLE and ALTER TABLE.</para>
@@ -59,36 +68,68 @@
             <listitem>
                 <para>General parsing of remaining schema definition statements (i.e. CREATE VIEW, CREATE DOMAIN, etc.</para>
             </listitem>
-            <listitem>
-                <para>Does NOT perform detailed parsing of SQL (i.e. SELECT, INSERT, UPDATE, etc....) statements.</para>
-            </listitem>
         </itemizedlist>
+        Note that the sequencer does <emphasis>not</emphasis> perform detailed parsing of SQL (i.e. SELECT, INSERT, UPDATE, etc....) statements.
     </para>
+		<caution>
+			<para>
+			The DDL sequencer is being included as a Technology Preview.  It is fully functional for the dialects listed above, and may indeed
+			work on certain DDL files that use other dialects. But we would like to have feedback from users, test against more DDL examples,
+			support additional dialects, and support more kinds of DDL statements. As such, the output format and node types 
+			associated with the &DefaultClassFileRecorder; may change in future versions.
+			</para>
+		</caution>
     <sect1>
         <title>Example</title>
 	    <para>Sequencing results in graph nodes basically representing the BNF structure of each DDL statement. Below is an example DDL
 	        schema definition statement containing table and view definition statements.
 	    </para>
-	    <programlisting>
+	    <programlisting><![CDATA[
 CREATE SCHEMA hollywood
 	  CREATE TABLE films (title varchar(255), release date, producerName varchar(255))
 	  CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;
-	    </programlisting>
-	    <para>The resulting graph structure, shown below contains the raw statement expression, pertinent table, column and key
-	        reference information as well as critical integer position values (line number, column number and character index) to
-	        tie the statement back to the original DDL file.
+]]></programlisting>
+	    <para>
+				The resulting graph structure contains the raw statement expression, pertinent table, column and key
+	      reference information and position of the statement in the text stream (e.g., line number, column number and character index)
+	      so the statement can be tied back to the original DDL:
 	    </para>
-	    <programlisting>
-	<![CDATA[
-<name = "statements" primaryType = "nt:unstructured" uuid = "ee3db6e6-fa59-46db-bd3f-c555b4fa4a50" parserId = "POSTGRES">
-      <name = "hollywood" startLineNumber = "1" primaryType = "nt:unstructured" uuid = "3e084a7d-7da8-4068-9b03-b1aed9ac9c7a" startColumnNumber = "1" mixinTypes = "ns001:createSchemaStatement" expression = "CREATE SCHEMA hollywood" startCharIndex = "0">
-            <name = "films" startLineNumber = "2" primaryType = "nt:unstructured" uuid = "b622cdcb-69fa-4aa2-8510-f35c0a8ddcbe" startColumnNumber = "5" mixinTypes = "ns001:createTableStatement" expression = "CREATE TABLE films (title varchar(255), release date, producerName varchar(255))" startCharIndex = "28">
-            <name = "title" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "d7e962bb-cd37-4df4-ab53-ab78fd72c153" mixinTypes = "ns001:columnDefinition">
-            <name = "release" datatypeName = "DATE" primaryType = "nt:unstructured" uuid = "83aa7c21-82f7-416e-8c23-5c308a1c4257" mixinTypes = "ns001:columnDefinition">
-            <name = "producerName" datatypeName = "VARCHAR" datatypeLength = "255" primaryType = "nt:unstructured" uuid = "a51ed903-4d2c-4cd9-83e2-a76884b923aa" mixinTypes = "ns001:columnDefinition">
-      <name = "winners" startLineNumber = "3" primaryType = "nt:unstructured" uuid = "9eeef501-ad7e-4e25-9891-b86485e48dc1" startColumnNumber = "5" mixinTypes = "ns001:createViewStatement" expression = "CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;" queryExpression = " SELECT title, release FROM films WHERE producerName IS NOT NULL" startCharIndex = "113">
-	]]>
-	    </programlisting>
+	    <programlisting role="XML"><![CDATA[<nt:unstructured jcr:name="statements" ddl:parserId="POSTGRES">
+  <nt:unstructured jcr:name="hollywood" jcr:mixinTypes="ddl:createSchemaStatement" 
+	                 ddl:startLineNumber="1"
+                   ddl:startColumnNumber="1"
+                   ddl:expression="CREATE SCHEMA hollywood"
+                   ddl:startCharIndex="0">
+    <nt:unstructured jcr:name="films" jcr:mixinTypes="ddl:createTableStatement"
+                   ddl:startLineNumber="2"
+                   ddl:startColumnNumber="5"
+                   ddl:expression="CREATE TABLE films (title varchar(255), release date, producerName varchar(255))"
+                   ddl:startCharIndex="28"/>
+    <nt:unstructured jcr:name="title" jcr:mixinTypes="ddl:columnDefinition"
+                   ddl:datatypeName="VARCHAR"
+                   ddl:datatypeLength="255"/>
+    <nt:unstructured jcr:name="release" jcr:mixinTypes="ddl:columnDefinition"
+                   ddl:datatypeName="DATE"/>
+    <nt:unstructured jcr:name="producerName" jcr:mixinTypes="ddl:columnDefinition"
+                   ddl:datatypeName="VARCHAR"
+                   ddl:datatypeLength="255"/>
+  <nt:unstructured jcr:name="winners" jcr:mixinTypes="ddl:createViewStatement"
+                   ddl:startLineNumber="3"
+                   ddl:startColumnNumber="5"
+                   ddl:expression="CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT NULL;"
+                   ddl:queryExpression="SELECT title, release FROM films WHERE producerName IS NOT NULL"
+                   ddl:startCharIndex="113"/>
+</nt:unstructured>
+]]></programlisting>
+			<para>
+				Note that all nodes are of type <code>nt:unstructured</code> while the type of statement is identified using
+				mixins. Also, each of the nodes representing a statement contain: a <code>ddl:expression</code> property with
+				the exact statement as it appeared in the original DDL stream; a <code>ddl:startLineNumber</code> and
+				<code>ddl:startColumnNumber</code> property defining the position in the original DDL stream of the first character
+				in the expression; and a <code>ddl:startCharIndex</code> property that defines the integral index of the first
+				character in the expression as found in the DDL stream.  All of these properties make sure the statement can
+				be traced back to its location in the original DDL.
+			</para> 
     </sect1>
     <para>
     </para>
@@ -96,7 +137,7 @@
         To use this sequencer, simply include the <code>dna-sequencer-ddl</code> JAR
         in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
-   <programlisting>
+   <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("DDL Sequencer")
@@ -105,5 +146,5 @@
       .setDescription("Sequences DDL files to extract individual statements and accompanying statement properties and values")
       .sequencingFrom("//(*.(ddl)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/ddls/$1"); 
-    </programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -95,7 +95,7 @@
 			To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
 			in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
      </para>
-   	<programlisting>
+   	<programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 config.sequencer("Image Sequencer")
       .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
@@ -103,6 +103,5 @@
       .setDescription("Sequences image files to extract the characteristics of the image")
       .sequencingFrom("//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/images/$1");
-
-</programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -80,28 +80,44 @@
 		</tgroup>
 	</table>
 	<para>
-		The default class file recorder creates a subgraph rooted at the output location that takes the following form (with primary types in parentheses):  
+		The default class file recorder creates a subgraph rooted at the output location that takes the following form:  
 	</para>
-	<programlisting>
-&lt;graph root&gt;
-  + &lt;package name 1&gt; (nt:unstructured)
-  	.
-  	.
-  	.
-    + &lt;package name N&gt;(nt:unstructured)
-       + &lt;class name&gt; (class:class)
-         + class:annotations (class:annotations)
-         | + &lt;annotation name&gt; - one per annotation (class:annotation)
-         + class:constructors (class:constructors)
-         | + &lt;constructor parameters&gt; - one per constructor (class:constructor)
-         |   + &lt;annotation name&gt; - one per annotation (class:annotation)
-         + class:methods (class:methods)
-         | + &lt;method name (parameters)&gt; - one per method (class:method)
-         |   + &lt;annotation name&gt; - one per annotation (class:annotation)
-         + class:fields (class:fields)
-           + &lt;field name&gt; - one per field (class:field)
-             + &lt;annotation name&gt; - one per annotation (class:annotation)
-	</programlisting>
+	<programlisting role="XML"><![CDATA[
+<nt:unstructured jcr:name="packageName1">
+	...
+    <nt:unstructured jcr:name="packageNameN">
+	    <class:class jcr:name="ClassName">
+		    <class:annotations jcr:name="class:annotations">
+			    <class:annotation jcr:name="AnnotationName1"/>
+			    ...
+			    <class:annotation jcr:name="AnnotationNameN"/>
+		    </class:annotations>
+		    <class:constructors jcr:name="class:constructors">
+			    <class:constructor jcr:name="constructor parameters">
+				    <class:annotation jcr:name="AnnotationName1"/>
+				    ...
+				    <class:annotation jcr:name="AnnotationNameN"/>
+			    </class:constructor>
+		    </class:constructors>
+		    <class:methods jcr:name="class:methods">
+			    <class:method jcr:name="methodName(parameters)">
+				    <class:annotation jcr:name="AnnotationName1"/>
+				    ...
+				    <class:annotation jcr:name="AnnotationNameN"/>
+			    </class:method>
+		    </class:methods>
+		    <class:fields jcr:name="class:field">
+			    <class:field jcr:name="fieldName">
+				    <class:annotation jcr:name="AnnotationName1"/>
+				    ...
+				    <class:annotation jcr:name="AnnotationNameN"/>
+			    </class:field>
+		    </class:fields>
+		  </class:class>
+    </nt:unstructured>
+	...
+</nt:unstructured>
+]]></programlisting>
 	<para>
 		The compact node definitions for the class:* types is provided below.  <emphasis>Please note that these definitions may change in a future release.</emphasis>
 	</para>
@@ -177,7 +193,7 @@
         To use this sequencer, simply include the <code>dna-sequencer-classfile</code> JAR
         in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
-   	<programlisting>
+   	<programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("Java Class Sequencer")
@@ -185,6 +201,6 @@
       .setDescription("Sequences Java class files to extract the structure of the classes")
       .sequencingFrom("//*.class[*]/jcr:content[@jcr:data]")
       .andOutputtingTo("/classes");
-    </programlisting>
+]]></programlisting>
 
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -44,7 +44,7 @@
 		To use this sequencer, simply include the <code>dna-sequencer-java</code> JAR (plus all of the JARs that it is dependent upon)
 		in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
-  <programlisting>
+  <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("Java Sequencer")
@@ -53,5 +53,5 @@
       .setDescription("Sequences java files to extract the characteristics of the Java source")
       .sequencingFrom("//(*.(java)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/java/$1");	
-</programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -42,7 +42,7 @@
 	<ulink url="http://poi.apache.org/">POI</ulink> JARs
 	in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
    </para>
-  <programlisting>
+  <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("Microsoft Office Document Sequencer")
@@ -51,5 +51,5 @@
       .setDescription("Sequences MS Office documents, including spreadsheets and presentations")
       .sequencingFrom("//(*.(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/msoffice/$1");	
-</programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -41,7 +41,7 @@
 					To use this sequencer, simply include the <code>dna-sequencer-mp3</code> JAR and the <ulink url="http://www.jthink.net/jaudiotagger/">JAudioTagger</ulink>
 					library in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
 	      </para>
-		    <programlisting>
+		    <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("MP3 Sequencer")
@@ -50,5 +50,5 @@
       .setDescription("Sequences MP3 files to extract the ID3 tags of the audio file")
       .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/mp3s/$1");	
-	</programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/text.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/text.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/text.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -131,7 +131,7 @@
 	        To use this sequencer, simply include the <code>dna-sequencer-text</code> JAR
 	        in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
 	    </para>
-	   	<programlisting>
+	   	<programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("Delimited Text Sequencer")
@@ -141,7 +141,7 @@
       .sequencingFrom("//(*.(txt)[*])/jcr:content[@jcr:data]")
       .setProperty("splitPattern", "|")
       .andOutputtingTo("/txt/$1"); 
-	    </programlisting>
+]]></programlisting>
 	</sect1>
 	<sect1>
         <title>Fixed Width Text Sequencer</title>
@@ -177,7 +177,7 @@
 	        To use this sequencer, simply include the <code>dna-sequencer-text</code> JAR
 	        in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
 	    </para>
-	   	<programlisting>
+	   	<programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("Fixed Width Text Sequencer")
@@ -187,6 +187,6 @@
       .sequencingFrom("//(*.(txt)[*])/jcr:content[@jcr:data]")
       .setProperty("columnStartPositions", "3,6,15")
       .andOutputtingTo("/txt/$1"); 
-	    </programlisting>
+]]></programlisting>
 	</sect1>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -34,7 +34,7 @@
     This sequencer stores the structure and data of an XML file into the repository.  DTD, entity, comments, 
     and other content are maintained by the sequencer in the output structure.
   </para>
-  <programlisting>
+  <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("XML Sequencer")
@@ -43,5 +43,5 @@
       .setDescription("Sequences XML documents and maps their data into the repository")
       .sequencingFrom("//(*.xml[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/xml/$1");	
-</programlisting>  
+]]></programlisting>  
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -39,7 +39,7 @@
 		To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
 		in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
-   <programlisting>
+   <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("ZIP Sequencer")
@@ -48,5 +48,5 @@
       .setDescription("Sequences compressed files to extract the internal file and folder structure")
       .sequencingFrom("//(*.(zip|gz|jar|war|ear)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/zips/$1");	
-	</programlisting>
+]]></programlisting>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-09 21:31:34 UTC (rev 1574)
@@ -1,5 +1,5 @@
-<!ENTITY versionNumber "0.6">
-<!ENTITY copyrightYears "2008-2009">
+<!ENTITY versionNumber "0.7">
+<!ENTITY copyrightYears "2008-2010">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 
 <!-- Frequently used URLs -->
@@ -7,14 +7,14 @@
 <!ENTITY Home       					"http://www.jboss.org/dna/">
 <!ENTITY Downloads  					"&Home;downloads.html">
 <!ENTITY Community  					"&Home;community.html">
-<!ENTITY DocHome    					"http://www.jboss.org/file-access/default/members/dna/freezone/">
-<!ENTITY API        					"&DocHome;docs/&versionNumber;/apidocs/org/jboss/dna/">
+<!ENTITY DocHome    					"http://docs.jboss.org/jbossdna">
+<!ENTITY API        					"&DocHome;/&versionNumber;/api/org/jboss/dna/">
 <!ENTITY JIRA       					"http://jira.jboss.org/jira/browse/DNA">
 <!ENTITY Roadmap       				"&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">
 <!ENTITY Subversion  					"http://anonsvn.jboss.org/repos/dna/">
 <!ENTITY Fisheye							"http://fisheye.jboss.org/browse/DNA/">
 <!ENTITY SecureSubversion  		"https://svn.jboss.org/repos/dna/">
-<!ENTITY Forums     					"http://www.jboss.com/index.html?module=bb&amp;op=viewforum&amp;f=272">
+<!ENTITY Forums     					"http://community.jboss.org/en/dna">
 <!ENTITY JSR170  							"http://www.jcp.org/en/jsr/detail?id=170">
 <!ENTITY JSR283  							"http://www.jcp.org/en/jsr/detail?id=283">
 <!ENTITY JSR203  							"http://www.jcp.org/en/jsr/detail?id=203">
@@ -24,10 +24,10 @@
 <!ENTITY Git									"http://git-scm.com/">
 
 <!ENTITY Java									"http://java.sun.com/j2se/1.5.0/docs/api/">
-<!ENTITY JavaEE                                 "http://java.sun.com/javaee/5/docs/api/">
+<!ENTITY JavaEE               "http://java.sun.com/javaee/5/docs/api/">
 
-<!ENTITY GettingStarted           		"<ulink url='&DocHome;docs/&versionNumber;/manuals/gettingstarted/html/index.html'>Getting Started</ulink>">
-<!ENTITY ReferenceGuide           		"<ulink url='&DocHome;docs/&versionNumber;/manuals/reference/html/index.html'>Getting Started</ulink>">
+<!ENTITY GettingStarted           		"<ulink url='&DocHome;/&versionNumber;/manuals/gettingstarted/html/index.html'>Getting Started</ulink>">
+<!ENTITY ReferenceGuide           		"<ulink url='&DocHome;/&versionNumber;/manuals/reference/html/index.html'>Reference Guide</ulink>">
 
 <!ENTITY CND			      							"<ulink url='http://jackrabbit.apache.org/node-type-notation.html'>Compact Node Definition</ulink>">
 
@@ -35,7 +35,7 @@
 
 <!ENTITY String							      		"<ulink url='&Java;java/lang/String.html'><interface>String</interface></ulink>">
 <!ENTITY File  							      		"<ulink url='&Java;java/io/File.html'><classname>File</classname></ulink>">
-<!ENTITY BufferedReader					      		"<ulink url='&Java;java/io/BufferedReader.html'><classname>BufferedReader</classname></ulink>">
+<!ENTITY BufferedReader					      "<ulink url='&Java;java/io/BufferedReader.html'><classname>BufferedReader</classname></ulink>">
 <!ENTITY URL  							      		"<ulink url='&Java;java/net/URL.html'><classname>URL</classname></ulink>">
 <!ENTITY URI  							      		"<ulink url='&Java;java/net/URL.html'><classname>URI</classname></ulink>">
 <!ENTITY InputStream				      		"<ulink url='&Java;java/io/InputStream.html'><interface>InputStream</interface></ulink>">
@@ -51,18 +51,18 @@
 <!ENTITY TimeUnit						      		"<ulink url='&Java;java/util/concurrent/TimeUnit.html'><interface>TimeUnit</interface></ulink>">
 <!ENTITY UUID						      				"<ulink url='&Java;java/util/UUID.html'><classname>UUID</classname></ulink>">
 <!ENTITY DataSource			      				"<ulink url='&Java;javax/sql/DataSource.html'><classname>DataSource</classname></ulink>">
-<!ENTITY DatabaseMetaData			      "<ulink url='&Java;java/sql/DatabaseMetaData.html'><classname>DatabaseMetaData</classname></ulink>">
+<!ENTITY DatabaseMetaData			      	"<ulink url='&Java;java/sql/DatabaseMetaData.html'><classname>DatabaseMetaData</classname></ulink>">
 <!ENTITY HttpServletRequest			      "<ulink url='&JavaEE;javax/servlet/http/HttpServletRequest.html'><classname>HttpServletRequest</classname></ulink>">
 <!ENTITY Serializable							    "<ulink url='&Java;java/io/Serializable.html'><interface>Serializable</interface></ulink>">
 <!ENTITY Iterator									    "<ulink url='&Java;java/util/Iterator.html'><interface>Iterator</interface></ulink>">
-<!ENTITY Iterable								    "<ulink url='&Java;java/util/Iterable.html'><interface>Iterable</interface></ulink>">
+<!ENTITY Iterable								    	"<ulink url='&Java;java/util/Iterable.html'><interface>Iterable</interface></ulink>">
 <!ENTITY Set											    "<ulink url='&Java;java/util/Set.html'><interface>Set</interface></ulink>">
 <!ENTITY Map											    "<ulink url='&Java;java/util/Map.html'><interface>Map</interface></ulink>">
 <!ENTITY List											    "<ulink url='&Java;java/util/List.html'><interface>List</interface></ulink>">
 <!ENTITY BigDecimal								    "<ulink url='&Java;java/math/BigDecimal.html'><classname>BigDecimal</classname></ulink>">
 <!ENTITY Calendar								    	"<ulink url='&Java;java/util/Calendar.html'><classname>Calendar</classname></ulink>">
 <!ENTITY Date											    "<ulink url='&Java;java/util/Date.html'><classname>Date</classname></ulink>">
-<!ENTITY EntityManagerFactory						      		"<ulink url='&Java;javax/persistence/EntityManagerFactory.html'><classname>EntityManagerFactory</classname></ulink>">
+<!ENTITY EntityManagerFactory					"<ulink url='&Java;javax/persistence/EntityManagerFactory.html'><classname>EntityManagerFactory</classname></ulink>">
 
 
 <!-- Types in JCR API -->
@@ -73,6 +73,11 @@
 <!ENTITY SimpleCredentials					  "<interface>SimpleCredentials</interface>">
 <!ENTITY LoginException						  	"<interface>LoginException</interface>">
 <!ENTITY AccessDeniedException				"<interface>AccessDeniedException</interface>">
+<!ENTITY QueryManager									"<interface>QueryManager</interface>">
+<!ENTITY Query												"<interface>Query</interface>">
+<!ENTITY QueryResult									"<interface>QueryResult</interface>">
+<!ENTITY NodeIterator									"<interface>NodeIterator</interface>">
+<!ENTITY RowIterator									"<interface>RowIterator</interface>">
 
 <!-- Types in dna-common -->
 
@@ -102,6 +107,7 @@
 <!ENTITY SecurityContext		       		"<ulink url='&API;graph/SecurityContext.html'><interface>SecurityContext</interface></ulink>">
 <!ENTITY JaasSecurityContext		      "<ulink url='&API;graph/JaasSecurityContext.html'><classname>JaasSecurityContext</classname></ulink>">
 <!ENTITY ServletSecurityContext		   	"<ulink url='&API;graph/ServletSecurityContext.html'><interface>ServletSecurityContext</interface></ulink>">
+<!ENTITY MimeTypeDetector				      "<ulink url='&API;graph/mimetype/MimeTypeDetector.html'><interface>MimeTypeDetector</interface></ulink>">
 <!ENTITY Readable						       		"<ulink url='&API;graph/property/Readable.html'><interface>Readable</interface></ulink>">
 <!ENTITY Name								       		"<ulink url='&API;graph/property/Name.html'><interface>Name</interface></ulink>">
 <!ENTITY Path								       		"<ulink url='&API;graph/property/Path.html'><interface>Path</interface></ulink>">
@@ -109,7 +115,7 @@
 <!ENTITY Property						       		"<ulink url='&API;graph/property/Property.html'><interface>Property</interface></ulink>">
 <!ENTITY DateTime						       		"<ulink url='&API;graph/property/DateTime.html'><interface>DateTime</interface></ulink>">
 <!ENTITY Binary							       		"<ulink url='&API;graph/property/Binary.html'><interface>Binary</interface></ulink>">
-<!ENTITY Reference							       		"<ulink url='&API;graph/property/Reference'><interface>Reference</interface></ulink>">
+<!ENTITY Reference							      "<ulink url='&API;graph/property/Reference'><interface>Reference</interface></ulink>">
 <!ENTITY ValueFactory		       				"<ulink url='&API;graph/property/ValueFactory.html'><interface>ValueFactory</interface></ulink>">
 <!ENTITY ValueFactories       				"<ulink url='&API;graph/property/ValueFactories.html'><interface>ValueFactories</interface></ulink>">
 <!ENTITY ValueFormatException  				"<ulink url='&API;graph/property/ValueFormatException.html'><classname>ValueFormatException</classname></ulink>">
@@ -151,8 +157,8 @@
 <!ENTITY UnsupportedRequestException	"<ulink url='&API;graph/request/UnsupportedRequestException.html'><classname>UnsupportedRequestException</classname></ulink>">
 <!ENTITY RequestProcessor	       			"<ulink url='&API;graph/request/processor/RequestProcessor.html'><classname>RequestProcessor</classname></ulink>">
 <!ENTITY StreamSequencer		    			"<ulink url='&API;graph/sequencer/StreamSequencer.html'><interface>StreamSequencer</interface></ulink>">
-<!ENTITY StreamSequencerContext			"<ulink url='&API;graph/sequencer/StreamSequencerContext.html'><interface>StreamSequencerContext</interface></ulink>">
-<!ENTITY Sequencer		    			"<ulink url='&API;repository/sequencer/Sequencer.html'><interface>Sequencer</interface></ulink>">
+<!ENTITY StreamSequencerContext				"<ulink url='&API;graph/sequencer/StreamSequencerContext.html'><interface>StreamSequencerContext</interface></ulink>">
+<!ENTITY Sequencer		    						"<ulink url='&API;repository/sequencer/Sequencer.html'><interface>Sequencer</interface></ulink>">
 <!ENTITY SequencerOutput		    			"<ulink url='&API;graph/sequencer/SequencerOutput.html'><interface>SequencerOutput</interface></ulink>">
 <!ENTITY SequencerContext		    			"<ulink url='&API;graph/sequencer/SequencerContext.html'><interface>SequencerContext</interface></ulink>">
 <!ENTITY MimeTypeDetector					  	"<ulink url='&API;graph/mimetype/MimeTypeDetector.html'><interface>MimeTypeDetector</interface></ulink>">
@@ -164,6 +170,7 @@
 <!ENTITY NetChangeObserver						"<ulink url='&API;graph/observer/NetChangeObserver.html'><classname>NetChangeObserver</classname></ulink>">
 <!ENTITY ChangeObservers							"<ulink url='&API;graph/observer/ChangeObservers.html'><classname>ChangeObservers</classname></ulink>">
 <!ENTITY Changes											"<ulink url='&API;graph/observer/Changes.html'><classname>Changes</classname></ulink>">
+<!ENTITY SearchEngine									"<ulink url='&API;graph/search/SearchEngine.html'><interface>SearchEngine</interface></ulink>">
 
 <!-- Types in dna-repository -->
 
@@ -188,6 +195,7 @@
 <!ENTITY JcrConfiguration		       		"<ulink url='&API;jcr/JcrConfiguration.html'><classname>JcrConfiguration</classname></ulink>">
 <!ENTITY JcrRepository			       		"<ulink url='&API;jcr/JcrRepository.html'><classname>JcrRepository</classname></ulink>">
 <!ENTITY JcrSession					       		"<ulink url='&API;jcr/JcrSession.html'><classname>JcrSession</classname></ulink>">
+<!ENTITY JndiRepositoryFactory			  "<ulink url='&API;jcr/JcrRepository.html'><classname>JndiRepositoryFactory</classname></ulink>">
 <!ENTITY SecurityContextCredentials   "<ulink url='&API;jcr/SecurityContextCredentials.html'><classname>SecurityContextCredentials</classname></ulink>">
 <!ENTITY JcrNodeTypeManager       		"<ulink url='&API;jcr/JcrNodeTypeManager.html'><classname>JcrNodeTypeManager</classname></ulink>">
 <!ENTITY NodeTypeTemplate          		"<ulink url='&API;jcr/nodetype/NodeTypeTemplate.html'><interface>NodeTypeTemplate</interface></ulink>">
@@ -199,11 +207,11 @@
 
 <!-- Types in extensions/ -->
 
-<!ENTITY FileSystemSource  				"<ulink url='&API;connector/filesystem/FileSystemSource.html'><classname>FileSystemSource</classname></ulink>">
+<!ENTITY FileSystemSource  						"<ulink url='&API;connector/filesystem/FileSystemSource.html'><classname>FileSystemSource</classname></ulink>">
 <!ENTITY CustomPropertiesFactory  		"<ulink url='&API;connector/filesystem/CustomPropertiesFactory'><classname>CustomPropertiesFactory</classname></ulink>">
 <!ENTITY JpaSource  									"<ulink url='&API;connector/store/jpa/JpaSource.html'><classname>JpaSource</classname></ulink>">
-<!ENTITY JdbcMetadataSource  			"<ulink url='&API;connector/meta/jdbc/JdbcMetadataSource.html'><classname>JdbcMetadataSource</classname></ulink>">
-<!ENTITY MetadataCollector  			"<ulink url='&API;connector/meta/jdbc/MetadataCollector'><classname>MetadataCollector</classname></ulink>">
+<!ENTITY JdbcMetadataSource  					"<ulink url='&API;connector/meta/jdbc/JdbcMetadataSource.html'><classname>JdbcMetadataSource</classname></ulink>">
+<!ENTITY MetadataCollector  					"<ulink url='&API;connector/meta/jdbc/MetadataCollector'><classname>MetadataCollector</classname></ulink>">
 <!ENTITY SVNRepositorySource  				"<ulink url='&API;connector/svn/SVNRepositorySource.html'><classname>SVNRepositorySource</classname></ulink>">
 <!ENTITY JBossCacheRepository			  	"<ulink url='&API;connector/jbosscache/JBossCacheRepository.html'><classname>JBossCacheRepository</classname></ulink>">
 <!ENTITY JBossCacheSource  						"<ulink url='&API;connector/jbosscache/JBossCacheSource.html'><classname>JBossCacheSource</classname></ulink>">
@@ -216,12 +224,12 @@
 <!ENTITY RepositoryProvider	  				"<ulink url='&API;web/jcr/rest/spi/RepositoryProvider.html'><classname>RepositoryProvider</classname></ulink>">
 
 <!ENTITY JavaMetadataSequencer		  	"<ulink url='&API;sequencer/java/JavaMetadataSequencer.html'><classname>JavaMetadataSequencer</classname></ulink>">
-<!ENTITY ClassFileSequencer		  		"<ulink url='&API;sequencer/classfile/ClassFileSequencer.html'><classname>ClassFileSequencer</classname></ulink>">
-<!ENTITY ClassFileRecorder		  		"<ulink url='&API;sequencer/classfile/ClassFileRecorder.html'><classname>ClassFileRecorder</classname></ulink>">
+<!ENTITY ClassFileSequencer		  			"<ulink url='&API;sequencer/classfile/ClassFileSequencer.html'><classname>ClassFileSequencer</classname></ulink>">
+<!ENTITY ClassFileRecorder		  			"<ulink url='&API;sequencer/classfile/ClassFileRecorder.html'><classname>ClassFileRecorder</classname></ulink>">
 <!ENTITY DefaultClassFileRecorder		  "<ulink url='&API;sequencer/classfile/DefaultClassFileRecorder.html'><classname>DefaultClassFileRecorder</classname></ulink>">
 
 <!ENTITY AbstractTextSequencer		  	"<ulink url='&API;sequencer/text/AbstractTextSequencer.html'><classname>AbstractTextSequencer</classname></ulink>">
 <!ENTITY DelimitedTextSequencer		  	"<ulink url='&API;sequencer/text/DelimitedTextSequencer'><classname>DelimitedTextSequencer</classname></ulink>">
-<!ENTITY FixedWidthTextSequencer		"<ulink url='&API;sequencer/text/FixedWidthTextSequencer'><classname>FixedWidthTextSequencer</classname></ulink>">
-<!ENTITY RowFactory		  				"<ulink url='&API;sequencer/text/RowFactory'><classname>RowFactory</classname></ulink>">
+<!ENTITY FixedWidthTextSequencer			"<ulink url='&API;sequencer/text/FixedWidthTextSequencer'><classname>FixedWidthTextSequencer</classname></ulink>">
+<!ENTITY RowFactory		  							"<ulink url='&API;sequencer/text/RowFactory'><classname>RowFactory</classname></ulink>">
 

Deleted: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-0.2.png
===================================================================
(Binary files differ)

Modified: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-future.png
===================================================================
(Binary files differ)

Added: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors.png
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors.png	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors.png	2010-01-09 21:31:34 UTC (rev 1574)
@@ -0,0 +1,597 @@
+?PNG
+
+
+???L?6
+??A
+@)(??2?M???N??0??3?????? ,D?H;D??!IHR?t c???\ O?
+???D(
+??r???5@?P??@??3?5?m"Z3?!??A?"?{????G?!?#???Z?u?]?
+*??",$? ?&?,? B1?9'2*?U???????I??;.vG????????6?w?v?o%??v??%oJ~??r????+?&-.?!?'?/?CFQ&P????,???l?l??9.9;??r?r??r?????O?
+f
+)
+?
++??>?e??JD%3?CJ?J_??????+??p?8??Ry??Q5PMVmS??&??V???.???~F}Z?M?A#W??&????Q?>-???V?V?6???}P???O?d?;:?uuu?v?=}?Cz=?h}S?L???.??QCVCg???sF?F?KF????????[&z&&?????%?sf?f?f?f_?5?S??,?--N[,XJX??l?VfV??&?????7w???5nC???i??nkl{?vj?????mv(;?R??????????W6Ms???????0?????????s??k5??.??B?T???L{}?6?!?????????/y?z???'?/y????'?????+???7?????C???????u?m??)??z????_??????!
+bER??????4?j?q??:?YT=s??|???.??v?ri????????Z?????W??,^u???N???^??Lc????????M?M????w??\?z]????G[?????????m?m?oZ????s??]???????w8?????{??q?c?3?s?+??u?_?B????{.?&z?{?????????~???@??]???C?C???]
+v???>2}??????????1???q???	???'?'?'C'W???6?? g2g?g??r<=;'4W3/???L????V?G\?W_$?D?<???T?,?\?J?U?k??o<??y?v?]?{????>?~4?8???????U??????k?T??}????k????????k6?7?o?l?????*?!???O????ac?????X?o,?7??????????????^?^?b$|D???z
+???????a?#???G???
+?G??<9??
+?Y?GT?????.?xz??,[9?X?T??9?j????]??x9?&?6????qu???R????Q?G?k	h??y?t?e?n|[???]??N?.D?f?j??{c?}}w????
+?27<???|D???o??F;?*?3'??OJM?O?N????=??s?W}??l??????8_????L~?z??z?M???w	??>X}T?D^!?|]]?<?????k????????????"~???6???5?8???0???K?-????U?	?
+?B?"????#?#z?e?6?\?(|#??
+
+f?????????op??\\??d?s<<md??^??|I?$??:#?!?P?????H?(?h???-??????????H_?q?E???Q????*??&+?P?R	QUQ?????5|4???Z?7u?t??????o
+G??_1)3?0?4?Z?[?XUZ??????hGc/?`??tb?u?YW?^7O?"?QO???w?O?????8?78 ?3?)< ?~$w??|?a??x??????SRo????:r?(wVq6??????:r??z?~->V?z?LR?@???C?b?_^,?l[??Jw]B?z?v?????6?[P??;M?]zl{?????????z?=???N?Yg%?t?y,$??[j5??^?c?J???????7??&??h???^??Cx!??L??
+???
+?????:?I?m?J??L??%-)????m?+??UpRTVbW?V~a_W;?~X#T?Q?L[CGR?S????`??p?h?x?d???????E??V?06???????????????@?B{???<?x?{Yx??<????L	??t????H???T?vlE<*!??l?I?????4?????#???Y?????8u8??^?Tx?X???i???????+??T\???}?r?????C
+??-?????q?U???-???;?;?:?w[?<?u??r?v`}0~h????????]???O^LNW??=??;8???`?H}Q?rxi??k?7?o???7?`?????
+???????Q??G?u???
+??????????8?r?6~x???S???m???????y
+??e????4??1?????`v?EPm??''??1??S????????k?
+Z?uW??b???????????Wmi??nEPT\YDD?}???:?	?s??;?I???L&!??|&o???{???s?=??s]?Q?38p"?D???'N?8?????r9??D???'N?8p"?D at B??V?u:h????Y??<dEmoR????????pqq1?q}?=>???o?????ZZ?????W_?j4FM?4=?\?	W??>????v]qu?i????tS]-Z?z?????G?<????)?????8vE[????>H?=2?}???????G??q2??ovv?kk$?L?N`H(J??
+?????q?0??C??z]ctMM??NCW
+<IV?????d????zW}????XS%?O?#???B9|?o????x?q0?3??????h??s??Td?????????_??;?? D??)???[q-????????z
+U?k?za\??%#~?4?
+?-?]?@t????,?Yq????o6????7!4ap??YWQ?K{?F???.*??????n?????8?c&!v?i???+?????????z\????<??????z?*?????????=???????h/v\\?5?/??	?????u???#a??#f?D??7b???,??Z!|f?Y????E476??E???B4??#?"???????i;g???Z???T?U??8???$???&?^'j?d$?q?|}%????.}
+?VP?j?c@??	 c?.;)?z?Ty!)?:]3Z\\?q??S*??F?$??&3??`??l????????1?~?k3?T???
+J?,?a???3??]???z?W?FX?Op???T??W??`??\???????PM8c?'xJtJ?I????????}????5B?q1?vd??????)AN}3B???MK`u?y??\
+?
+?u>???q e??????b???e??)M?s?C???????n\??+?
+???6???3?&?????????F??pm,-B??o???F???2'?~?g1??C{;?ge~Rwn1??D?????^?Gx???C?i???=????K4???@m??I^????????????????C??????F??m],?i[cV???y???q?svoCqa?DUUU???HK|??b??c???!m??????????\??+???/+/?~??f?,?#??????G??t?VYV?????;???ajr?:1?d?qq??(?Sm????QI?9D?S?!?g;?_(??!C?E??8??????`?R???
+???PKS?5???X??#+'????	??R?????RY=??0eP?t?$"7??)??
+??
+?!?[??3?O???x????\0	??HM??;??L?B????\???"????	G???2\m?Dr???P Tq?(?b!((H??Y\?<?c?????	\?M????Zj?fj<
+W?r????e??x:????g??cp?b7??????t?????a?L???f?xa??\???!???W?XV<??=
+QJ??l at 4a?
+K???<z9?d???R????U <??zo'?(????6 &:???#F}-??CX?X47?
+??7??????}&gb?????}t?o?w+?Bs???????(????(Y?'?Ktg
+?5??`?$?b???k{????
+3??2  @?U??????;?y`?
+?????U?"?Y?`Z??T???b?g[?x?n??0????J
+vQ
+?xa?nd?$q?????(3eee??????8?e&"??&??WG????q]?_???v??c??q?b?;?RN?|i???????-?<*?????=,??+1??|,?x??D4?\?U[??/??<F?^?????]Ho???? ^xo7.])???4??????qI?A??c????[??&\i at TL?Agqe?
+6?????`??"\>ne[??+.????T?????HZV??"@I??M?
++7}??.R/f?[!j????g'A
+v)]=????B??&:?????bIS?Z???:??a?x???????"???z??^?+1???y?9~??]??S?N
+3?????6???w????lI}?????V????0??B?)?aR??????????	e?@%r???K?G??`.V.????$?bl,???*?????????O
+:	???N?a????
+h???g1k?X8?5?C????+?[I??j?u?J?Z`???v
+???gW?????NkJ?T?n?????B??a?)?????"V??o???_?4??1?;????X??t??&?Fzc?VeZZ?L?dX*??+ ?????F??q??h?^E?\;??t????s???`j???de[?V?KkS??????????jY??*??????g/n???Je???;q,i=G@#?1???P?????4c7`????ghp??H?l!34%?&D???oq|?D?5g?48)???????Qf?A_?	???eZ?p??SY??V????j$A??T?E?c?????Q?`??xu??n
+M?c??DZ??b>"?<)????N5?P??????+???v???}?q??`??.?,??1H???T??X_?&N?S?j?[\??G????)xc?R?h?RX???}C???1??????6e?O????pYX7?5???B?M('V;???	G?{????Y??k??????t'?n?? @??@wl?c-???X{d????@-?N??%???0?d2?j"+???=??????b??E#?????Z??b???????4??5z??z????%zW??8??2r}Cv?????a????????YoZ???Mt'?W?w???
+u????-?]e??r?(?|?FR??5%?vCN?J.??y????+?Y??????~?+1h?D???0>????X?????cL?Mw`l???ZC??yW?*?rN?
+$?????d?M??n????}?BW??O??????i&??@?Z?????i?h??iq"?6.	??
+#&?@1?B??J?A??h????w?????&7??<8Qk4h0@??w&PDL?1???`?,?1?????^???@?
+?^!??'?6?? ?t?F????Wz???)??|??#U ?HF???*???g`?zr???\??d?9??(L?m?5?n?p?\??O??6???S???Y??m??Z\[H??\%:e[=?`/???g?k???N[,tf<xoX????`?????v'??LB????p??K?mi2??K??<"Th??#x?a at L?o??|??j4???l1My??2M???B`m?C??*U????q#?Q????cr????&?T?T???Adp??~('????k2?d4??Lq[s?8,????%=??L?hU;?@B?
+???}?p?0S0?2???&???????t?i?L?=?[?????????L1??????#>?#??D??u?jup1????J??#?0?=??Y?Y0#9??M?????@~R+?????^?3jZH@??<?'??F?@??I???P?#?\wr???:E??+h?
+???mPM?I?:j??d??O??i???V?~????b:-th????b???????h???#""!!!*??l3?G?g?U??hw???????_??????u?5?h??/L?2&&qqq?yhh??+O?Y???O7 c??v?J????+?K/a?W??w0?
+Zx???q.???4???*GBD???<??d??J9???:!w{?w>????5?&!?}??U?????"??n???r?@<???[K??)Km?Sx?????W?bjm?^CuY???#?S???hR????I?TZ\?~\?q??$9??Y? ?}3?????v???l???WYR???_?[.???????9?_x?!???<_wS??^?:2k??s}M??d?Q????
+?j?
+?UcE.?+??c??yGd??[?7?'r?????q&?u??0n?O2????c??6??????u%?u%/,%%?Ewe???,?
+????t????-?n???w?f6???v?cZ}zxx?$+?)??Z?3??Gd???A??x?x ??&?9?F??z??z??j??p?q?D?B??a???IXA-???w?9?U'?hu???*?i!m3?c?^bR?i??|-?1??????q%!??*^?x?l=G?u?*c?(?);?k?P%????????x
+????=???????%????M??m?|?I?l??Z'??????x:??w?v????g?kK?iR????I?HL??Ci?$/?g??.?:??v??v.(?F??i??S/??????U2?????W???4I?????`????82v,0?O)t?n??.???????I|??????f?Zh????U>?#+Y?]zd??:D?j?F
+??s?y)??l?Ko????AX5
+?iSkc??K??y???ytV^m????+	b???}?t,???u????`?m1?kk??????'???G???r?h."?v??;q???u?oxZK?????0???K?%????a\??\~?l??J?&??.?5rFM3z???]my??LM?w~}????`%????2?>??f?y`jJ?|.p???o?s3?????q?i?pZ??????@+?"??J??DkeF]?'?Jz
+? L????b?
+m?g?Ju???,???????T=
+?^?g??^?!?????<??u?4*??L;??@;?%???(???????????L?v??????b-?&?nK?m?E|{?v???u%
+v??\????ESG???`??rYB;
+???????ct]??v
+?N\?????B?_WY????<??>??"?(?-:;|OE??kC?????q/?8??sO?
+?A????x??????Ji?4???u????m?|U?`?k?uGw?'???u??~??M??(G0?{
+g????$??O????3??h?f??s????y?n?j???~??({K??j?;??Z??-1????V?q?xv?Q?1??/???{??{???9X6w??????J7?M?qF]C???|??????G??????F^B??0????Y??{x??=??Z1????a?XZU???a5??? M_????*??????(y1JBX(??VFBlx|???????e??????P?p???%??R???+?D??????Zd? 0?9y(????!q??????+p,?
+?H????Bw????9H?hDH?
+????]??x`T?@??Jq????
+1/ej?????j??????E[?cj???K$?_<??????A8???x?????Q?m?0l???j??@????l?Z?F?V??Z??gy`??h??s?k]e?Z????nW?#??q5?Eg?+????s??m???????n?;??}wK(???fiGwu?k(qQ?;?J????
+??%?)?????
+?%'??cu	???k?*m?{?f????+m????i??O?VVj?d?;F
+k?G??h<??T?'???ACv;d?R??U???s??E
+??>
+????L??I?rY???#zWQ?t
+?f?v?????'??5?mg4?iS????}???b????5?,??$0q^?????$fV
+49!?\*??x???Kv5??H?{???>xz?e?5x????i3?????_[b??fJ????CS?|??Dk
+X??RY??&;???)??)!???*?M&?rm.???$?7?????8T??2Z???3????(<=?????
+EY???C?[???-??s?Q??.??#<L??.??gO????j?C?(W?)?????M???w?U???R"?y???????{
+?u??-??&4??????$??? ?rM??2
+????zp??AFZ??"@???bw??T???????s??=??_O<?|i?+??Pdb2~,?p???v???~J?&??]???1????????Y??I???}Y%]G??v???L5,???~?A????C?[p??8?e?F??nd???f??j???
+@?U?7J[?#?????I??m5J[?s?[?M?%??y???Q????-tW?e??
+}7?7??Fw?|???Z??I?????"?6	??b???p?~??A5|??Fp??0??????H
+??fTS'?N}??"M??_g?sg???<???`W_?Rg}?4?
+W&% B?u|?I?Y?:w???c???????=???$q??s?1?g?D?-???c?=?Jwd?G~???z??/??D?
+??[??K??_O?&9?vlnD>m?j??^???C??W??=??'??EDfe?u???S????f??R???w'?P/?w????????4gg?G?6??????;??Q?]?0Vz?r?Gw??E???~???????Ct)?
+4????"???a???
+???)??u'q????H??????c??8???????6G?P???Mt'????E?L
+?????a?:??l7?T?!??S?WzO3????U??$??
+??H}?ncY??m???v
+????b)??:?~??5A???h???_?T?$???-????I{:c??A??=-_??o(?&???F?????H??Y$"{ ???G?rk?4?5+X?V ???8/?????(???Z??}V)????f????%?jf?????/???{i?pf%????????????n???%?S??
+??qtg(?-?????????"?6iXi?9???9?w;?????o8w?-????44m????x~?IP?????d???)~&os#C?WyJ??????FL?6s??????????x}8k%???????=X|_????xb?+???o?X9?????k?|	?q???Ip0???d????X??u???x?????L5?5?$?q;>?n?x?e?0????sg????x??~&v?T,b{?r??H??u?
+??%????u???F?\???o??u???Y?????1??N?u{?#6?n?TQ?.:????R?????p<s?x,?B[??3w?\?'??????%&??K>??
+?oh?,]?![?m?#???
+t?v????](??D??=??
+???@???A?]h?????Wj?Z|?-??:???ilj??fM4$y??q???5?ZG?O??>???3n?????;xQ?I??I?J????b?x?t4???????%?V???N??????A||<???j\??+5-????????,E???\/6????re\?i?1?u?@r?Cv?????2X????>@?w;???-???WA??>zW?q?I\":-??N????=??k??!?z??fbV
+??????????#????u??B??????J??G]C34?????3????W?????,U?i??5?!??x\\??????:?z???????+l????z??;q?1M???i??n??Z\4?M???????Q'88???????~???????Fk>80?????c;~h???.?S??Gw?$??w?S?;????;[???????h?0??Q???`?U?WC? ??p??????e%?U?-??>]B??FN??"x0?b)\x?['?)*??'?-?q
+9??rA??X?`G???g??@p?a?!t?,?????m???x???5?u??\	?vX2v?V?????8??J6???^;???Sq?'N<[i??f?????????*?? ??sS?????D??k?5?5??n??????`Y?}????????G:????N?H?G?a=p+|???JjE?~??
+>?kq???O?*?--?]?Ww??r????V?:[?c!???>??U?g"}??j??k?v.?x?k5???oX?M???1?L???????ppt]?p?w8???N\;?_??v?i0???/?I?ru?y(?R?2????150^?t?q
+k?????c???v?]?M???_????6n&??|?G#(`$m??B?9?G??????uw"????A??o`,<?k?V#?L??Cp?l??g?
+????72N???2|l<"?t??6?(?-?????c??k???k??xz2?j?v-?Il
+???5?V?#Y???R???S????h"s"O?b?iU??0VJ?jo?V???????Af8????8J?h???W??*?????????|???*v??d\y?HCv??~?)??Y??{?5	Wf L;/[pe<??J??ZO???????S??{U??????$9???|L???X'?L??|??I??P???<T?k???X?}?????\(T???	??c`<?A??Cq4??1;?NF?????????)?g???f=yI???
+<???^L???^]?????+???*???>??V'??I?????,K?K?q?? ?i1??W?O????!k
+???????K?w?4?$??C??W'??? ?)?[?t???#c??P?P?|?????[+n|?x?
+?(/??0`ze???Q`?L????jo}4????????A0Yk?r??}??????rA?N\??e?f??????(??A??
+????o?{w\?~?y????%j*?b?ss?
+?lE?>E???q???D<?'??????O???4?(???D????L??<??1?q????v]???D`?GA[?(?.???r5?3??V??N%???	??????5?b? ?|?????Z?h4??? ?<??8???NG?7???F??!?5A?*?5	?A?T??d%???Q?D?V`???=H????^\?x*?i;?2???7?c????????t:	?O??Mq?????FM?;???1?3q??t'??G?G,?][??E??TJ????1}2????*??t??>wD0??JZ'?9??=>??MM2?3??????a8??5K???? v???W'?F?dz?[qm??	?
+???UqO:?????j??1??1??|??BG?f????C0??G??V_??
+??`?????z_\??-Oh????8ff?
+???=*????fy ??.?G?
+?xXmz}O???kY?p ?G??????U??????????u5m?>WN???e????????????)?w??????T<?-4#??[?#???O2?;????;k\
+~??L?2*????`~??0	*?'?$???[???7?D	??q????l
+N???????3???? F??????_eK?v???Q?$?6?i[^?A\mQ:6nOh
+?M?z??????.`/a??8
+??4)a?E??+??2R???]????7???mYl??D?&??U?I
+?x`e?v?f??+2Oc??\?F?!&??{	??7????????q7l??&z?H<!&??~??N?A?`NlZ?%$?&.z???,????i^?\. ???iJ??Th?_ ?????/??AK??????w????
+?Z?Oe????N}?i??Zo)?.&?Un??????\`fV??"<????????L???e?????????QK?CCW?????k???$?n:?(??BK?T??R?>??1r?jW???3?o??G?V??"??G? Z?? D?????k??NDL??_.???xU??8x*:?
+(jFC?1<??;H?oF?tR??z??dE?)v=WG????p??8????G?????l???CS?(?yV?
+?W4???U??8??	`?$??s?e1??U????a??S*?1M
+??||T????>??????T???%??????<w????iA??ux???U???????? ??.3~?)n????`z?????r-??i?
+???S{???@&?????W????
+?=?w????<N]	?8{qnz??k?	?N???L??N?o~????au\??*????qC?.??????L???????m???ho??)??/???g??)l?5	????????x?G?
+???i??|??Z]Q?O?@f??w!w`[??=?v????G??8??????????????%<-=3???N?o4)???
+*Ua??1????????q??A;k?
+???????9S?T?I???/VOI??*6?D???y??8q????4
+K?gb?????a???3???j|?=w?9??[??!:}?a	K??s??.??
+?=??$?H?|?I??'?h????G??c??8?t????x?OG???;e
+?In?8e>&0???yg?yu6???^`-p?J|??c????v4j?rm6?n?
+?????S_}?K?a??c?IO?@?5RpE(-???e??D???x??C??????bF???(?7d?<8p"???w?????!$??5c8	???-?t???]?????????#M??f5"1),????6????b???-iVA{?Rm???V[#?????I??,:Lh2?m???????????'S?h?'????,????n??\??<???QM??])?*?y? `???????y?tL`???g?????P????7Q?:?O??b??iC1?
+???t
+????L???o?<}C%??^????F?/???*???X'??`%?6?
+?u_b+i?????O???3Z1?F????xo?????v????%???(???n?E???8]I.??G?`?x?8$?@??U+??U???.??#??F?:??w
+??%^b??K?6?G??8,x(???????hIk5*	sH;VO?VdR?v.TL????l???K??`???+???G?d3?\^????|&?KW.A)`?=Jr??i??l??\{!?f???yz
+?&???~l8????????hp?b??E??	Vz???w?b??3??????l???????YJ?:(Z??~???2?lA>Rn??s?f
+?u8?~v|?y??o%?(Mo:2?<p&?V? ?r6]y?S???M??"??
+y???V?V.iM`??}??%?R
+}u6?????9q(????;??Q?|?x??????e?????0XG????x???9???k????4bUq/?[?\]???k?%??????G$?n??&i??6,]?g|?&k?:\??-????J???y?xu?O1?j'?{b
+?Twk???e?{v??????*??E??????gc&
+f?P???r??6???I#????t????H-???Q???A?b?S?+?V?{z??b?6V?;"J??f??W?H2?????/??b?
+]?1??w	M'kjoD??"???X???>?%/
+VWZ??=??J??Nc!b???x????j?????MABy???????4???<???0cJ????[Ja??<?M?ih
+???X???YP^?Y??K?xV?!?P??F`???????	1
+X32N????:F?c
+??U?rY]1??
+???!?c(i'????CKc?+?????.<0????????????OS[	4
+??P8??2?:a?l???T?r????~?I???p?=?5??z?)????$????UcB0P??????vkp?/?$-5i?c
++???F???u?2?/E
+C?$,???????*^????<??/?J???z"?Y?H?';t0??A9
+???%O??(???????????Sl??S?C1??\=a?????d?|'??]Gc??????,]???Db?????u?????iO???H?{x6?????$"?>h??34}=S?7?V^???????????????a??????.<??
+??????????????d?S?y
+??~??[?#?j??W$?????:?z?/?'?=?????I?
+.?????+6?dQ?U???????'?Z??G?3?y"I??}?$??Pf?X????3?????i$????d????????????M?.????<H???)B??;q???+s3T?Ck?0????oX-???#6??7>;????2Z?9? p??X?????_??$??X???}t5?g?7?#??Z?#]q?}/V?#?u
+.0a???h?`??e?.?XB?g{`???}22r	V0?Q??>??sG?v??L?????????D?3??Nd??????sH?|??0`~2/?-M?????ACZ??????&?}[????tW????????M?#l???Ah ?<?=s|????????%>?x?}?Zx????????|T?? 6?`U_?N?$D?j $???D?^s???[WCo__??1?R??X?7?'u??jz??tA?=/KV?*yQx?o|??????J3@????<??-?'7U???*O-?u(?}?????^%??;?~i??????Q?]T?O<"???O&??????{?@?-o$??K?@fj-??|?????fvJj4??c???h [???>???x??????b??H,>P?;"??M??????[Z????+ad?	CM??Xa?j
+??????W?d?)??d[??H????<?49?.???8?~r???~)??0?y????.M????????R?*xww???o???
+X???1o??
+????h?ZjI??)??
+?g?\?v??-* ?? ?4????|?D????"?LO???k?">v??X???4;??|?.???:???Gxy???? 3?4?w?I`?
+????T?O??iA6?w?N???{d&E?NN{=??)?R?
+?,?o?????(?? ?4??\?wG?????c??A???????R"?9(????s"?????8}?$h?]U*?|?t[?0ISfH?7h8f?5??>
+(????5s????"??H???\?(=?{?N?N???(?
+@?????M;??%~???k??<??_b?}r????7?x?0X??A??????????????3>)8yY4
+J????J?V???0?T5g???4?#?:lY?~??9V3p?N?t#
+^$?0???q?0^????r???W?Fe3?Ls)??CJi?$q???????]? 3?????????????H??jE??`?`28???gb??8z?^@????t?Q?nl;U.????1?)??Hin??V?0?}8???????v??-?8????r???s?b?9???q??+8?????o??1??xm?J?OkB???>wUV?>}Ho??W??`?<??4???fZ???qH??V?u??f=?-??z????&???WGM?
+'?#?|C???g??QP*?^O?~/??q?????F?????x?=?Y`^? %?????<??'R?_vcd??????kv?H??73???z}??K|i?g?j?]??&?
+????yv????????.??k>???o??mD??Z]?a?+????%????????~????l?-???@?^?P?0?|???@??5b??w?)O?? J?_K??w?u???z??/?????D6???l??Z?]?3?4?lNj?RY?4
+m?
+??4???n\?????b|<?Jt??4i8aa%f???L}????L?S/?2?^2?????
+r/Jjw??C??h??}?n?????????Z?|????p?/?????Z?4?.V???lY6`?`[???j??3o? ???d?jqU1
+?5??f0???)
+????zu???dK????IHX?????R????? k?;?t?B???-??F???D??b%?)?9/?j ???????n??[Ee"q?N`?,lj:\?>???&????1??C???\?Z?]W?N???p?o&?${P??????7g0:f"?k???A_??~?_?{?D?W?h~??(ku?a?/$??yj?H|?qb/Y$S?
+?????fa????????}?~7?Do???U3v<J??_~&GP?Q?????cx?~?Yp?V>???cx??7???%??}o?I?}?v??\/7???_`?????>??~??#?jV?I?b??]?
+?4d?j?OD?P?OF??;F?
+P?O??k?td???i?F??O{?64?r?$???	?????5????K4??_N~?O^?Bp|????[?b?<??]??M?J|??*?9??e/?B? ?.?:?"**??p1????m<..N?M??????Z,??PEy	|?V??*???O? Vnx?
+t??<?{???_?x
+?YW??r???d??l????)??2?5<??n?e?c??Wq?#??C8??#<???^?/=?y:??8??v}HW??,?gKS?Zx??}??yE??=?g*?9????hA?T?G??e?3?b1?=?6a	?j}`??8????k??Fc??$??V9c??B;a???????`???????*??Xf2??#NL?==?<]\7????#f`?XYs??/th?n$? NI??F~??U?????kn!s??6?{~???9?g?????S$?)~ob}z%F?7????????d?E??????J??)??]?????8?k?L&m?j|?=w??J????????i%??4???????? ???J?? ??????KB>??i??7`d?I??8*?m?5a?/?????X???p????b?????a2?h>?
+???&E~Q???+????Q_???~;???X???d???7????1Xv+??3?]"??,?o?d?3s? i?#j?<??_???[?]Rp?wG?q??????H?"?x????K0??(l?F
+???bab???)?????.?b?F?ES??'????8r???Rjp?2W!?L!????4??sM?2?"O??#????%?t?6???_??g?+bF?S?^???jj?K?X???F$&E"??(|??7???????0Z????9s?.???!LO2?????}??? ?\Yr5f??y??7??????Q????@????~??4
+'hk??/???Cr?Z??m8R3/,??*?}??d?????Q|1?v????~D????4q??m?e??M?3aVm??????n??|??/?;?__?w?!a?xj:???T?#_0??A?7Kk5t?SQ[??Z?nE?KB")8?????0:
+0?&??????????q?(??FnF6??
+??j??w?q???c%?q,?F6y7?Nv?~???}%?KK??5.+Y??X%8???~&???o?D???-?P1Q??A?&????tM??UC????_-???
+?5??4cR?h??i?x1?'???;v?
+?
+}/R+Hh?+??????W?@!??????u?r"?D?????Dl^????!???K?m??g=?j?hPk???&*o|s	??oC?e|MV,[???d?i?]?Xv?C?z@?9???-??}??zF3??a*[(????;???xd?G??? y?X??G? ?}Y??????P??
+?V?S???n?!???{^??\??? Z???+?????	i???????ydk??5?1??$???*~&t??Gz?w??eqjX{?7?}k??K?????%??fF???M??e??K??B?p?q??*??3??[?b??k<?6??1M???2?b?wy?ic???????'?C??BOI at JO-?Z0??	??6?R???-l???w?Vi?3????O?????Hij??q?U??oSRZ]???u?9w?6??????2,??j|?????I?0?r???a?X?????.7&xj??d?????????7??<?VqG????I[yg??^r????/?S??????e???????]??P?}A
+???#e7W?j??7????x??????^??????7?L?"?????1<6?m8?sL?W=??U?=???)<?.?w??g?3^-d??@????Z-Y??
+AY????dm???J?4?9i*:?j????I_ukeR??r??Z] ???vke[1?\??6????m??????&Z?L?????????2?R=??????b?4?:#?+?????ka?M???L???+ ^]-??o|?CO????(????<,h??R?	ArsU?>[4????2~?tI???eV:?\?VJ????????s?Ki??)?6dFm???3e;???@?o?i6%vFv"?D?1??m???J???k?????`cD????iZ?5?&??iM?.?zdP?W???S??y???6?M??XPU??	??A
+??}?L?W?v?R?{?4????u?`3a?????)]R$???s??;0m???^???8p"?D??@7 ???v@?_A?N???c?"?`^a9?????A?)?v
+??\?8p"?D?G ???^w?e??9????Y?~???K@?????;p"?D???'Nz
+?Ko(w?????p???~q?kk
+?y9?@?S???]??	??6?j?N4?L??4i
+?"?I.????!??????]???
+?.?G>????<??{%0??%??!?????j|?3?????#??4	??"???+???H?@??d?G  ?J?oMp??AR?c??0?:q?
+?&w?5;d
+??P?,7??j?
+?5?o??@???>???P-?CN-??6??W????lR`????Z????}??????1cc
+??5H?q?z????5N??Y??>?????0s0x+??T??????<????C????E?	??>??????
+*?	e??4P{6,??M???c??c?B??Z?H*deQ?e^?????+???i0?Ac??pjL?gKI??x??d8?Y?F>?????N?#???2??
+?p11m??is??????????"?h|x?	??^-_C_??G?p?????h|N?w?'??9????FBw????=
+>-8?_?p??????pE???O???)??????<
+;???i??0s??6?5?j|?xiu<?o?hB>T???F??9?W?;?j?;????1!??????.?vg???;?????7???B`?\ ~????????????????????????
+??O??????x?=??V"y?U?)??_1??YG??????????t??-?>??x??j??R????????]??V?Dzc????Z}????E?4??G?/?]oP???]k??8?Ub?pf??????L~;K????????^p???j?K?=??#?l4x?`Y?r???_?8PN:?$????!??z?????
+?vm??}?X}?u?,??;{oB?????????)??k?`?%???????????$|????
+?84|???1??X?????fWo?kK?_?x2??5?|????|????i\m?rrr????qH
+`_???/????:?)
++?rDkMv????????_???^c??K
+:??d?*????a??/f?E?Ne??U????f_,???'???6m?8?????????F???8??~X??~??!2r?Hn?P_|?EwT$??8?&O;??r??Qs??u'?_?y?=???G&iwE(,,?????':???^??]?????-????C?y?A?????}?:?	?lm???Cj?k??F8l?+f?
+N`~f?v??8????????k\?>2?W??bkr;?O???,??A+.0Fj?????;$?;w??Cx<??L????L?P;???c???>?D??1??8?|?NB??-[???
+VA?u??l?3??}V?'L??6E???R???????????????w???Dm??XC??q?9`c??????+}???0??o?*??????XBD3`??_?8?
+~m???Jd???LK?|F?3*? ????]}?I??oFC??;??????~Vw??+3N????????X?Q%??Hc?h??????0pj???Ih???z%?26?D?m??????i14?e\`??>??.?d???1??(0
+?E2?J????m??????q??M\???~???U?l?%??v?mr?1?8?%??"???E?wl?p????W^q??j*?|?d?????????????p??[uy?:<*V??g]S#????Y??84,???1
+?S6??'U;?O?]?{?O???G?'?0?eCL????Sg?
+?????FH?={??,G????]??f??)Y?qx????,????6@????H?O?K?w?y?<?????,??????X?T3????
+
++???oX?n?s????#F??WYS!-??????Y?j????%?B8??m????Vk?s????????????6?????6??/C??*E(??5???????q?&p???5?C??????6m?*^???i??????<???a`??5?N~h?y?H??5?6???????????	??	?????{???~?5???JnIG???bIC????[??0??
+??6m??d??}?~???
+???!BB$???????? ??^{?M??sF??+h?????v?1?^?4#?Y^?9??w?x????'??`???v?????/?7l?T?q?#n???LHJ???p at Y????U?*,,rZ???7??_~%???$2t??
+?L?*???)?????H?#YY}-#??h.?{#??C?g??t?Y?r???f)*.?6{?{Rb??c]???>??J??~??7?	??h???vw??7??oZ????fU??????P&?{"?N?P??\??????9?=????2??GdYz+Y??????od`?w?????Wyr?w?/G%???K^?d??w?-r??iU?Z???5rw?j??????;???m??Ko?s???=-?+????~???O?????V?>?????>;XW??????Y ??)
+??r?Z?|?C9d???d?dy??
+Y>?b3??_???*?W5?}?l?I9f?D???i6\?`H?L?V?Z?&U???e????????lWhYLb?O??&/?SV?E/? ?Z~="S
+?*??*W?~W?~?'????H?m?2????????__<GZ~!w??@?????y?)?'?H???6I??0)?q?9
+xN??8? ???)?????_???SRp?7????b]???-G!mu???Z?????????+?e??T??????o+???????j????Yj?~?????????P????[d?]??&?Q?!&??A??um????j???L??F?}??? g????u}_m????}X?Jtu3??$*on???tX0_?:?.??{?|???ds??6???I?Q????dE?=r?y????7W???U??????????~V=\?j?g??_??g?????w7?X1?2?@?o????T~???n?&???/??????n?*_??o??fX??
+?a??t??YN8?xy????"????????K?????Xj~??t???	<:v?r?k??"-/?t?{=6UMF?p?G?=?????:I?=?7?D+?@;???}?*{???<??^?N?x?	???d??3QZ?rM?N?x7`c????????.?=3???G????(y???2??????+?g}u%L??????????GN?/??????>?5Ijb??)?q(kLPel??l3W`'
+`??z??????S,1)?s???{?????S??@9?"?w`??*?????7????ee????zG/2??A]?Z,:?o~.p?A???m?8fc?` T:?J?e??????t?!?????'???[9????
+???knJ?l???C^??V6m?4??????4m?tg??%???U???+?NMK?<P???W??
+????g?f?2K??z??????i?
+W(?R?`?????e?n??V?1??9s?????? #?????1D??
+]?L?????f??????&X?x????Rl\??b	???????\MH?????????+V?h??D?~??.]:K???????
+h?D??;??}??^7{}?k?&???y????~??+??op?~b?s??j?j'@?&?9??;?0O?????S'K??M%?????J??-99U???NX?|UC]?rl??LU????^;_RcG?b
+?x??W??R?D??)?Rme???M????????n<
+7??M????x???????|??|?d)??o?????n
+??????!T3??l???U0??|??N?ZS???k6???a??Rqc?.yH8`?.??????q_eeeUi???
+?????i?#r?X9?????????X?]A7??_ ???Sz?X??A???Y~J?
+????c]???????????$?oC????0?bw??2n?????8??)KB??b?f?	40~\ ??8b?!??,???????G{RS?T???Q ?????$X??&????jj?l?T;?????xJl????)\???{?????[???,?<??!?5?]?t???j?????[]???????O/j	??????2;&J?Um?{?7?W?9???T?~j?
+V?R?UX??'??s???????V??u??VMW|&?
+W
+??F???K??7r???x?%@?.?????5?8??Xh???g??W?
?'???!r?E?b?R?p??;?~G??r??.2??W??{??~W~,???????%_?R?????XM$z?????d????6g???O?.?Ig#????L%E+rd??L/?0?????%?p???_m@;1e?Hs?q`???;?????
+??+?(?4#G?tN??????
+}?
+?H??????5??g??????W??=?x{,???I'?1?l*??h??
+TH?,}????)?Ul??d??pv?1???pv1?I?Y???i?z??
+BQg????bM???h???Vv????O?6??"m????X~W???
+K"?_??E???t?~?QE?B??V:\?r???Kb?FZ???????0?T?h?v??A>?:Y?????"c8?{????????W??d?p&)O???;?f??z?m?
+???`??rcb?P???9r??3u?A{??p_????? G??}??7p?l??OR???????{?6???]????H?a??	????_V??uH?zd?????{??%??\?[?????_C  ?~?nO>??;???|????????U4?3z??!\?!Y/??p??2??X?(???
++f06?L?4?	???h*??M????????????aW??=W?=??8?-=???n??d??ii??;`???iW#J+???o?\ym?<?a~0A??F??_t??d??i??rm???6&W??_????tyisM
+???????q?&XV?&?U???-??K>??bm"PA?Qd?????
+??J?cII?n????<"?1!???????jV???X5?*??3
+?T???w?????|^e???{{vi?p???Z???a?1`?=?jU)+?N??{c>????+??\?g`u???H? e?????|?<??;r=4?)WO\`???*?)??'?`L6=hQm999n?Q??d6#?7o?3??2e??3????I?<#?"?r*?9???:?+<???
+??????q?v?{?I???B????-?].?o`?A????i??????~?M(??h:???r|,'??\?2?T?y?egg??????Xg%/a?9B(^/??]h^x??7??q?EC???>q???c	(??A)w?:??kg}??c??G[?@?=?
+}??4k?? 4b,????<V?????*?r!?y?????????
+?t???	?VU!???I??S?+??;??u?n?*V?D?2??bTq?F>@???~Sp??X4xa"
+Y?	?'!???&?????vG??M???ii?
+?Z???;?#3
+??????b-[?60?????4?AZ?PR??D???F??'??B??07AR???D?????h?Y-??W???_JS?J&???$)?L?2??*??6?????????6?>??o??(??J?o? ?d?]u?*??Df?????=????????c?h?5???3???\?;ykV????????.???g?k??+e
+:?o??
+?vU{h? ???????O?*Z??9iZ#X???a
+?????0/?w?4\?G:????<[??md?M?p??J?????	ZS\?a?N+??5?U?]0>?fi``sM^6	?????6?2???L\????????O?????7?Sw?}FF['t?T?J??h?OB??U@?C?+&Ha!}d?w@?:?~?>n???(??-?%4[
+?v??X??W?
+??S???????y?X]U?pG???YL'??O???p?????????E ?6?_????E?l???h??h7m?????(?Dae
+????ZXh:d?*dR"?}A???????-???????(??:Q2??2m?e??w?????;??L~??h%?}???:???i??&>?a????,?g?4??l?\?[2J????}???J?q?K]??r??????????B+k???????AVlQ??????-?3?#???t?Oh?? ?&,-??<????l4u????+g??????
+?
+V????????,???r??!(???m?e%??]??%nkwe??????z????!&????B???~`P???????K?01O+~?F??B???@
+LL^??t??
+?? ??Z???t????=???H?i%??G??^???1????
+?I7?"??[??
+}??#???n?W????c??S~?W?<t??????r???=???0T,????[?-?'???I?v?}???~??r??By???e~E?Z ?/???)?Q??
+????????	??\??|?p??`[??AVfh?9?5Bp??!?
+?????W:???IWvv?.M??-
+qv??>N?r?????*??	? ??(??"??	@$??5?@p??
+??u?o??~?t0U?U$?DCorw????g????X?Jq8????9
+_]?i??ZQ?8LTbC?B'U??d???CF??????!})]??\?J?jKV???_w4????.?x36??T??.Mh&????e?V??+V_?j?h?!6??
+?91??W??=K??P?kx?A?\3?T??6?ARk?j?+??7'g??]?Z?^]j?S?{???[?2?_?r????T??D?????)6n'??'#?????????C~x?Zy??a?n??2??i?j???W?\??$?y[?M??????W^????.?+??Y?g??g~#_???<??S2???}???k??????k??/?n?????\???????????j'?|?FJ?,???}??/??????8G??yB??^.????4?d???T?i??d?3???N?7N??}NY=d?????s|??eLc?o??d)3S? ?g?w?T>	??e`GxeI??????f?|???
+??&??Q??:?	BTBg@??&???
+???_8????
+-???q?MX??Es?*VR<p?????md{???*?g)#??BWG'??_?-?kK?e?{?????b?M$?>_Z?,l?????g?? 
+???h?vc#~J??S?s4))?	j?)>|?t??
+??$?qt??%?XW???1N1X?b????}?-Pr2???9?&?C?Z~?6?M??{?	~q??g?j???
+!?????????^??e_
+M?3???1????i???AV
+F??Y
+???0??%T?????}T?VZ?4t???Y?h?0?????1c?8???q?zo3??'m?G?<??????g??W??;?'??k??p?????A^??J~?'?????;?????|??????
+???????[?n*$8?T?0??,??tL?b???,???a?NN???+?'???fu?-e????$??{H?rm?a??:?R@?&
+=?+?:??%?*??v??v?O??"??????:1???NR?$v??c?????9R.??~)y??[?K%M?'yBz9??k?d??7??}79??k??n(i?O_????P6????3
+????E???0x???h?yu4\?????g????????D}????????i??4&?GMS?,?~?:{???BP???Qu?\???V???~???a?????lLeE?W???????J?????Q?G"??$j??T0e?n?@????? 'G?:aw?d??s?J,?|??`.}PG???h?*??G..0?[^W@?????=??m??S?
+??O?ir??S???*???=????????G>?Es?U+?/?6????Ue????_qE?`a<?:`b?~3???????V*A?,_!D>??15?7K:~4?W????
+?w?y.???_g>?k??ku?4w?	A|??0???
+??`?-?}TgF????ii??s??+????q???3??}&?\Wv *??aH??;XH?`FB?E?\?`??]fv??8?:24??#??/v?-Lb?0`"\~f?'?pB??+?(
+?m5??p?EC??o?+?;?_????9:Q
+??k?
+?v%=???ZD?ft?H??????2v(?)?X?Geb?@i??U+T8??&???P at P2???;L??Ry??Dk?C?/?/?+???
+m??W?>Vt?^+????i~wi??|?<??f?``??c?+e?<V??I?
+??px?0v+#?i??++?pbW\?!C?l]}`E+??136????~
+|?u?????;?P?????????5{_4^??
+~U?ph?*?????b\?Q?L??@xV??*????L6;w??6?y4S???V?&?Ap??Vi?=?5?@}???L?W?29}:??.J????Y+t^??\?"??????w??Q?Z???n????K^??PY??KY???0j??.?*y?o??%??5TtI?M???x?Y?M=/??{S???q?HVOU7Y?????"???"???
+?1?4I?????UH???_mk??>O6?]!?????;C?K?,??????+#????d?????,??N?1 at z?8^?:?????e???3?i'9???i}d?^j?S?E6??r??
+????|?U?fY?%I?v?\{????{?N:?$??qM??g?1;3ck?????l?a??c^?(M????
+! {?7?Ul??????F??/????8^}??Y*i?G????+-????!$??F~?{Ko??.?|?????6??M`?g]?ug?N{g}??h?uA?r??G????????&o?9E7l?9S?Q?u????"JsOR?pp??7_?a??F????N??]?n?{??7?>?G?q??:??7????sa??mT?Q??+@P
+???S?:?)??<??UK?????H??gO?e Z???????K
+i???SFB[?\?2gB? ??}\KGZ?	???B??,??[?*???g?\??V???"??
+KF??n'v??<f
+????r?OE??.K??w?~??(??O(-\`???_~????2?j,}?\?i?$???6[S???Fa?A??V??????p??o??>(?yl??/? '?|rT?!Ps?;?M`??h3?3N???	?'+@??]]??_PShJ?@???$???h_??y?A?{???[KG???+?)Ks8?8??7Z???}????X??D???S?F?e????T?f?
+-3?o?Pf???-??U??#?ci??]??C?p??}??rK=?b"?+??+???l??n?\
+??!?'??????v????`t?????n&`????$???78Dh???w?????7?9_?ezx*~??w?M?k{?kp?V??N=??OUp?4??p?'?mr??u?\??????x???E'?yy?d]?:o???
+?}?f?ac??J?`-'_?????????h?~+Ny??V?????????ML{f??B&O???nC4U?
+?b?	T??
+U???$???8??R???ht????N2?9?X??l??q?:?qW??}???????[?$???O??#>+?*r????V$[%SZ'??}????O??[IMv4\XR??????'T!???????/??J??	}??)?d{????PY???f?G???Z?3=???[?E:ti/?[?b-???"?AiR??W}?a?X???w?K??-Z	?t???I??%T?\??o??|O?oW?p]]?C?? ??
+??)???
+?v?A
+0F?M?M???g?N?????l???4~?p[???p???v?????[????-]???
+ep06??:??Uq??s????Tz.r
+P?????_?%c????9i??r???e??}e???????????.?M???s?~??R+%9#]?????9Y????<?za??L5?k?U?>?-???)???????d???????2??g??????O???.<P??>/?]p???B??%?\<I???\??69??K???Y?????P?????4!G???&?3o??????Z?:???H?=RXx?]?R??'?3??Jy?I|?
+?hQ?.]??Q(????bO??a?h??B???28e??A&???<,W??qq????
+????e???V?????&??5?%?t?!(?B3!"??8?p???p`?-???j?q??q??:??4?????F????
+??7?r,
+?,?-h??A??A`?X:??????P
+~\x???K-Q????xt?j??`??|????F@??"?m????`????????????8???Togph?
+?{????>??-?wp
+?t
+?????3~?MTy?R????3???\w~????;e?e????IBL??V0?+??~L?9??-?6}?Pb?/Be????(?b8??y??=vl2?^3???xR?_??Dw?"???A?xq??S?#?????T??Cf&DK????0%\x????/??
+?]?+?=???\??<y?c??y?c???A???s2GT	'<???;?v`9*?6W?UN???-f?t*&?Hf???qX?fe?U~a???#??b?*&N???i?N????4P.?r?4?????|?vJ???a?4???{?????a???~JxuzJx^}?6%eL??7?ec?????FE????v??X?4?cS?G3c?????Er,????:H???d??/R?????y>????????bn?r8?'?????|?V??R?<?)?K	????O?55I~??u????????DE???U:???7S?Y???????!s?CA?r???? @?f9p?u???u_????}.????i>?Lp???i?"<R?????^?s??"0?q
+i???)WC:4? ?????????@h?E1??._v<^q???C????Lzw.????7??1?q???xLe?;?_j?]5En{??B???????k??|??1?E}V??8??V????[HV>?F?<M???????X????}??)4B?????Oq?p~95bP???????=???r??????????L<2?P????c9?????q$??vr<?3??:?????C??	/??WTXqX&by[?e?7Z?W???;???={?????c?6x??xS>?<(?<????????z???
+'????????=???????^?)????_?
+????b?N??????)Z&?]
+
+?v?v??.v????\7?q6??[????{v?!?????}??>ix\??v?R>%??~?:?(?iZhn????(E1?z??'??
+"
+????!??p??
+???<0J}?}?]aO^P>4?UNd*?_?????S?????
+??+?|U?+e`??} ?5E?????G?m
+?????????=???,s?y???I?`=??	Q???4At??[6?m???I)2????'O???8<?+??
+ ===?69.oA*??9??)??b?????g}???????'?I?
+??????D/?o???????cC????NZ??????R?M???f?????*?	w???????8???c???3?r??0c(x??x?+???v^x(L?(Q??7?fV?y?b????N5???`?1V?????|?w?{
+??????o	y??\$?????'/?>???r???p?X?+????0?:?3@???1??Wy?t???46?H???8?A???33?"?????????}M???{)o????w????????????T??\???5?~??z????4?y????=?|?O?Gaa)???o?l5?_?6???sx?=??????zNAg\?#????d.?G?7?aW?????bM????\?K????_?4?H?T?&R????G?????c?
+???????J?6Vp??'???1Tj???EJ?t???7?"Fb?j??g?VM?'I|???F?*??B6?? ???;.???_?,????V???&??|J??kO???????ns?<?r???^/??)S?b????E??m?IF{?
+L??x?}?rJ??`ob??????4????????5???7????>?x?Qd'??W?V??~1????<2?}?????p?_???
+?p?G+q??;??6f??_???~?;?x,?^|?p+FL?o???/>?????(}????Sv?????12??K???9??"???U??s??#??"?e?	??r?xR????0e???U&
+e?S??u????????9??N??cbT?W_??, ???9?<?~????????????RJ?????7?!N????{?H??bn*/?cn?}??'??r??6????????C??@w????G&?\??rD??v$%?.?q?b??r???E?.i?g?LP?~???X???bX
+?O!?/???"(?f??????6??E???)S&?y??#&?v?^?????p??r[eL???Uv{3?'??d<^?]%e!????????_?J~??]?Oo?C?:j?N;????\????Rq?)7??+e??s6?X$?J????h>`?<?qq???k??!?????t?;?!???.???f??G=???????@cLm>?'Y?H?pl???8-0??w?F2??3	_??qg0?_????????w?=sN???X??g??w?qt??
+???w??+????#7t???n?,??ncW?`e?y?fE????????8>???????gL??8?r?|???&,?1P???b?*c?
+/?? ?J??'>VK?z?y{?f?z???t?j+?9??/????c?,/???#0?k`.5?????$?|??2k94?????y????~G^U?'n??i???p??]?SHs??q?? ??i_[??C??c?:?9?.??Iv?3?\D?s?Y?v?N?1??????0a?9?jb??H-?cB"???h?0????n*????`?q??	A???e????95<>qe???! ?
+s?y???:R?Oyx???&?p???p}?
+'??={?I??D?v??	Bk0`?,6???'?c?}UU??[=F?Q?????Q?g?A???#?b?9??b???3???c&?u7?????"==}P?}AT????:=??/Oyw?:?gY?????O???^|??>?.?:??W??v????q????
+s????x???C_};??????qwF<?{?a?sn??g??C?bQ??|??????B
+???????????p?????)?Y??u?jNC?'??o?0q?[??D?2??9/
+'K6'?7??"??????:???Z??'??0??!???P?t???0?Dp at xra1?/???????E????c??n???$??a???????~?c??L???E{??N????]`??A
+??p?IE????/?L`?#??r??
+']J???d"????-?????????? ?d??#M???L|????f?Z??????5E?l??gv;???u???h???nB??0?C???????@$.??;?n?????????t?~S?G??O???????????a??dmc?{?4W=???.???Ps??^??W????b{eMI?}???kQ??I?`x??e?d./???J?^_?e[????
+t?j?y^#o??x?V?K????\?
+??C??)?2%8?
+?'%bc?)?????(????)??????x??2 ????????<>??U??ja??@?)?H?????(??a+??&?????6m???????????]?C?Z??v?!?????E?j??L6?kaZzr?N?????b;?q'??X????1scZT???b#6V4^.?f?(L?a??,Xj??6????? ??-h?K???7a?5!sMS?n=?	?	d????[?????x?=???6???,I/?@Z?k?<pY?W_B???7??[?V[%??Q2??$;???$??L*))????????]?????.??L???(?k?T|?F?\j?8?o??}?f?jk?????uX?2?Q2???z?\??^??????R??D2??%7??n?Jl?!?????7n+c??j??6???uRqi?TJ???3?????\?^*?G?DX???????6O??I??$?????%??^???^?"`3?%????[2?!????K=,:j??R#??mF?7H6??????????kK(-??6???dR}??t?w??*??????+I?Zn??J??n1?Q??????p?%????{JH?????J?7?Rqq?TTT$??UR???[??I????U?+TZo})?	?T?????E????$k?1?}?Q"[?<??7?U????*??? D??8????K?}??M??s?6;)???$?/p???<7	Y?m?m???????????<dMJ????????`???]M?.?h???&a]U3???????tb;?t/???u??????f4???????hn???^??1)??p??-?X23???????nv????WzJ??5v?(u???&?u5~?l?-[?5???9??{[?f-??c?????e????-
+5??y???????Hp ?L??xGkj?4?T?l??[?kd???^???(Ihl??X??;i??u5Gp?????????L?:???_?????]?L?r???M?=R??S?P?y???? ?ho!
 i@?vJs?TR??W??Hpw[?????a???t??#?] ?I8???????	{vl?9???9??w????IL?%????????{S????E?????P???;??|4??},JQ??YcB??????_	e?6??`x??M#%??>?5k?`??u??vV?????Q???ph:R?-?O?+????s-\??Q5m??a;???i?@????|VdS?b?a??o??7Zh?=@?v???1??Tl?S??ASp????qO??.???P??E'h????h??C?,?0r?v???????9?	?W?;???v?'?k???b????~?q?k?:??"?<sJ?dkvuz>]?*?~?[??_ >?m7??6;??
+F?????;^?????????X?t!???GU)?\O?<v?E,???qSpt?3x?e?y6~w??0:XG????/????mx3bw)??uF??n????????>B?????V?4??U??fL`??S?????????vp)t???J??sl????????Qw
+r7????|h;?q????;?P??\??$x_??"?;?`?d??????=???\3M:????.???s?5/?????z7?9??I<=??O>?J???F??????:d???t?q??#?x_??????6?v??A??s%????C!&%r?8?f0Z5=??y?FlY?*?@??X^xogZ?9k??!???}?f|???n????? ?b`??4??????1??4?V?t?;?AW?f:???z?!??
+lyt
+????L???????H?syw1?K
+?fe6??}???&?1(X?xf>????'1??
+?7?s
+L8??b??F-???E~??2'??#??c?????"??s????v??;???q??Is?b?"Y??q?x????:?@:?3??j?Se@|?6?n?~????????w????i ???z?M??2??j]X}???W?}~???2f?u
+mH!?N??V?~???!??p???c?2_???`??,
+?
+?x??n 	V`A?j?4???T?5??1	J????m`
+J???2?????????Y?^???o?jb?1.?Q????R????D??????-?:Qr??%??/??V?
+???????
+?o(????J=?:$NzpT??k?II?+??" VsT????K6????n???????????p?
+???h??	????#?z???~?]I@]??UY???{V?Dj??M?fTt(	u,?*1?m??i?$VkUob?.?7????Bm??BG??g??v?
+ZC????|???C????????n?SrPV?~???+????T?????Ej^??p?%G?????????????e???#??d????????M?H??????*t??7?T???[????u?}_C??NU?????????V??*k???:n?as?S?????M4????
+/?O?{+?4?F?Cj??%;??Xj????)?P????;???T?$???<??O
+??#?}nyB??(d????
+QjbW???B?xV?0?p{?k?a??"?2`v?"{???$z 6:0?[0I?5????8???????`F?1y=?	`?t?_
+
+?^E??>????1F[?*?Zb?:??|??Rc??2???_?v2????A???!Z?d?NU?`??N|???e?T??.>?^????????????????????? @??????l????j???+???????????_????N?[C??E?t?m)z?
+N"t????k? ]?A??r??Z+???A?@?P????9?????a???K?@S?z???????q????T??k+:?-???????b:4???-4N?=???{?&xoL???)?KB?
+????N?q?(
+??Gb??n0o#K:d0j*???e`?f&??-??J(*>?xj>?l,4? z?h9???????L??Lzz??(z???bs???|:>???*??mML?s6!?y?	k)\sD_??C?2???p'c?!??-z?n??&*??B??????7e???>??????s?_?o?C??A??????l?E??4?|????f9?<?1N%Q????????v?m???!s&(?~2?2m??"c????YX at V???f??????}?????p8`v5?t???PN??`??n??
+/T?v?o???"??o?h???7?s??;k???-?L??????3???U?B???j]???????t??Hm?I?c?KE?ER?????(9??1??zj?????@*.????z?K??????????8_CL?8?F?,>J?NK?I?o???????\?.??@?4??D
+?A?J??m?J????h ?Ky?8kin??s???E4?E??Mm?? c????u5F?>????P?#??cj??q???????
+?|??N2?#??}?_X>?z.?N?U???
+?:???*?9???J??*???
+?A?R#?}FI???U???rJLR????a???F?Xf??);????????Z*?w?Z???:??SzF?T?=0??}???OYU??T'E?n?????OER????
+]?n?L?
+??J??6?+z<??k1???a?Q?U?3H??SQ?q??&????r?r?%????Re?}?_??????z??<??R????F??{`/??????\+??pB9??hJh?&??;?'?X?????:???<qHRcOJ4????%?;V?^/???$Bf?(\????Y|1Q????a???K??QV?Pv??_???%#uJ????D]?)XlR*??A4??E?h?'?????|?~t_B???&???hR?'By?m0?:??|?*]p?j7??/?8C?U-?????c???_???m/?]?-,???H?(??ZU???@?T?_ U??BW5?G???W_Jm??W?Z???'??|???t????B???p??@	)?F?????9????*??dT#?/
+f??I?p?u???E??C???)??]?????????n+q?(??#?_???$
+-?<
+TK?\C5N;???n??Z?:???Gp?F&?d?q?1?@}m,[
+?6??*?LY?G%?;??f??b???7w`??	?M$)jj????t!nJ?????I???3????1/;?j????
+???q?&?+t???q03???c?[???U?{??a2c??Mv?|?????7<??U	???#?T??'O????N0
+?S??H?(!??Ff-D??????S^+???????(?m???"??p?yP??????a???p?o?????????x??(??Z'??Q?4
+?????[0-??OF????????
+h?????bw)??????%???p5??t?5????????d?/?",1???	?-8?$d??E=	?,X?FX????????8???T+^??K?? ?????{
+????P????????</?/????A?P??I?&?%?eF??8?z?????g?K.???9K]?M?n???????da?	;N???UD????6?C?B???k?????b;Y?+???ua?Q0$?_^L??i[Z?T?????@????K?}ha?????p!.o[???j?V?8TT??/???-ay#C?	/???
+>??"?O?T???|>?TO??3R???t?? ???
+xK??I????&?f?.?????!2?'(??r_??
+?????????@;?R??!5??t??V??!AY??@h???D??d?!v~????j?v?$??"??j??h?uU9????s?>(???$aa>c|i??tH?????E4?????<?#??"1q'???j??OD4?He???bB2??S?]->"f?`???E???????X?a??	mqz?]????@P-id?Z?`???Or9??K?R??S|???N??o??-9)\0?[?/??P??E?v??+??W"`xlp2{?OyLt?D#;??p%?)?KN*?9????4?{=???$????>J?!9]Jy?????'Y?B?m??T???D?Z?YO?EN(a?X%??7??`???:?
+??f?]???v???\M?S???????`?^????-?`h?N^?H?A?????&X??3Rh&???q??aDz??^kd9VY?5Z?p??+&??<E???]??j ???+??^*`?
+d?i?+????-&2A?'?D?A8??b&?N?Y ?{?D???dL{/??Ns?Y?;#;?z??)Z??Ii
+
+?????q?t@?hDO?E???b????]r)?????U??q???*??z>?9H???Q?F?a???T???O?
+?Hv??"k???h?]??q???2?????iVBk?;2N???7?/??9????VZ??u????
+??????U?f?Z]X6}d?+?V
+?k??>?%???b??????J_F;?\w?F}?S#??^F??
+?_???M?7?O??t???????A?????P????(U-?Gy'??hmi%Y????A????G?q;???0?-=??RB???O??ze??R? ?B?????;?;?z???G?????E?n4?1?????Zu?14????Zu5444444???*z?;?i????EF?G??%=??Q'?[DuI?l+?s?"??zIm&j$
+???\?d?{????l*a????????+?<??a?????i?j?o?~??6??}?????
+??Gb?6????E?????Y5<{??M?????n??\P???&???????\?4??*`Gk^?m????8;_?	??[s???????1?_hG]?N??????A????
+????7mm???????)?&?yl?^??'??_H?	7%)?i<??????????????G?n?XJ???O???
+:q
+???b??p1???m???|?????+?-_???6?|?N???<??0?&???$Y??9???/????-???\
+??%??X??????[R?i????A??n??f??????9m?[???????6??H?????????gH????k??c5d??
+???
+????a??_??=??}Y-??????^?)&?5
+e?????H?{???
+?8G6?3I????X?Z)?TTR,+????maY???????M???b?????"??I???F~???NpYe?????c.?1??~??U????????<?~?L????J?v????CjD???~???"?2?????j1?????o6????{h{?5/?-??CE5???OXo?????
+??x?K??b?0\?hw?!M)???g`z?;R???K?w9?R?P??'?{???~???R=?r?f\??
+yy???u;???`??B??S6Bj.h,??CacN?V\KLC at C??"?%?+9?&?Cz^YeY????R??^?????????7uT?JF???FYV???[/?cdE????? +?
+?G?'+%???1\L??4t?bq?-,??E?r+;??O23a[?t?u?!|A|??	?????v????V???K4@}???D??Il??????????@??[?o?????4V??????He?:???KY??]"????Y??+V???l??~g????'?]?;
+?~
+?u????c">??T??c???oU????,[g??Ld??????aPX0?mrz??????6??????|?Q?+uI??N?????/0???HR-)2???Z7-????????,YY???R*?????uX?2?Q2???z??d???[kk?????D2U?t{sZN[?d,.?J?e??G??WK?^??[?y?%???YU?JaN?Ijt??"?????V2??(?J???}U??,7*??X+U??A??u???I?F???dR< ??s????T???e?|d??w?m???.Ej?-X at l@Y??m?cn?l?=??EH?}??B?4l??????4~
+?u
+1?<???K-ld?b%^??X~w?EC???Z?d+?kIH???{b<v,(D??[gP?'?9????:????s>??????o??O]?~(v????F?\??"Or`?????6$????+v,????T??]?????)?oc?3}?N?O]?qX=?????p?8
+1Z??Ti???"?4?????a
+?n?);?cn_????????????v?;o???v?'???H$@??~?Z????+???%9?z?S?(r??m??h+;?Q?a?yR?8DE???^UHCg??>$??I~?????r\?W?^NI?{???Qq?L?C?T-??k????"?R?T??????FY?:??dS#???	?6c@?4??a?I??????4??????0??&[/u??????i??W
+?u????c??Z??)?Z^i????!?'?]??8?c?|?eX?t@???qTG???!Z~?9
+
+??C?????O???K?u?%??.??VI?Z;??a:'HI3=?p?*6?6eJ?3*??????N??h?Jfc???????m??Mt??-??^??!"2W???[?'??"??|(TWP*-?s?a???+?R.??@wH? ???'y???/?????q???S???^>S??|??M??Y?,?;-?!d-J8'???R????/c?p8?zRv???#x????
+z?gi?(?Sr)??N?{???T&U7*?:?"j?!???:
+?????'???0=mw??h????????7???7Z~?>y1}??OM^!CqO??%.??!?r????h?44B!X?w????C?&s??M_Z8?n?u??"4??t?TLD??F??GZ=hF"??5?????H+???	V>???")???g???*?]{?`e???#?-?H??????`N???ZL?(???O???\????/???K????f????_V??w??R???M:??E??????9S??0??-?HUv]t?e?x
+???@???`??VVAI????TK??(?Ha?1r?R????]?"?@?iP???hm???7q??Y\?z??ESj?'_??c???r;???a??b????Or??h???????]<??44?,hiq?y??)????mFb?P???
+??????{%.
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2010-01-09 21:30:51 UTC (rev 1573)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2010-01-09 21:31:34 UTC (rev 1574)
@@ -97,6 +97,7 @@
 		</partintro>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/configuration.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/jcr.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/query_and_search.xml"/>
   	<!-- xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/deploying_dna_jcr.xml"/ -->
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/rest_service.xml"/>
   </part>


From dna-commits at lists.jboss.org  Sat Jan  9 17:08:50 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 17:08:50 -0500
Subject: [dna-commits] DNA SVN: r1575 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <201001092208.o09M8owG020231@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 17:08:50 -0500 (Sat, 09 Jan 2010)
New Revision: 1575

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
Log:
DNA-621 Updated the Reference Guide section that talks about the levels of JCR support.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-09 21:31:34 UTC (rev 1574)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-09 22:08:50 UTC (rev 1575)
@@ -194,7 +194,8 @@
 	<sect1>
 		<title>JCR Specification Support</title>
 		<para>
-		The JBoss DNA JCR implementation will not be JCR-compliant prior to the 1.0 release.  Additionally, the JCR 
+		The JBoss DNA JCR implementation is actually very close to being JCR-compliant, but it only passes about 96% of the JCR TCK.
+		Our goal is to pass 100% of the TCK tests by the 1.0 release. Additionally, the JCR 
 		specification allows some latitude to implementors for some implementation details.  The sections below
 		clarify JBoss DNA's current and planned behavior.  <emphasis>As always, please consult the 
 		<ulink url="&Roadmap;">current list of known issues and bugs</ulink>.</emphasis>
@@ -202,20 +203,23 @@
 		<sect2>
 			<title>L1 and L2 Features</title>
 			<para>
-				JBoss DNA currently supports most of the Level 1 and Level 2 feature set defined by the <ulink url="&JSR170;">JSR-170</ulink> specification.
-				Queries, which are part of Level 1, are not implemented.  Referential integrity for <code>REFERENCE</code> properties, a Level 2 feature, is also not yet implemented.  
-				As the current implementation does provide many of the features that may be needed by an application, we really hope that this release will allow you to give us 
-				some feedback on what we have so far.
+				JBoss DNA currently supports all Level 1 features and most of the Level 2 features defined by the 
+				<ulink url="&JSR170;">JSR-170</ulink> specification.
+				This release adds support for queries, which is described in more detail in <link linkend="jcr-query-and-search">later</link>.
+				However, referential integrity for <code>REFERENCE</code> properties, a Level 2 feature, is not yet implemented.  
+				As the current implementation does provide many of the features that may be needed by an application, we really hope 
+				that this release will allow you to give us some feedback on what we have so far.
 			</para>
 		</sect2>
 		<sect2>
 			<title>Optional Features</title>
 			<para>
-				JBoss DNA does currently supports the optional JCR locking feature.  Currently, the observation optional feature is planned to be complete prior
-				to the 1.0 release.  
+				JBoss DNA does currently supports the optional JCR locking and observation features.  
 				<note>
 					<para>
 						The JCR-SQL optional feature is not planned to be implemented as it has been dropped from the <ulink url="&JSR283;">JSR-283</ulink> specification.
+						Instead, JBoss DNA supports the JCR-SQL2 query language defined by the <ulink url="&JSR283;">JSR-283</ulink> specification.
+						For details, see the chapter on <link linkend="jcr-query-and-search">queries and search languages</link>.
 					</para>
 				</note>
 			</para>


From dna-commits at lists.jboss.org  Sat Jan  9 17:09:07 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 17:09:07 -0500
Subject: [dna-commits] DNA SVN: r1576 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <201001092209.o09M97Lg020245@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 17:09:07 -0500 (Sat, 09 Jan 2010)
New Revision: 1576

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
Log:
DNA-621 Updated the Reference Guide section that talks about the levels of JCR support.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-09 22:08:50 UTC (rev 1575)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-09 22:09:07 UTC (rev 1576)
@@ -214,11 +214,14 @@
 		<sect2>
 			<title>Optional Features</title>
 			<para>
-				JBoss DNA does currently supports the optional JCR locking and observation features.  
+				JBoss DNA does currently supports the optional JCR locking and observation features (though there still are
+				a few known issues with our implementation of observation).
 				<note>
 					<para>
-						The JCR-SQL optional feature is not planned to be implemented as it has been dropped from the <ulink url="&JSR283;">JSR-283</ulink> specification.
-						Instead, JBoss DNA supports the JCR-SQL2 query language defined by the <ulink url="&JSR283;">JSR-283</ulink> specification.
+						The JCR-SQL optional feature of <ulink url="&JSR170;">JSR-170</ulink> is not planned to be implemented
+						as it has been dropped from the <ulink url="&JSR283;">JSR-283</ulink> specification.
+						Instead, JBoss DNA already supports its replacement, the JCR-SQL2 query language defined by the 
+						<ulink url="&JSR283;">JSR-283</ulink> specification.
 						For details, see the chapter on <link linkend="jcr-query-and-search">queries and search languages</link>.
 					</para>
 				</note>


From dna-commits at lists.jboss.org  Sat Jan  9 17:27:32 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 17:27:32 -0500
Subject: [dna-commits] DNA SVN: r1577 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <201001092227.o09MRWp3022208@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 17:27:32 -0500 (Sat, 09 Jan 2010)
New Revision: 1577

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
Log:
Added missing JavaDoc @return parameter.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	2010-01-09 22:09:07 UTC (rev 1576)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JndiRepositoryFactory.java	2010-01-09 22:27:32 UTC (rev 1577)
@@ -30,11 +30,11 @@
  * <pre>
  *   &lt;GlobalNamingResources&gt;
  *         &lt;!-- Other configuration omitted --&gt;
- *      &lt;Resource name="jcr/local" auth="Container"
- *           type="javax.jcr.Repository"
- *           factory="org.jboss.dna.jcr.JndiRepositoryFactory"
- *           configFile="/tck/default/configRepository.xml"
- *           repositoryName="Test Repository Source"
+ *      &lt;Resource name=&quot;jcr/local&quot; auth=&quot;Container&quot;
+ *           type=&quot;javax.jcr.Repository&quot;
+ *           factory=&quot;org.jboss.dna.jcr.JndiRepositoryFactory&quot;
+ *           configFile=&quot;/tck/default/configRepository.xml&quot;
+ *           repositoryName=&quot;Test Repository Source&quot;
  *           /&gt;
  *   &lt;/GlobalNamingResources&gt;
  * </pre>
@@ -110,6 +110,7 @@
      * @param name ignored
      * @param nameCtx ignored
      * @param environment ignored
+     * @return the repository; never null
      * @throws IOException if there is an error or problem reading the configuration resource at the supplied path
      * @throws SAXException if the contents of the configuration resource are not valid XML
      * @throws NamingException if there is an error registering the namespace listener


From dna-commits at lists.jboss.org  Sat Jan  9 19:38:45 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 19:38:45 -0500
Subject: [dna-commits] DNA SVN: r1578 -
	trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic.
Message-ID: <201001100038.o0A0cjDk017103@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-09 19:38:45 -0500 (Sat, 09 Jan 2010)
New Revision: 1578

Modified:
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java
Log:
DNA-617 NPE while updating indexes (during integration tests)

Attach patch that corrects the behavior of the BasicJpaConnector with regard to EntityManager lifetime.

Prior to the patch, the BJC obtained an EntityManager in its constructor and released the EntityManager in its close method.  The typical lifecycle for a connection is a call to the constructor followed by a single call to execute(...) followed by a call to close().  With this lifecycle, the EntityManager is only used for one call to execute(...) and the transaction is committed or rolled back after the call as appropriate.

Now that the RepositoryConnectionPool is being used (and was fixed to reuse connections), the typical lifecycle is one call to the constructor followed by multiple calls to execute(...) within different transactions followed by (eventually) a call to close().  Since the same EntityManager was being held for the entire life of the BJC object, the EntityManager would be used for multiple transactions without any attempt being made to clear out its cache.  We're using Hibernate as our JPA implementation, so the Hibernate session cache was gradually accumulating copies of the data in the database _that were gradually falling out of sync with the database_.

In other words, BJC1 would be used to create a node and set a property leaving the ChildEntity and the PropertiesEntity for the node in the Hibernate session cache for BJC1's EntityManager.  BJC2 would then be used to read the same node and update its property.  Since the entities for the node weren't yet in in the session cache for BJC2's EntityManager, BJC2 would execute select statements to load the necessary data and would perform the updates.  THEN in a subsequent call, BJC1 would be reused to read from the same node.  Since BJC already had the ChildEntity and PropertiesEntity for the node in its session cache, it would reuse the cached (and now stale) versions instead of trying to hit the database.  Hilarity ensued.

The patch makes BJC obtain an EntityManager at the beginning of the execute(...) call and release the EntityManager at the end of the execute(...) call.  Since "released" EntityManager objects are really closed by the EntityManagers factory object, this will cure the session cache issue.

This fixes all but 5 of the TCK failures with the JPA connector using the basic model.

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java	2010-01-09 22:27:32 UTC (rev 1577)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java	2010-01-10 00:38:45 UTC (rev 1578)
@@ -76,8 +76,8 @@
         this.name = sourceName;
         this.cachePolicy = cachePolicy; // may be null
         this.entityManagers = entityManagers;
-        this.entityManager = entityManagers.checkout();
-        assert this.entityManagers != null;
+        // this.entityManager = entityManagers.checkout();
+        // assert this.entityManagers != null;
         this.rootNodeUuid = rootNodeUuid;
         this.largeValueMinimumSizeInBytes = largeValueMinimumSizeInBytes;
         this.compressData = compressData;
@@ -132,9 +132,6 @@
      */
     public void execute( ExecutionContext context,
                          Request request ) throws RepositorySourceException {
-        if (entityManager == null) {
-            throw new RepositorySourceException(JpaConnectorI18n.connectionIsNoLongerOpen.text(name));
-        }
 
         Logger logger = context.getLogger(getClass());
         Stopwatch sw = null;
@@ -142,14 +139,21 @@
             sw = new Stopwatch();
             sw.start();
         }
-        // Do any commands update/write?
-        RequestProcessor processor = new BasicRequestProcessor(name, context, observer, entityManager, rootNodeUuid,
-                                                               nameOfDefaultWorkspace, predefinedWorkspaceNames,
-                                                               largeValueMinimumSizeInBytes, creatingWorkspacesAllowed,
-                                                               compressData, enforceReferentialIntegrity);
 
+        RequestProcessor processor = null;
         boolean commit = true;
+
         try {
+            this.entityManager = entityManagers.checkout();
+
+            if (entityManager == null) {
+                throw new RepositorySourceException(JpaConnectorI18n.connectionIsNoLongerOpen.text(name));
+            }
+
+            // Do any commands update/write?
+            processor = new BasicRequestProcessor(name, context, observer, entityManager, rootNodeUuid, nameOfDefaultWorkspace,
+                                                  predefinedWorkspaceNames, largeValueMinimumSizeInBytes,
+                                                  creatingWorkspacesAllowed, compressData, enforceReferentialIntegrity);
             // Obtain the lock and execute the commands ...
             processor.process(request);
             if (request.hasError() && !request.isReadOnly()) {
@@ -184,7 +188,15 @@
                     processor.notifyObserverOfChanges();
                 }
             }
+
+            // Do this only once ...
+            try {
+                entityManagers.checkin(entityManager);
+            } finally {
+                entityManager = null;
+            }
         }
+
         if (logger.isTraceEnabled()) {
             assert sw != null;
             sw.stop();
@@ -198,14 +210,6 @@
      * @see org.jboss.dna.graph.connector.RepositoryConnection#close()
      */
     public void close() {
-        if (entityManager != null) {
-            // Do this only once ...
-            try {
-                entityManagers.checkin(entityManager);
-            } finally {
-                entityManager = null;
-            }
-        }
     }
 
 }


From dna-commits at lists.jboss.org  Sat Jan  9 22:07:51 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 9 Jan 2010 22:07:51 -0500
Subject: [dna-commits] DNA SVN: r1579 -
	trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic.
Message-ID: <201001100307.o0A37p0Z019505@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-09 22:07:50 -0500 (Sat, 09 Jan 2010)
New Revision: 1579

Modified:
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java
Log:
DNA-617 BasicJpaConnection no longer needs the EntityManager field, since a new one is always checked out and checked in within the execute(...) method. The same behavior was added to the ping(...) method.

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java	2010-01-10 00:38:45 UTC (rev 1578)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicJpaConnection.java	2010-01-10 03:07:50 UTC (rev 1579)
@@ -48,7 +48,6 @@
     private final String name;
     private final CachePolicy cachePolicy;
     private final EntityManagers entityManagers;
-    private EntityManager entityManager;
     private final UUID rootNodeUuid;
     private final String nameOfDefaultWorkspace;
     private final String[] predefinedWorkspaceNames;
@@ -76,8 +75,6 @@
         this.name = sourceName;
         this.cachePolicy = cachePolicy; // may be null
         this.entityManagers = entityManagers;
-        // this.entityManager = entityManagers.checkout();
-        // assert this.entityManagers != null;
         this.rootNodeUuid = rootNodeUuid;
         this.largeValueMinimumSizeInBytes = largeValueMinimumSizeInBytes;
         this.compressData = compressData;
@@ -121,7 +118,12 @@
      */
     public boolean ping( long time,
                          TimeUnit unit ) {
-        return entityManager != null ? entityManager.isOpen() : false;
+        EntityManager entityManager = entityManagers.checkout();
+        try {
+            return entityManager != null ? entityManager.isOpen() : false;
+        } finally {
+            entityManagers.checkin(entityManager);
+        }
     }
 
     /**
@@ -141,10 +143,10 @@
         }
 
         RequestProcessor processor = null;
+        EntityManager entityManager = null;
         boolean commit = true;
-
         try {
-            this.entityManager = entityManagers.checkout();
+            entityManager = entityManagers.checkout();
 
             if (entityManager == null) {
                 throw new RepositorySourceException(JpaConnectorI18n.connectionIsNoLongerOpen.text(name));
@@ -161,37 +163,39 @@
                 commit = false;
             }
         } finally {
-            try {
-                processor.close();
-            } finally {
-                // Now commit or rollback ...
+            if (processor != null) {
                 try {
-                    EntityTransaction txn = entityManager.getTransaction();
-                    if (txn != null) {
-                        if (commit) {
-                            // Now commit the transaction ...
-                            txn.commit();
-                        } else {
-                            // Need to rollback the changes made to the repository ...
-                            txn.rollback();
+                    processor.close();
+                } finally {
+                    // Now commit or rollback ...
+                    try {
+                        EntityTransaction txn = entityManager.getTransaction();
+                        if (txn != null) {
+                            if (commit) {
+                                // Now commit the transaction ...
+                                txn.commit();
+                            } else {
+                                // Need to rollback the changes made to the repository ...
+                                txn.rollback();
+                            }
                         }
+                    } catch (Throwable commitOrRollbackError) {
+                        if (commit && !request.hasError()) {
+                            // Record the error on the request ...
+                            request.setError(commitOrRollbackError);
+                        }
+                        commit = false; // couldn't do it
                     }
-                } catch (Throwable commitOrRollbackError) {
-                    if (commit && !request.hasError()) {
-                        // Record the error on the request ...
-                        request.setError(commitOrRollbackError);
+                    if (commit) {
+                        // Now that we're not in a transaction anymore, notify the observer of the committed changes ...
+                        processor.notifyObserverOfChanges();
                     }
-                    commit = false; // couldn't do it
                 }
-                if (commit) {
-                    // Now that we're not in a transaction anymore, notify the observer of the committed changes ...
-                    processor.notifyObserverOfChanges();
-                }
             }
 
             // Do this only once ...
             try {
-                entityManagers.checkin(entityManager);
+                entityManagers.checkin(entityManager); // even if null
             } finally {
                 entityManager = null;
             }


From dna-commits at lists.jboss.org  Sun Jan 10 02:10:49 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 02:10:49 -0500
Subject: [dna-commits] DNA SVN: r1580 - in
	trunk/docs/reference/src/main/docbook/en-US: content/jcr and
	1 other directory.
Message-ID: <201001100710.o0A7Anns007252@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 02:10:48 -0500 (Sun, 10 Jan 2010)
New Revision: 1580

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
DNA-617 Completed the initial version of the chapter on query and search functionality. Also removed text that pointed to the Reference Guide from within the Reference Guide.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-10 03:07:50 UTC (rev 1579)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-10 07:10:48 UTC (rev 1580)
@@ -230,7 +230,6 @@
  ]]></programlisting>
 			<para>
 				This really is a more advanced way to define your configuration, so we won't go into how you configure a &RepositorySource;.
-				For more information, consult the &ReferenceGuide;.
 			</para>
 			<note>
 				<para>The <code>loadFrom(...)</code> method can be called any number of times, but each time it is called it completely wipes
@@ -329,8 +328,7 @@
 					(loaded from the classpath), that is to sequence the "jcr:data" property on any new or changed nodes that are named 
 					"jcr:content" below a parent node	with a name ending in ".jpg", ".jpeg", ".gif", ".bmp", ".pcx", ".iff", ".ras", 
 					".pbm", ".pgm", ".ppm" or ".psd".  The output of the sequencing operation should be placed at the "/images/$1" node,
-					where the "$1" value is captured as the name of the parent node.  (The capture groups work the same was as regular expressions;
-					see the &ReferenceGuide; for more details.)
+					where the "$1" value is captured as the name of the parent node.  (The capture groups work the same was as regular expressions.)
 					Of course, the class can be specified as Class reference or a string (followed by whether the class should be loaded from
 					the classpath or from a specific classpath).
 				</para>
@@ -448,7 +446,7 @@
 			<para>
 				Before the server can start, however, all of the JBoss DNA jars need to be placed on the classpath for the server.
 				JAAS also needs to be configured, and this can be done using the application server's configuration or in your
-				web application if you're using a simple servlet container. For more details, see the &ReferenceGuide;.
+				web application if you're using a simple servlet container.
 			</para>
 			<note>
 				<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 03:07:50 UTC (rev 1579)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:10:48 UTC (rev 1580)
@@ -31,24 +31,887 @@
 <chapter id="jcr-query-and-search">
   <title>Querying and Searching using JCR</title>
   <para>
+	  The JCR API defines a way to query a repository for content that meets user-defined criteria. 
+	  The JCR API actually makes it possible for implementations to support multiple query languages,
+	  and the only language required by <ulink url="&JSR170;">JCR 1.0</ulink> is a subset of XPath. The 1.0 specification
+	  also defines a SQL-like query language, but supporting it is optional.
+  </para>
+	<para>
+		JBoss DNA now support this query feature, including the required XPath language and two other languages not
+		defined by the specification. This chapter describes how your applications can use queries to search
+		your repositories, and defines the three query languages that are available with JBoss DNA.
 	</para>
   <sect1 id="jcr-query-api">	
     <title>JCR Query API</title>
 	  <para>
+			Like most operations in the JCR API, querying is done through a &Session; instance, from which can be obtained
+			the &QueryManager; that defines methods for creating &Query; objects, storing queries as &Node;s in the repository,
+			and reconstituting queries that were stored on &Nodes;s.  Thus, querying a repository generally follows this pattern:
 		</para>
+<programlisting role="JAVA"><![CDATA[
+// Obtain the query manager for the session ...
+javax.jcr.query.QueryManager queryManager = session.getWorkspace().getQueryManager();
+
+// Create a query object ...
+String language = ...
+String expression = ...
+javax.jcr.Query query = queryManager.createQuery(expression,language);
+
+// Execute the query and get the results ...
+javax.jcr.QueryResult result = query.execute();
+
+// Iterate over the nodes in the results ...
+javax.jcr.NodeIterator nodeIter = result.getNodes();
+while ( nodeIter.hasNext() ) {
+    javax.jcr.Node node = nodeIter.nextNode();
+		...
+}
+
+// Or iterate over the rows in the results ...
+String[] columnNames = result.getColumnNames();
+javax.jcr.query.RowIterator rowIter = result.getRows();
+while ( rowIter.hasNext() ) {
+    javax.jcr.query.Row row = rowIter.nextRow();
+    // Iterate over the column values in each row ...
+    javax.jcr.Value[] values = row.getValues();
+    for ( javax.jcr.Value value : values ) {
+				...
+    }
+    // Or access the column values by name ...
+    for ( String columnName : columnNames ) {
+        javax.jcr.Value value = row.getValue(columnName);
+				...
+    }
+}
+
+// When finished, close the session ...
+session.logout();
+]]></programlisting>
+		<para>
+			For more detail about these methods or about how to use other facets of the JCR query API, please consult Section 6.7 of the 
+			<ulink url="&JSR170;">JCR 1.0 specification</ulink>.
+		</para>
 	</sect1>
   <sect1 id="jcr-xpath-query-language">	
     <title>JCR XPath Query Language</title>
 	  <para>
+		  The <ulink url="&JSR170;">JCR 1.0 specification</ulink> uses the XPath query language because node structures in JCR
+		  are very analogous to the structure of an XML document. Thus, XPath provides a useful language for selecting
+		  and searching workspace content. And since JCR 1.0 defines a mapping between XML and a workspace view called
+		  the "document view", adapting XPath to workspace content is quite natural.
 		</para>
+		<para>
+			An JCR XPath query specifies the subset of nodes in a workspace that satisfy the constraints defined in the query.
+			Constraints can limit the nodes in the results to be those nodes with a specific (primary or mixin) node type,
+			with properties having particular values, or to be within a specific subtree of the workspace.
+			The query also defines how the nodes are to be returned in the result sets using column specifiers
+			and ordering specifiers.
+		</para>
+		<note>
+			<para>
+				As an aside, JBoss DNA actually implements XPath queries by transforming them into the equivalent JCR-SQL2 representation.
+				And the JCR-SQL2 language, although often more verbose, is much more capable of representing complex queries with multiple combinations
+				of type, property, and path constraints.
+			</para>
+		</note>
+	  <sect2 id="jcr-xpath-column-specifiers">	
+	    <title>Column Specifiers</title>
+			<para>
+				JCR 1.0 specifies that support is required only for returning column values based upon single-valued, non-residual
+				properties that are declared on or inherited by the node types specified in the type constraint.
+				JBoss DNA follows this requirement, and does not specifying residual properties. However, JBoss DNA does allow
+				multi-valued properties to be specified as result columns.
+				And as per the specification, JBoss DNA always returns the "<code>jcr:path</code>" and "<code>jcr:score</code>"
+				pseudo-columns.
+			</para>
+			<para>
+				JBoss DNA uses the last location step with an attribute axis to specify the properties that are to be returned
+				as result columns. Multiple properties are specified with a union. 
+				For example, the following table shows several XPath queries and how they map to JCR-SQL2 queries.
+			</para>
+			<table frame='all'>
+				<title>Specifying result set columns</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='0'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>XPath</entry>
+				  		<entry>JCR-SQL2</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry><code>//*</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)/@my:title</code></entry>
+							<entry><programlisting>SELECT [my:title] FROM [my:type]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)/(@my:title | @my:text)</code></entry>
+							<entry><programlisting>SELECT [my:title], [my:text] FROM [my:type]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)/(@my:title union @my:text)</code></entry>
+							<entry><programlisting>SELECT [my:title], [my:text] FROM [my:type]</programlisting></entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+		</sect2>
+	  <sect2 id="jcr-xpath-type-constraints">	
+	    <title>Type Constraints</title>
+			<para>
+				JCR 1.0 specifies that support is required only for specifying constraints of one primary type, and it
+				is optional to support specifying constraints on one (or more) mixin types.  The specification
+				also defines that the XPath <code>element</code> test be used to test against node types,
+				and that it is optional to support <code>element</code> tests on location steps other than the last one.
+				Type constraints are inherently inheritance-sensitive, in that a constraint against a particular node type
+				'X' will be satisfied by nodes explicitly declared to be of type 'X' or of subtypes of 'X'.
+			</para>
+			<para>
+				JBoss DNA does support using the <code>element</code> test to test against primary or mixin type.
+				JBoss DNA also only supports using an <code>element</code> test on the last location step.
+				For example, the following table shows several XPath queries and how they map to JCR-SQL2 queries.
+			</para>
+			<table frame='all'>
+				<title>Specifying type constraints</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='0'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>XPath</entry>
+				  		<entry>JCR-SQL2</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry><code>//*</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/nodes/element(*,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type] 
+WHERE PATH([my:type])> LIKE '/nodes/%'
+ AND DEPTH([my:type]) = CAST(2 AS LONG)</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/nodes//element(*,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type] 
+WHERE PATH([my:type]) LIKE '/nodes/%'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/nodes//element(ex:nodeName,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type] 
+WHERE PATH([my:type]) LIKE '/nodes/%'
+ AND NAME([my:type]) = 'ex:nodeName'</programlisting></entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>
+				Note that the JCR-SQL2 language supported by JBoss DNA is far more capable of joining
+				multiple sets of nodes with different type, property and path constraints.
+			</para>
+		</sect2>
+	  <sect2 id="jcr-xpath-property-constraints">	
+	    <title>Property Constraints</title>
+			<para>
+				JCR 1.0 specifies that attribute tests on the last location step is required, but that
+				predicate tests on any other location steps is optional.
+			</para>
+			<para>
+				JBoss DNA does support using attribute tests on the last location step to specify
+				property constraints, as well as supporting axis and filter predicates on other location steps.
+				For example, the following table shows several XPath queries and how they map to JCR-SQL2 queries.
+			</para>
+			<table frame='all'>
+				<title>Specifying property constraints</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='0'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>XPath</entry>
+				  		<entry>JCR-SQL2</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry><code>//*[@prop1]</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base] 
+WHERE [nt:base].prop1 IS NOT NULL</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[@prop1]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE [my:type].prop1 IS NOT NULL</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[@prop1=xs:boolean('true')]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE [my:type].prop1 = CAST('true' AS BOOLEAN)</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[@id&lt;1 and @name='john']</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE id &lt; 1 AND name = 'john'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[a/b/@id]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+JOIN [nt:base] as nodeSet1 
+  ON ISCHILDNODE(nodeSet1,[my:type])
+JOIN [nt:base] as nodeSet2 
+  ON ISCHILDNODE(nodeSet2,nodeSet1)
+WHERE (NAME(nodeSet1) = 'a' 
+  AND NAME(nodeSet2) = 'b')
+  AND nodeSet2.id IS NOT NULL</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[./*/*/@id]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+JOIN [nt:base] as nodeSet1 
+  ON ISCHILDNODE(nodeSet1,[my:type])
+JOIN [nt:base] as nodeSet2
+  ON ISCHILDNODE(nodeSet2,nodeSet1)
+WHERE nodeSet2.id IS NOT NULLL</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[.//@id]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+JOIN [nt:base] as nodeSet1 
+  ON ISDESCENDANTNODE(nodeSet1,[my:type])
+WHERE nodeSet2.id IS NOT NULLL</programlisting></entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>
+				Section 6.6.3.3 of the JCR 1.0 specification contains an in-depth description of property value constraints using
+				various comparison operators.
+			</para>
+		</sect2>
+	  <sect2 id="jcr-xpath-path-constraints">	
+	    <title>Path Constraints</title>
+			<para>
+				JCR 1.0 specifies that exact, child node, and descendants-or-self path constraints be supported
+				on the location steps in an XPath query.
+			</para>
+			<para>
+				JBoss DNA does support the four kinds of path constraints.
+				For example, the following table shows several XPath queries and how they map to JCR-SQL2 queries.
+			</para>
+			<table frame='all'>
+				<title>Specifying path constraints</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='0'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>XPath</entry>
+				  		<entry>JCR-SQL2</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry><code>/jcr:root/a/b[*]</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base]
+WHERE PATH([nt:base]) = '/a/b'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/a[1]/b[*]</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base]
+WHERE PATH([nt:base]) = '/a/b'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/a[2]/b</code></entry>
+							<entry><programlisting>SELECT * FROM [nt:base]
+WHERE PATH([nt:base]) = '/a[2]/b'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/a/b[2]//c[4]</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE PATH([nt:base]) = '/a/b[2]/c[4]'
+   OR PATH(nodeSet1) LIKE '/a/b[2]/%/c[4]'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/a/b//c//d</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE PATH([nt:base]) = '/a/b/c/d'
+   OR PATH([nt:base]) LIKE '/a/b/%/c/d' 
+   OR PATH([nt:base]) LIKE '/a/b/c/%/d'
+   OR PATH([nt:base]) LIKE '/a/b/%/c/%/d'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,my:type)[@id&lt;1 and @name='john']</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE id &lt; 1 AND name = 'john'</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>/jcr:root/a/b//element(*,my:type)</code></entry>
+							<entry><programlisting>SELECT * FROM [my:type]
+WHERE PATH([my:type]) = '/a/b/%'</programlisting></entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>
+				Note that the JCR-SQL2 language supported by JBoss DNA is capable of representing a wider
+				combination of path constraints.
+			</para>
+		</sect2>
+	  <sect2 id="jcr-xpath-ordering-specifiers">	
+	    <title>Ordering Specifiers</title>
+			<para>
+				JCR 1.0 extends the XPath grammar to add support for ordering the results according to the
+				natural ordering of the values of one or more properties on the nodes.
+			</para>
+			<para>
+				JBoss DNA does support zero or more ordering specifiers, including whether each specifier
+				is ascending or descending. If no ordering specifiers are defined, the ordering of the results
+				is not predefined and may vary (though ordering by score is often the approach).
+				For example, the following table shows several XPath queries and how they map to JCR-SQL2 queries.
+			</para>
+			<table frame='all'>
+				<title>Specifying result ordering</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='0'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>XPath</entry>
+				  		<entry>JCR-SQL2</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry><code>//element(*,*) order by @title</code></entry>
+							<entry><programlisting>SELECT nodeSet1.title
+FROM [nt:base] AS nodeSet1 
+ORDER BY nodeSet1.title</programlisting></entry>
+						</row>
+						<row>
+							<entry><code>//element(*,*) order by @title, @jcr:score</code></entry>
+							<entry><programlisting>SELECT nodeSet1.title
+FROM [nt:base] AS nodeSet1 
+ORDER BY nodeSet1.title,
+         SCORE([nt:base])</programlisting></entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>
+				Note that the JCR-SQL2 language supported by JBoss DNA has a far richer <code>ORDER BY</code> clause,
+				allowing the use of any kind of dynamic operand, including ordering upon arithmetic operations
+				of multiple dynamic operands.
+			</para>
+		</sect2>
+	  <sect2 id="jcr-xpath-misc">	
+	    <title>Miscellaneous</title>
+			<para>
+				JCR 1.0 defines a number of other optional and required features, and these are summarized in this section.
+	      <itemizedlist>
+	        <listitem>
+		        <para>
+			        Only abbreviated XPath syntax is supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        Only the <code>child</code> axis (the default axis, represented by '/' in abbreviated syntax),
+							<code>descendant-or-self</code> axis (represented by '//' in abbreviated syntax), 
+							<code>self</code> axis (represented by '.' in abbreviated syntax),
+							and <code>attribute</code> axis (represent by '@' in abbreviated syntax) are supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>text()</code> node test is <emphasis>not</emphasis> supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>element()</code> node test is supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>jcr:like()</code> function is supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>jcr:contains()</code> function is supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>jcr:score()</code> function is supported.
+		        </para>
+	        </listitem>
+	        <listitem>
+		        <para>
+			        The <code>jcr:deref()</code> function is <emphasis>not</emphasis> supported.
+		        </para>
+	        </listitem>
+				</itemizedlist>
+			</para>
+		</sect2>
 	</sect1>
+  <sect1 id="jcr-sql-query-language">	
+    <title>JCR-SQL Query Language</title>
+	  <para>
+		  The JCR-SQL query language is defined by the <ulink url="&JSR170;">JCR 1.0 specification</ulink> as a way to express
+		  queries using strings that are similar to SQL. Support for the language is optional, and in fact this language
+		  was deprecated in the <ulink url="&JSR283;">JCR 2.0 specification</ulink> in favor of the improved and more powerful 
+		  (and more SQL-like) <link linkend="jcr-sql2-query-language">JCR-SQL2</link> language, which is covered in the next section.
+		  As such, <emphasis role="strong">JBoss DNA does not support the original JCR-SQL language</emphasis>.
+		</para>
+	</sect1>
   <sect1 id="jcr-sql2-query-language">	
     <title>JCR-SQL2 Query Language</title>
 	  <para>
 		  The JCR-SQL2 query language is defined by the <ulink url="&JSR283;">JCR 2.0 specification</ulink> as a way to express
-		  queries using strings that are similar to SQL. JBoss DNA includes full support for this query language, and even
-		  adds several extensions to make it even more powerful.
+		  queries using strings that are similar to SQL.  This query language is an improvement over the earlier JCR-SQL language,
+		  which has been deprecated in JCR 2.0 (see previous section).
 		</para>
+		<para>
+		  JBoss DNA includes full support for the complete JCR-SQL2 query language. 
+		  However, JBoss DNA adds several extensions to make it even more powerful:
+      <itemizedlist>
+        <listitem>
+	        <para>
+		        Support for the "<code>FULL OUTER JOIN</code>" and "<code>CROSS JOIN</code>" join types, in addition to the
+		        "<code>LEFT OUTER JOIN</code>", "<code>RIGHT OUTER JOIN</code>" and "<code>INNER JOIN</code>" types defined by
+		  			JCR-SQL2. Note that "<code>JOIN</code>" is a shorthand for "<code>INNER JOIN</code>".
+	        </para>
+        </listitem>
+        <listitem>
+          <para>
+	          Support for the <code>UNION</code>, <code>INTERSECT</code>, and <code>EXCEPT</code> set operations on multiple result
+	          sets to form a single result set. As with standard SQL, the result sets being combined must have the same columns.
+	          The <code>UNION</code> operator combines the rows from two result sets, the <code>INTERSECT</code> operator returns
+	          the difference between two result sets, and the <code>EXCEPT</code> operator returns the rows that are common to
+	          two result sets.  Duplicate rows are removed unless the operator is followed by the <code>ALL</code> keyword.
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+		        Removal of duplicate rows in the results, using "<code>SELECT DISTINCT ...</code>".
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+		        Limiting the number of rows in the result set with the "<code>LIMIT count</code>" clause, where <code>count</code>
+		        is the maximum number of rows that should be returned.  This clause may optionally be followed by the
+						"<code>OFFSET number</code>" clause to specify the number of initial rows that should be skipped.
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+						Additional dynamic operands "<code>DEPTH([&lt;selectorName>])</code>" and "<code>PATH([&lt;selectorName>])</code>"
+						that enable placing constraints on the node depth and path, respectively.  These dynamic operands 
+						can be used in a manner similar to "<code>NAME([&lt;selectorName>])</code>" and "<code>LOCALNAME([&lt;selectorName>])</code>"
+						that are defined by JCR-SQL2.  Note in each of these cases, the selector name is optional if there is only one
+						selector in the query.
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+						Support for the <code>IN</code> and <code>NOT IN</code> clauses to more easily and concisely supply multiple
+						of discreet static operands: "<code>&lt;dynamicOperand> [NOT] IN (&lt;staticOperand> {, &lt;staticOperand>})"</code>.
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+						Support for the <code>BETWEEN</code> clause to more easily and concisely supply a range of discreet operands: 
+						"<code>&lt;dynamicOperand> [NOT] BETWEEN &lt;lowerBoundStaticOperand> [EXCLUSIVE] AND &lt;upperBoundStaticOperand> [EXCLUSIVE]</code>"
+	        </para>
+        </listitem>
+        <listitem>
+	        <para>
+						Support for simple arithmetic in numeric-based criteria and order-by clauses.  For example, 
+						"<code>... WHERE SCORE(type1) + SCORE(type2) > 1.0</code>" or "<code>... ORDER BY (SCORE(type1) * SCORE(type2)) ASC</code>".
+					</para>
+        </listitem>
+      </itemizedlist>
+		</para>
+		<sect2 id="jcr-sql2-grammar">
+			<title>Grammar</title>
+			<para>
+				The grammar for the JCR-SQL2 query language is actually a superset of that defined by the
+				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, and as such the complete grammar is included here.
+			</para>
+			<note>
+				<para>
+					The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
+					Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
+					Terms surrounded by '{' and '}' denote terms that appear zero or more times.
+					Parentheses are used to identify groups, and are often used to surround possible values. 
+				</para>
+			</note>
+			<sect3>
+				<title>Queries</title>
+<programlisting><![CDATA[
+QueryCommand ::= Query | SetQuery
+
+SetQuery ::= Query ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query
+                 { ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query }
+
+Query ::= 'SELECT' ['DISTINCT'] columns
+          'FROM' Source
+          ['WHERE' Constraint]
+          ['ORDER BY' orderings]
+          [Limit]
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Sources</title>
+<programlisting><![CDATA[
+Source ::= Selector | Join
+
+Selector ::= nodeTypeName ['AS' selectorName]
+
+nodeTypeName ::= Name
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Joins</title>
+<programlisting><![CDATA[
+	
+Join ::= left [JoinType] 'JOIN' right 'ON' JoinCondition
+         // If JoinType is omitted INNER is assumed.
+
+left ::= Source
+right ::= Source
+
+JoinType ::= Inner | LeftOuter | RightOuter | FullOuter | Cross
+
+Inner ::= 'INNER' ['JOIN']
+
+LeftOuter ::= 'LEFT JOIN' | 'OUTER JOIN' | 'LEFT OUTER JOIN'
+
+RightOuter ::= 'RIGHT OUTER' ['JOIN']
+
+RightOuter ::= 'FULL OUTER' ['JOIN']
+
+RightOuter ::= 'CROSS' ['JOIN']
+
+JoinCondition ::= EquiJoinCondition | SameNodeJoinCondition | 
+                  ChildNodeJoinCondition | DescendantNodeJoinCondition
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Equi-Join Conditions</title>
+<programlisting><![CDATA[
+	
+EquiJoinCondition ::= selector1Name'.'property1Name '=' selector2Name'.'property2Name
+
+selector1Name ::= selectorName
+selector2Name ::= selectorName
+property1Name ::= propertyName
+property2Name ::= propertyName
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Same-Node Join Conditions</title>
+<programlisting><![CDATA[
+	
+SameNodeJoinCondition ::= 'ISSAMENODE(' selector1Name ',' selector2Name [',' selector2Path] ')'
+
+selector2Path ::= Path
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Child-Node Join Conditions</title>
+<programlisting><![CDATA[
+	
+ChildNodeJoinCondition ::= 'ISCHILDNODE(' childSelectorName ',' parentSelectorName ')'
+
+childSelectorName ::= selectorName
+parentSelectorName ::= selectorName
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Descendant-Node Join Conditions</title>
+<programlisting><![CDATA[
+	
+DescendantNodeJoinCondition ::= 'ISDESCENDANTNODE(' descendantSelectorName 
+                                                ',' ancestorSelectorName ')'
+descendantSelectorName ::= selectorName
+ancestorSelectorName ::= selectorName
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Constraints</title>
+<programlisting><![CDATA[
+	
+Constraint ::= ConstraintItem | '(' ConstraintItem ')'
+
+ConstraintItem ::= And | Or | Not | Comparison | Between | PropertyExistence | 
+                   SetConstraint | FullTextSearch | SameNode | ChildNode | DescendantNode
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>And Constraints</title>
+<programlisting><![CDATA[
+
+And ::= constraint1 'AND' constraint2
+
+constraint1 ::= Constraint
+constraint2 ::= Constraint
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Or Constraints</title>
+<programlisting><![CDATA[
+	
+Or ::= constraint1 'OR' constraint2
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Not Constraints</title>
+<programlisting><![CDATA[
+	
+Not ::= 'NOT' Constraint
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Comparison Constraints</title>
+<programlisting><![CDATA[
+	
+Comparison ::= DynamicOperand Operator StaticOperand
+
+Operator ::= '=' | '!=' | '<' | '<=' | '>' | '>=' | 'LIKE'
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Between Constraints</title>
+<programlisting><![CDATA[
+	
+Between ::= DynamicOperand ['NOT'] 'BETWEEN' lowerBound ['EXCLUSIVE'] 
+                                   'AND' upperBound ['EXCLUSIVE']
+
+lowerBound ::= StaticOperand
+upperBound ::= StaticOperand
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Property Existence Constraints</title>
+<programlisting><![CDATA[
+	
+PropertyExistence ::= selectorName'.'propertyName 'IS' ['NOT'] 'NULL' | 
+                      propertyName 'IS' ['NOT'] 'NULL' /* If only one selector exists in this query */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Set Constraints</title>
+<programlisting><![CDATA[
+
+SetConstraint ::= selectorName'.'propertyName ['NOT'] 'IN' | 
+                      propertyName ['NOT'] 'IN' /* If only one selector exists in this query */
+                      '(' firstStaticOperand {',' additionalStaticOperand } ')'
+firstStaticOperand ::= StaticOperand
+additionalStaticOperand ::= StaticOperand
+
+]]></programlisting>
+			</sect3>
+			<sect3 id="jcr-sql2-full-text-search-constraints">
+				<title>Full-text Search Constraints</title>
+<programlisting><![CDATA[
+	
+FullTextSearch ::= 'CONTAINS(' ([selectorName'.']propertyName | selectorName'.*') 
+                           ',' ''' fullTextSearchExpression''' ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the propertyName is optional */
+fullTextSearchExpression ::= /* a full-text search expression, see FullTextSearchParser */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Same-Node Constraint</title>
+<programlisting><![CDATA[
+	
+SameNode ::= 'ISSAMENODE(' [selectorName ','] Path ')' 
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the path is optional */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Child-Node Constraints</title>
+<programlisting><![CDATA[
+
+ChildNode ::= 'ISCHILDNODE(' [selectorName ','] Path ')' 
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the path is optional */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Descendant-Node Constraints</title>
+<programlisting><![CDATA[
+
+DescendantNode ::= 'ISDESCENDANTNODE(' [selectorName ','] Path ')' 
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the propertyName is optional */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Paths and Names</title>
+<programlisting><![CDATA[
+
+Name ::= '[' quotedName ']' | '[' simpleName ']' | simpleName
+
+quotedName ::= /* A JCR Name (see the JCR specification) */
+simpleName ::= /* A JCR Name that contains only SQL-legal 
+                  characters (namely letters, digits, and underscore) */
+
+Path ::= '[' quotedPath ']' | '[' simplePath ']' | simplePath
+
+quotedPath ::= /* A JCR Path that contains non-SQL-legal characters */
+simplePath ::= /* A JCR Path (rather Name) that contains only SQL-legal 
+                    characters (namely letters, digits, and underscore) */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Static Operands</title>
+<programlisting><![CDATA[
+	
+StaticOperand ::= Literal | BindVariableValue
+
+Literal
+Literal ::= CastLiteral | UncastLiteral
+
+CastLiteral ::= 'CAST(' UncastLiteral ' AS ' PropertyType ')'
+
+PropertyType ::= 'STRING' | 'BINARY' | 'DATE' | 'LONG' | 'DOUBLE' | 'DECIMAL' | 
+                 'BOOLEAN' | 'NAME' | 'PATH' | 'REFERENCE' | 'WEAKREFERENCE' | 'URI'
+                 /* 'WEAKREFERENCE' is not currently supported in JCR 1.0 */
+
+UncastLiteral ::= UnquotedLiteral | ''' UnquotedLiteral ''' | '"' UnquotedLiteral '"'
+
+UnquotedLiteral ::= /* String form of a JCR Value, as defined in the JCR specification */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Bind Variables</title>
+<programlisting><![CDATA[
+	
+BindVariableValue ::= '$'bindVariableName
+
+bindVariableName ::= /* A string that conforms to the JCR Name syntax, though the prefix
+                        does not need to be a registered namespace prefix. */
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Dynamic Operands</title>
+<programlisting><![CDATA[
+	
+DynamicOperand ::= PropertyValue | Length | NodeName | NodeLocalName | NodePath | NodeDepth | 
+                   FullTextSearchScore | LowerCase | UpperCase | Arithmetic | 
+                   '(' DynamicOperand ')'
+
+PropertyValue ::= [selectorName'.'] propertyName
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the propertyName is optional */
+
+Length ::= 'LENGTH(' PropertyValue ')'
+
+NodeName ::= 'NAME(' [selectorName] ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      is optional */
+
+NodeLocalName ::= 'LOCALNAME(' [selectorName] ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      is optional */
+
+NodePath ::= 'PATH(' [selectorName] ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      is optional */
+
+NodeDepth ::= 'DEPTH(' [selectorName] ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      is optional */
+
+FullTextSearchScore ::= 'SCORE(' [selectorName] ')'
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      is optional */
+
+LowerCase ::= 'LOWER(' DynamicOperand ')'
+
+UpperCase ::= 'UPPER(' DynamicOperand ')'
+
+Arithmetic ::= DynamicOperand ('+'|'-'|'*'|'/') DynamicOperand
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Ordering</title>
+<programlisting><![CDATA[
+	
+orderings ::= Ordering {',' Ordering}
+
+Ordering ::= DynamicOperand [Order]
+
+Order ::= 'ASC' | 'DESC'
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Columns</title>
+<programlisting><![CDATA[
+	
+columns ::= (Column ',' {Column}) | '*'
+
+Column ::= ([selectorName'.']propertyName ['AS' columnName]) | (selectorName'.*')
+                   /* If only one selector exists in this query, explicit specification of the selectorName
+                      preceding the propertyName is optional */
+selectorName ::= Name
+propertyName ::= Name
+columnName ::= Name
+
+]]></programlisting>
+			</sect3>
+			<sect3>
+				<title>Limit and Offset</title>
+<programlisting><![CDATA[
+	
+Limit ::= 'LIMIT' count [ 'OFFSET' offset ]
+count ::= /* Positive integer value */
+offset ::= /* Non-negative integer value */
+]]></programlisting>
+			</sect3>
+		</sect2>
 	</sect1>
   <sect1 id="fulltext-search-query-language">	
     <title>Full-Text Search Language</title>
@@ -59,8 +922,9 @@
 		  you to use the JCR query API but with a far simpler, Google-style search grammar.
 		</para>
 		<para>
-			This query language is actually defined by the <ulink url="&JSR283;">JCR 2.0 specification</ulink> as the full-text 
-			search expression grammar used in the second parameter of the <code>CONTAINS(...)</code> function of the JCR-SQL2 language.
+			This query language is actually defined by the <ulink url="&JSR283;">JCR 2.0 specification</ulink> as the 
+			<link linkend="jcr-sql2-full-text-search-constraint">full-text search expression grammar</link>
+			used in the second parameter of the <code>CONTAINS(...)</code> function of the JCR-SQL2 language.
 			We just pulled it out and made it available as a first-class query language.
 		</para>
 		<para>
@@ -90,7 +954,15 @@
 			<title>Grammar</title>
 			<para>
 				The grammar for this full-text search language is specified in Section 6.7.19 of the 
-				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, but it is also included here as a convenience:
+				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, but it is also included here as a convenience.
+				<note>
+					<para>
+						The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
+						Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
+						Terms surrounded by '{' and '}' denote terms that appear zero or more times.
+						Parentheses are used to identify groups, and are often used to surround possible values. 
+					</para>
+				</note>
 			</para>
 <programlisting><![CDATA[
 

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 03:07:50 UTC (rev 1579)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 07:10:48 UTC (rev 1580)
@@ -78,6 +78,7 @@
 <!ENTITY QueryResult									"<interface>QueryResult</interface>">
 <!ENTITY NodeIterator									"<interface>NodeIterator</interface>">
 <!ENTITY RowIterator									"<interface>RowIterator</interface>">
+<!ENTITY Node													"<interface>Node</interface>">
 
 <!-- Types in dna-common -->
 


From dna-commits at lists.jboss.org  Sun Jan 10 02:23:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 02:23:34 -0500
Subject: [dna-commits] DNA SVN: r1581 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <201001100723.o0A7NYCQ008914@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 02:23:33 -0500 (Sun, 10 Jan 2010)
New Revision: 1581

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
Log:
DNA-617 Changed the section levels of the JCR-SQL2 and Full-text Search languages so that they are navigable from the Table of Contents.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:10:48 UTC (rev 1580)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:23:33 UTC (rev 1581)
@@ -548,21 +548,19 @@
         </listitem>
       </itemizedlist>
 		</para>
-		<sect2 id="jcr-sql2-grammar">
-			<title>Grammar</title>
+		<para>
+			The grammar for the JCR-SQL2 query language is actually a superset of that defined by the
+			<ulink url="&JSR283;">JCR 2.0 specification</ulink>, and as such the complete grammar is included here.
+		</para>
+		<note>
 			<para>
-				The grammar for the JCR-SQL2 query language is actually a superset of that defined by the
-				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, and as such the complete grammar is included here.
+				The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
+				Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
+				Terms surrounded by '{' and '}' denote terms that appear zero or more times.
+				Parentheses are used to identify groups, and are often used to surround possible values. 
 			</para>
-			<note>
-				<para>
-					The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
-					Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
-					Terms surrounded by '{' and '}' denote terms that appear zero or more times.
-					Parentheses are used to identify groups, and are often used to surround possible values. 
-				</para>
-			</note>
-			<sect3>
+		</note>
+			<sect2>
 				<title>Queries</title>
 <programlisting><![CDATA[
 QueryCommand ::= Query | SetQuery
@@ -576,8 +574,8 @@
           ['ORDER BY' orderings]
           [Limit]
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Sources</title>
 <programlisting><![CDATA[
 Source ::= Selector | Join
@@ -587,8 +585,8 @@
 nodeTypeName ::= Name
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Joins</title>
 <programlisting><![CDATA[
 	
@@ -614,8 +612,8 @@
                   ChildNodeJoinCondition | DescendantNodeJoinCondition
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Equi-Join Conditions</title>
 <programlisting><![CDATA[
 	
@@ -627,8 +625,8 @@
 property2Name ::= propertyName
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Same-Node Join Conditions</title>
 <programlisting><![CDATA[
 	
@@ -637,8 +635,8 @@
 selector2Path ::= Path
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Child-Node Join Conditions</title>
 <programlisting><![CDATA[
 	
@@ -648,8 +646,8 @@
 parentSelectorName ::= selectorName
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Descendant-Node Join Conditions</title>
 <programlisting><![CDATA[
 	
@@ -659,8 +657,8 @@
 ancestorSelectorName ::= selectorName
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Constraints</title>
 <programlisting><![CDATA[
 	
@@ -670,8 +668,8 @@
                    SetConstraint | FullTextSearch | SameNode | ChildNode | DescendantNode
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>And Constraints</title>
 <programlisting><![CDATA[
 
@@ -681,24 +679,24 @@
 constraint2 ::= Constraint
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Or Constraints</title>
 <programlisting><![CDATA[
 	
 Or ::= constraint1 'OR' constraint2
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Not Constraints</title>
 <programlisting><![CDATA[
 	
 Not ::= 'NOT' Constraint
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Comparison Constraints</title>
 <programlisting><![CDATA[
 	
@@ -707,8 +705,8 @@
 Operator ::= '=' | '!=' | '<' | '<=' | '>' | '>=' | 'LIKE'
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Between Constraints</title>
 <programlisting><![CDATA[
 	
@@ -719,8 +717,8 @@
 upperBound ::= StaticOperand
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Property Existence Constraints</title>
 <programlisting><![CDATA[
 	
@@ -728,8 +726,8 @@
                       propertyName 'IS' ['NOT'] 'NULL' /* If only one selector exists in this query */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Set Constraints</title>
 <programlisting><![CDATA[
 
@@ -740,8 +738,8 @@
 additionalStaticOperand ::= StaticOperand
 
 ]]></programlisting>
-			</sect3>
-			<sect3 id="jcr-sql2-full-text-search-constraints">
+			</sect2>
+			<sect2 id="jcr-sql2-full-text-search-constraints">
 				<title>Full-text Search Constraints</title>
 <programlisting><![CDATA[
 	
@@ -749,11 +747,36 @@
                            ',' ''' fullTextSearchExpression''' ')'
                    /* If only one selector exists in this query, explicit specification of the selectorName
                       preceding the propertyName is optional */
-fullTextSearchExpression ::= /* a full-text search expression, see FullTextSearchParser */
 
+fullTextSearchExpression ::= FulltextSearch
+
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			<para> where <code>FulltextSearch</code> is defined by the following, and is the same as the
+			  <link linkend='fulltext-search-expressions'>full-text search language</link> supported by JBoss DNA:
+			</para>
+<programlisting><![CDATA[
+
+FulltextSearch ::= Disjunct {Space 'OR' Space Disjunct}
+
+Disjunct ::= Term {Space Term}
+
+Term ::= ['-'] SimpleTerm
+
+SimpleTerm ::= Word | '"' Word {Space Word} '"'
+
+Word ::= NonSpaceChar {NonSpaceChar}
+
+Space ::= SpaceChar {SpaceChar}
+
+NonSpaceChar ::= Char - SpaceChar /* Any Char except SpaceChar */
+
+SpaceChar ::= ' '
+
+Char ::= /* Any character */
+
+]]></programlisting>
+			</sect2>
+			<sect2>
 				<title>Same-Node Constraint</title>
 <programlisting><![CDATA[
 	
@@ -762,8 +785,8 @@
                       preceding the path is optional */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Child-Node Constraints</title>
 <programlisting><![CDATA[
 
@@ -772,8 +795,8 @@
                       preceding the path is optional */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Descendant-Node Constraints</title>
 <programlisting><![CDATA[
 
@@ -782,8 +805,8 @@
                       preceding the propertyName is optional */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Paths and Names</title>
 <programlisting><![CDATA[
 
@@ -800,8 +823,8 @@
                     characters (namely letters, digits, and underscore) */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Static Operands</title>
 <programlisting><![CDATA[
 	
@@ -821,8 +844,8 @@
 UnquotedLiteral ::= /* String form of a JCR Value, as defined in the JCR specification */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Bind Variables</title>
 <programlisting><![CDATA[
 	
@@ -832,8 +855,8 @@
                         does not need to be a registered namespace prefix. */
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Dynamic Operands</title>
 <programlisting><![CDATA[
 	
@@ -874,8 +897,8 @@
 Arithmetic ::= DynamicOperand ('+'|'-'|'*'|'/') DynamicOperand
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Ordering</title>
 <programlisting><![CDATA[
 	
@@ -886,8 +909,8 @@
 Order ::= 'ASC' | 'DESC'
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Columns</title>
 <programlisting><![CDATA[
 	
@@ -901,8 +924,8 @@
 columnName ::= Name
 
 ]]></programlisting>
-			</sect3>
-			<sect3>
+			</sect2>
+			<sect2>
 				<title>Limit and Offset</title>
 <programlisting><![CDATA[
 	
@@ -910,7 +933,6 @@
 count ::= /* Positive integer value */
 offset ::= /* Non-negative integer value */
 ]]></programlisting>
-			</sect3>
 		</sect2>
 	</sect1>
   <sect1 id="fulltext-search-query-language">	
@@ -950,20 +972,20 @@
 			a <emphasis>negative term</emphasis>, and it reduces the rank of any node whose property values contain the
 			the value. To specify a negative term, simply prefix the term with a hyphen ('-').
 		</para>
-		<sect2 id='fulltext-grammar'>
-			<title>Grammar</title>
-			<para>
-				The grammar for this full-text search language is specified in Section 6.7.19 of the 
-				<ulink url="&JSR283;">JCR 2.0 specification</ulink>, but it is also included here as a convenience.
-				<note>
-					<para>
-						The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
-						Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
-						Terms surrounded by '{' and '}' denote terms that appear zero or more times.
-						Parentheses are used to identify groups, and are often used to surround possible values. 
-					</para>
-				</note>
-			</para>
+		<para>
+			The grammar for this full-text search language is specified in Section 6.7.19 of the 
+			<ulink url="&JSR283;">JCR 2.0 specification</ulink>, but it is also included here as a convenience.
+			<note>
+				<para>
+					The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
+					Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
+					Terms surrounded by '{' and '}' denote terms that appear zero or more times.
+					Parentheses are used to identify groups, and are often used to surround possible values. 
+				</para>
+			</note>
+		</para>
+		<sect2 id='fulltext-search-expressions'>
+			<title>Full-text Search Expressions</title>
 <programlisting><![CDATA[
 
 FulltextSearch ::= Disjunct {Space 'OR' Space Disjunct}


From dna-commits at lists.jboss.org  Sun Jan 10 02:36:05 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 02:36:05 -0500
Subject: [dna-commits] DNA SVN: r1582 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <201001100736.o0A7a5O8010335@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 02:36:05 -0500 (Sun, 10 Jan 2010)
New Revision: 1582

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
Log:
DNA-621 More minor edits to the Reference Guide.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-10 07:23:33 UTC (rev 1581)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-10 07:36:05 UTC (rev 1582)
@@ -201,11 +201,11 @@
 		<ulink url="&Roadmap;">current list of known issues and bugs</ulink>.</emphasis>
 		</para> 
 		<sect2>
-			<title>L1 and L2 Features</title>
+			<title>Level 1 and Level 2 (Required) Features</title>
 			<para>
 				JBoss DNA currently supports all Level 1 features and most of the Level 2 features defined by the 
 				<ulink url="&JSR170;">JSR-170</ulink> specification.
-				This release adds support for queries, which is described in more detail in <link linkend="jcr-query-and-search">later</link>.
+				This release adds support for queries, which is described in more detail in the <link linkend="jcr-query-and-search">next chapter</link>.
 				However, referential integrity for <code>REFERENCE</code> properties, a Level 2 feature, is not yet implemented.  
 				As the current implementation does provide many of the features that may be needed by an application, we really hope 
 				that this release will allow you to give us some feedback on what we have so far.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:23:33 UTC (rev 1581)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:36:05 UTC (rev 1582)
@@ -557,7 +557,8 @@
 				The grammar is presented using the same EBNF nomenclature as used in the JCR 2.0 specification.
 				Terms are surrounded by '[' and ']' denote optional terms that appear zero or one times. 
 				Terms surrounded by '{' and '}' denote terms that appear zero or more times.
-				Parentheses are used to identify groups, and are often used to surround possible values. 
+				Parentheses are used to identify groups, and are often used to surround possible values.
+				Literals (or keywords) are denoted by single-quotes. 
 			</para>
 		</note>
 			<sect2>


From dna-commits at lists.jboss.org  Sun Jan 10 02:57:11 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 02:57:11 -0500
Subject: [dna-commits] DNA SVN: r1583 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <201001100757.o0A7vBJi012946@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 02:57:11 -0500 (Sun, 10 Jan 2010)
New Revision: 1583

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
Log:
Merge branch 'dna-621'

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:36:05 UTC (rev 1582)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 07:57:11 UTC (rev 1583)
@@ -496,6 +496,7 @@
 		        Support for the "<code>FULL OUTER JOIN</code>" and "<code>CROSS JOIN</code>" join types, in addition to the
 		        "<code>LEFT OUTER JOIN</code>", "<code>RIGHT OUTER JOIN</code>" and "<code>INNER JOIN</code>" types defined by
 		  			JCR-SQL2. Note that "<code>JOIN</code>" is a shorthand for "<code>INNER JOIN</code>".
+						For detail, see the <link linkend="jcr-sql2-joins">grammar for joins</link>.
 	        </para>
         </listitem>
         <listitem>
@@ -505,11 +506,13 @@
 	          The <code>UNION</code> operator combines the rows from two result sets, the <code>INTERSECT</code> operator returns
 	          the difference between two result sets, and the <code>EXCEPT</code> operator returns the rows that are common to
 	          two result sets.  Duplicate rows are removed unless the operator is followed by the <code>ALL</code> keyword.
+						For detail, see the <link linkend="jcr-sql2-queries">grammar for set queries</link>.
 	        </para>
         </listitem>
         <listitem>
 	        <para>
 		        Removal of duplicate rows in the results, using "<code>SELECT DISTINCT ...</code>".
+						For detail, see the <link linkend="jcr-sql2-queries">grammar for queries</link>.
 	        </para>
         </listitem>
         <listitem>
@@ -517,6 +520,7 @@
 		        Limiting the number of rows in the result set with the "<code>LIMIT count</code>" clause, where <code>count</code>
 		        is the maximum number of rows that should be returned.  This clause may optionally be followed by the
 						"<code>OFFSET number</code>" clause to specify the number of initial rows that should be skipped.
+						For detail, see the <link linkend="jcr-sql2-limits">grammar for limits and offsets</link>.
 	        </para>
         </listitem>
         <listitem>
@@ -526,24 +530,30 @@
 						can be used in a manner similar to "<code>NAME([&lt;selectorName>])</code>" and "<code>LOCALNAME([&lt;selectorName>])</code>"
 						that are defined by JCR-SQL2.  Note in each of these cases, the selector name is optional if there is only one
 						selector in the query.
+						For detail, see the <link linkend="jcr-sql2-dynamic-operands">grammar for dynamic operands</link>.
 	        </para>
         </listitem>
         <listitem>
 	        <para>
 						Support for the <code>IN</code> and <code>NOT IN</code> clauses to more easily and concisely supply multiple
-						of discreet static operands: "<code>&lt;dynamicOperand> [NOT] IN (&lt;staticOperand> {, &lt;staticOperand>})"</code>.
+						of discreet static operands.
+						For example, "<code>WHERE ... [my:type].[prop1] IN (3,5,7,10,11,50) ...</code>".
+						For detail, see the <link linkend="jcr-sql2-set-constraints">grammar for set constraints</link>.
 	        </para>
         </listitem>
         <listitem>
 	        <para>
-						Support for the <code>BETWEEN</code> clause to more easily and concisely supply a range of discreet operands: 
-						"<code>&lt;dynamicOperand> [NOT] BETWEEN &lt;lowerBoundStaticOperand> [EXCLUSIVE] AND &lt;upperBoundStaticOperand> [EXCLUSIVE]</code>"
+						Support for the <code>BETWEEN</code> clause to more easily and concisely supply a range of discreet operands.
+						For example, "<code>WHERE ... [my:type].[prop1] BETWEEN 3 EXCLUSIVE AND 10 ...</code>".
+						For detail, see the <link linkend="jcr-sql2-between-constraints">grammar for between constraints</link>.
 	        </para>
         </listitem>
         <listitem>
 	        <para>
 						Support for simple arithmetic in numeric-based criteria and order-by clauses.  For example, 
-						"<code>... WHERE SCORE(type1) + SCORE(type2) > 1.0</code>" or "<code>... ORDER BY (SCORE(type1) * SCORE(type2)) ASC</code>".
+						"<code>... WHERE</code> <code>SCORE(type1) +</code> <code>SCORE(type2) > 1.0</code>" or 
+						"<code>... ORDER BY</code> <code>(SCORE(type1) * SCORE(type2)) ASC,</code> <code>LENGTH(type2.property1) DESC</code>".
+						For detail, see the <link linkend="jcr-sql2-ordering">grammar for order-by clauses</link>.
 					</para>
         </listitem>
       </itemizedlist>
@@ -561,13 +571,13 @@
 				Literals (or keywords) are denoted by single-quotes. 
 			</para>
 		</note>
-			<sect2>
+			<sect2 id="jcr-sql2-queries">
 				<title>Queries</title>
 <programlisting><![CDATA[
 QueryCommand ::= Query | SetQuery
 
-SetQuery ::= Query ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query
-                 { ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query }
+SetQuery ::= Query ('UNION'|'INTERSECT'|'EXCEPT') ['ALL'] Query
+                 { ('UNION'|'INTERSECT'|'EXCEPT') ['ALL'] Query }
 
 Query ::= 'SELECT' ['DISTINCT'] columns
           'FROM' Source
@@ -587,7 +597,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-joins">
 				<title>Joins</title>
 <programlisting><![CDATA[
 	
@@ -707,7 +717,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-between-constraints">
 				<title>Between Constraints</title>
 <programlisting><![CDATA[
 	
@@ -728,7 +738,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-set-constraints">
 				<title>Set Constraints</title>
 <programlisting><![CDATA[
 
@@ -857,7 +867,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-dynamic-operands">
 				<title>Dynamic Operands</title>
 <programlisting><![CDATA[
 	
@@ -899,7 +909,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-ordering">
 				<title>Ordering</title>
 <programlisting><![CDATA[
 	
@@ -926,7 +936,7 @@
 
 ]]></programlisting>
 			</sect2>
-			<sect2>
+			<sect2 id="jcr-sql2-limits">
 				<title>Limit and Offset</title>
 <programlisting><![CDATA[
 	


From dna-commits at lists.jboss.org  Sun Jan 10 10:56:55 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 10:56:55 -0500
Subject: [dna-commits] DNA SVN: r1584 - in trunk/docs:
	gettingstarted/src/main/docbook/en-US/content and 2 other
	directories.
Message-ID: <201001101556.o0AFut6p016266@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 10:56:55 -0500 (Sun, 10 Jan 2010)
New Revision: 1584

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Merge branch 'dna-621'

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -35,7 +35,7 @@
     with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
     application running.
   </para>
-	<para>JBoss DNA uses Maven 2 for its build system, as is this example. Using Maven 2 has several advantages, including
+	<para>JBoss DNA uses Maven 2 for its build system, as does this example. Using Maven 2 has several advantages, including
     the ability to manage dependencies. If a library is needed, Maven automatically finds and downloads that library, plus
     everything that library needs. This means that it's very easy to build the examples - or even create a maven project that
     depends on the JBoss DNA JARs.</para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -131,14 +131,14 @@
 		<para>
 			As we'll see in the <link linkend="use_cases">next chapter</link>, the ability of JBoss DNA to 
 			federate, integrate, and sequence information make JBoss DNA a powerful asset and tool.  
-			Then <link linkend="using_dna">Chapter 3</link> will show that once a JBoss DNA repository is set up, application see
-			JBoss DNA just as another JCR <code>javax.jcr.Repository</code> instance and uses the standard JCR API to obtain a <code>javax.jcr.Session</code>
+			Then <link linkend="using_dna">Chapter 3</link> will show that once a JBoss DNA repository is set up, applications see
+			JBoss DNA just as another JCR <code>javax.jcr.Repository</code> instance and use the standard JCR API to obtain a <code>javax.jcr.Session</code>
 			and work with the content.
 		</para>
 		<para>
 			<link linkend="downloading_and_running">Chapter 4</link> walks you through downloading
 			and building the JBoss DNA examples, while <link linkend="sequencer_example">Chapter 5</link>
-			and <link linkend="repository_example">Chapter 6</link> will run these very simple examples and walking through code.  
+			and <link linkend="repository_example">Chapter 6</link> will run these very simple examples and walk through their code.  
 			<link linkend="conclusion">Chapter 7</link> wraps things up with a discussion about the future of JBoss DNA
 			and what you can do next to start using JBoss DNA in your own applications.
 	  </para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -39,7 +39,7 @@
 	<sect1 id="running_repository_example">
 		<title>Running the repository example</title>
 		<para>The repository example consists of a client application that sets up three DNA repositories (named "Cars", "Airplanes", and "UFOs") and 
-			a federated repository ("Vehicles") that dynamically federates the information from the other two repositories.
+			a federated repository ("Vehicles") that dynamically federates the information from the other three repositories.
 			The client application allows you to interactively navigate each of these repositories just as you would navigate the
 			directory structure on a file system.</para>
 		<para>This collection of repositories is shown in the following figure:
@@ -48,7 +48,7 @@
 				<graphic align="center" scale="60" fileref="example-repositories.png"/>
 			</figure>
 			The "Cars" repository is an in-memory repository (using the In-Memory repository connector), the "Aircraft" repository is a JPA repository
-			(although it points to an in-memory HSQL database using the JPA repository connector), and the "UFOs" repository is
+			(using an in-memory HSQL database using the JPA repository connector), and the "UFOs" repository is
 			a file system repository (using the File System repository connector). The federated "Vehicles" repository
 			content is federated from the other repositories and cached into the "Cache" repository.  This is shown in the following figure: 
 	  	<figure id="example-federated-repository">
@@ -105,6 +105,7 @@
 			</para>
 			<para>You can also choose to navigate the "Vehicles" repository, which projects the "Cars" repository content under the
 				<code>/Vehicles/Cars</code> node, the "Airplanes" content under the <code>/Vehicles/Airplanes</code> branch,
+				the "UFOs" content under the <code>/Vehicles/UFOs</code> branch,
 				and the "Configuration" content under <code>/dna:system</code>.
 			</para>
 			<para>Try using the client to walk the different repositories.  And while this is a contrived application, it does demonstrate
@@ -215,19 +216,27 @@
 			</listitem>
 		</itemizedlist>
 		<para>As an example, consider that we want JBoss DNA to give us access through JCR to the schema information contained in a
-			relational databases.  We first have to develop a connector that allows us to interact with relational databases using JDBC.
-			That connector would contain a <code>JdbcRepositorySource</code> Java class that implements &RepositorySource;,
+			relational database.  We first have to develop a connector that allows us to interact with relational databases using JDBC.
+			That connector would contain a &JdbcMetadataSource; Java class that implements &RepositorySource;,
 			and that has all of the various JavaBean properties for setting the name of the driver class, URL, username, password,
-			and other properties.  (Or we might have a JavaBean property that defines the JNDI name where we can find a JDBC
-			<code>DataSource</code> instance pointing to our JDBC database.)
+			and other properties.  If we add a JavaBean property defining the JNDI name, our connector could look in JNDI to find a JDBC
+			<code>DataSource</code> instance, perhaps already configured to use connection pools.
 		</para>
+		<note>
+			<para>
+				Of course, before you develop a connector, you should probably check the
+				<ulink url="http://docs.jboss.org/jbossdna/latest/manuals/reference/html/provied-connectors-part.html">list of connectors</ulink> JBoss DNA already provides out of the box.
+				With this latest release, JBoss DNA already includes this JDBC metadata connector!  And we're always interested in new
+				connectors and new contributors, so please consider developing your custom connector as part of JBoss DNA.
+			</para>
+		</note>
 		<para>So with this very high-level summary, let's dive a little deeper and look at the repository example.</para>
 	</sect1>
 	<sect1 id="example_repository_application_review">
 		<title>Reviewing the example repository application</title>
 		<para>Recall that the example repository application consists of a client application that sets up a repository service and the
 			repositories defined in a configuration repository, allowing the user to pick a repository and interactively navigate
-			the selected repository.  Several repositories are set up, including several in-memory repositories and one federated repository
+			the selected repository.  Several repositories are set up, including several standalone repositories and one federated repository
 			that dynamically federates the content from the other repositories.</para>
 		<para>
       The example is comprised of 2 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
@@ -238,8 +247,8 @@
   ]]></programlisting>
 		<para><code>RepositoryClient</code> is the class that contains the main application. It uses an instance of the
       <code>UserInterface</code> interface to  methods that will be called at runtime to obtain information about the
-      files that are imported into the in-memory repositories and the JAAS <code>CallbackHandler</code> implementation
-      that will be used by JAAS to prompt the user for authentication information.  Finally, the <code>ConsoleInput</code>
+      files that are imported into the standalone repositories and the JAAS <code>CallbackHandler</code> implementation
+      that will be used by JAAS to collect the authentication information.  Finally, the <code>ConsoleInput</code>
 			is an implementation of this that creates a text user interface,	allowing the user to operate the client from the command-line.  
 			We can easily create a graphical implementation of <code>UserInterface</code> at a later date, or we can also create a mock 
 			implementation for testing purposes that simulates a user entering data. This allows us to check the behavior of the client 
@@ -312,9 +321,10 @@
 
     ...
 
-    // For this example, we're using a couple of in-memory repositories (including one for the configuration repository).
-    // Normally, these would exist already and would simply be accessed. But in this example, we're going to
-    // populate these repositories here by importing from files. First do the configuration repository ...
+    // For this example, we're using a couple of in-memory repositories (including one for the 
+    // configuration repository). Normally, these would exist already and would simply be accessed. 
+    // But in this example, we're going to populate these repositories here by importing from files. 
+    // First do the configuration repository ...
     String location = this.userInterface.getLocationOfRepositoryFiles();
 
     // Now import the content for the two in-memory repositories ...
@@ -334,7 +344,8 @@
 			done to keep the example simple.
 		</para>
 		<para>
-			The <code>shutdown()</code> method of the example then logs out and requests the <code>JcrEngine</code> instance shuts down and, since that may take
+			The <code>shutdown()</code> method of the example then logs out and requests that the <code>JcrEngine</code> instance 
+			shut down and, since that may take
 		  a few moments (if there are any ongoing operations or enqueued activities) awaits for it to complete the shutdown.
 	   </para>
 		<programlisting role="JAVA"><![CDATA[

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -48,9 +48,6 @@
 					<para>an MP3 sequencer that extracts the ID3 metadata (e.g., the author, title, album, year and comment)</para>
 				</listitem>
 				<listitem>
-					<para>an MP3 sequencer that extracts the ID3 metadata (e.g., the author, title, album, year and comment)</para>
-				</listitem>
-				<listitem>
 					<para>a Java source code sequencer that extracts the structure of Java classes by parsing the source code</para>
 				</listitem>
 				<listitem>
@@ -171,8 +168,8 @@
 		<para><code>SequencingClient</code> is the class that contains the main application.  <code>ContentInfo</code> is a simple class
 		  that encapsulate metadata generated by the sequencers and accessed by this example application, and there are two subclasses: 
 		  <code>MediaInfo</code> encapsulates metadata about media (image and MP3) files, while <code>JavaInfo</code> is a subclass
-		  encapsulating information about a Java class.  The client accesses the content from the repository and represent the
-		  information using instances of <code>ContentInfo</code> (and its subclasses) and then passing them to the <code>UserInterface</code>.
+		  encapsulating information about a Java class.  The client accesses the content from the repository and represents the
+		  information using instances of <code>ContentInfo</code> (and its subclasses) and then passes them to the <code>UserInterface</code>.
       <code>UserInterface</code> is an interface with methods that will be called at runtime to 
 			request data from the user.  <code>ConsoleInput</code> is an implementation of this that creates a text user interface, 
 			allowing the user to operate the client from the command-line.  We can easily create a graphical implementation of
@@ -195,7 +192,8 @@
 String repositoryId = "content";
 String workspaceName = "default";
 JcrConfiguration config = new JcrConfiguration();
-// Set up the in-memory source where we'll upload the content and where the sequenced output will be stored ...
+// Set up the in-memory source where we'll upload the content and where the sequenced output will 
+// be stored ...
 config.repositorySource("store")
       .usingClass(InMemoryRepositorySource.class)
       .setDescription("The repository for our content")
@@ -209,7 +207,8 @@
       .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
       .loadedFromClasspath()
       .setDescription("Sequences image files to extract the characteristics of the image")
-      .sequencingFrom("//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data]")
+      .sequencingFrom(
+          "//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/images/$1");
 // Set up the MP3 sequencer ...
 config.sequencer("MP3 Sequencer")
@@ -397,7 +396,7 @@
 		<title>What's next</title>
 		<para>
 			This chapter walked through running the sequencer example and looked at the example code.  With the sequencer client, you could upload files into a
-	    	JCR repository, while JBoss DNA automatically sequenced the image, MP3, or Java source files you uploaded, extracted the metadata from the
+	    	JCR repository, while JBoss DNA automatically sequenced the source files you uploaded, extracted the metadata from the
 	    	files, and stored that metadata inside the repository.
 		</para>
 		<para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -61,7 +61,7 @@
 			with the content, allowing the same content to be presented in different hierarchical classifications. 
 			But JBoss DNA capabilities also offer a great advantage, since any file that is uploaded can be automatically sequenced and processed 
 			to extract information that's meaningful and useful but often locked up within the file.  For example, when a WSDL file is uploaded, 
-			the appropriate	sequencer(s) process the file and extract and stores in the repository the structured information describing the types, 
+			the appropriate	sequencer(s) process the file and extract and store in the repository the structured information describing the types, 
 			message structures, operations, port types, bindings, and services found within the WSDL file.
 			When an XML Schema Document is uploaded, JBoss DNA can do the same for the schema's complex and simple types, element and attribute 
 			declarations, model groups, namespaces, imports, includes, annotations, etc.  And JBoss DNA can do the same for the various policy files,
@@ -69,7 +69,7 @@
 		</para>
 		<para>
 			Integration with a management system can be done in a similar manner.  A JBoss DNA connector could access the management system
-			to discover the servers and enable auto-discovery of the services, and "tag" the services deployments with the lifecycle phase 
+			to discover the servers and enable auto-discovery of the services, and "tag" the services' deployments with the lifecycle phase 
 			(dev, test, production, etc.). Plus, JBoss DNA sequencers can automatically process the uploaded artifacts to extract a useful
 			structured representation of their content, and can then store that additional information in the repository. So not only are
 			the original artifacts stored in the repository, but a structured representation of their content is also stored. And all of
@@ -117,7 +117,7 @@
 		<title>Configuration repository</title>
 		<para>
 			Many applications and libraries have configuration files that allow the users (or developers) to dictate the setup and behavior.
-			Often this involves multiple files in a specific structure on the file system.  But invalid or inopportune changes to these files
+			Often this involves multiple files in a specific structure on the file system.  Invalid or inopportune changes to these files
 			sometimes corrupt the environment, but creating a more robust configuration management system is often way beyond the desired
 			effort.
 		</para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -118,7 +118,7 @@
 			<itemizedlist>
 				<listitem>
 					<para><emphasis role="strong"><code>Loading from a file</code></emphasis> is conceptually the easiest and requires the least amount
-					of Java code, but it now requires a configuration file. More on that in a bit.</para>
+					of Java code, but it does require a configuration file. More on that in a bit.</para>
 				</listitem>
 				<listitem>
 					<para><emphasis role="strong"><code>Loading from a configuration repository</code></emphasis> is not much more complicated than loading
@@ -176,7 +176,8 @@
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
 	              <!--
 	              As a convenience, DNA defaults to granting guest users full access.  
-	              In a production system, you would want to limit this access by uncommenting one of the options below:
+	              In a production system, you would want to limit this access by uncommenting one of the 
+	              options below:
 	              
 	              for no access:
 	              <anonymousUserRoles jcr:PrimaryType="dna:option" dna:value="" />
@@ -188,11 +189,15 @@
 	      </dna:repository>
 	  </dna:repositories>
     <!-- 
-    Define the sources for the content.  These sources are directly accessible using the DNA-specific Graph API.
+    Define the sources for the content.  These sources are directly accessible using the DNA-specific 
+    Graph API.
     -->
     <dna:sources jcr:primaryType="nt:unstructured">
-        <dna:source jcr:name="Cars" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" dna:defaultWorkspaceName="workspace1"/>
-        <dna:source jcr:name="Aircraft" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+        <dna:source jcr:name="Cars" 
+                    dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" 
+                    dna:retryLimit="3" dna:defaultWorkspaceName="workspace1"/>
+        <dna:source jcr:name="Aircraft" 
+                    dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
             <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
             <defaultWorkspaceName>workspace2</defaultWorkspaceName>
         </dna:source>
@@ -201,17 +206,20 @@
     Define the sequencers. This is an optional section. 
     -->
     <dna:sequencers>
-        <dna:sequencer jcr:name="Image Sequencer" dna:classname="org.jboss.dna.sequencer.image.ImageMetadataSequencer">
+        <dna:sequencer jcr:name="Image Sequencer" 
+                       dna:classname="org.jboss.dna.sequencer.image.ImageMetadataSequencer">
             <dna:description>Image metadata sequencer</dna:description>        
             <dna:pathExpression>/foo/source => /foo/target</dna:pathExpression>
             <dna:pathExpression>/bar/source => /bar/target</dna:pathExpression>
         </dna:sequencer>
     </dna:sequencers>
     <!--
-	  Define how JBoss DNA will determine the MIME type of files. This is an optional section (and the default works pretty well).
+	  Define how JBoss DNA will determine the MIME type of files. This is an optional section 
+	  (and the default works pretty well).
     -->
     <dna:mimeTypeDetectors>
-        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
+        <dna:mimeTypeDetector jcr:name="Detector" 
+                              dna:description="Standard extension-based MIME type detector"/>
     </dna:mimeTypeDetectors>
 </configuration>]]></programlisting>
 		</sect2>
@@ -465,19 +473,14 @@
 				and then close the &Session;.  Here's an example of a JSP page that does this:
 			</para>
 <programlisting role="JAVA"><![CDATA[
-<%@ page import="
-	javax.naming.*,
-	javax.jcr.*,
-	org.jboss.security.config.IDTrustConfiguration
-	" %>
+<%@ page import="javax.naming.*, javax.jcr.*, org.jboss.security.config.IDTrustConfiguration" %>
 <%!
 
 static {
 	// Initialize IDTrust
-	String configFile = "security/jaas.conf.xml";
 	IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
 	try {
-	    idtrustConfig.config(configFile);
+	    idtrustConfig.config("security/jaas.conf.xml");
 	} catch (Exception ex) {
 	    throw new IllegalStateException(ex);
 	}
@@ -504,9 +507,7 @@
 				Since this uses a servlet container, there is no JAAS implementation configured, so note the 
 				loading of IDTrust to create the JAAS realm.  (To make this work in Tomcat, the security
 				folder that contains the <code>jaas.conf.xml</code>, <code>users.properties</code>, and
-				<code>roles.properties</code> needs to be moved into the <code>%CATALINA_HOME%</code> directory.
-				Moving the security folder into the <code>conf</code> directory did not allow those files
-				to be visible by the JSP page.)
+				<code>roles.properties</code> needs to be moved into the <code>%CATALINA_HOME%</code> directory.)
 			</para>
 			<note>
 				<para>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2010-01-10 15:56:55 UTC (rev 1584)
@@ -132,6 +132,7 @@
 
 <!ENTITY JBossCacheRepository			  	"<ulink url='&API;connector/jbosscache/JBossCacheRepository.html'><classname>JBossCacheRepository</classname></ulink>">
 <!ENTITY JBossCacheSource  						"<ulink url='&API;connector/jbosscache/JBossCacheSource.html'><classname>JBossCacheSource</classname></ulink>">
+<!ENTITY JdbcMetadataSource				  	"<ulink url='&API;connector/meta/jdbc/JdbcMetadataSource.html'><classname>JdbcMetadataSource</classname></ulink>">
 <!ENTITY ImageMetadataSequencer		  	"<ulink url='&API;sequencer/image/ImageMetadataSequencer.html'><classname>ImageMetadataSequencer</classname></ulink>">
 <!ENTITY ImageMetadata						  	"<ulink url='&API;sequencer/image/ImageMetadata.html'><classname>ImageMetadata</classname></ulink>">
 <!ENTITY ImageSequencerI18n				  	"<ulink url='&API;sequencer/image/ImageSequencerI18n.html'><classname>ImageSequencerI18n</classname></ulink>">

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 15:56:55 UTC (rev 1584)
@@ -164,12 +164,20 @@
 			</listitem>
 		</itemizedlist>
 		<para>As an example, consider that we want JBoss DNA to give us access through JCR to the schema information contained in a
-			relational databases.  We first have to develop a connector that allows us to interact with relational databases using JDBC.
-			That connector would contain a <code>JdbcRepositorySource</code> Java class that implements &RepositorySource;,
+			relational database.  We first have to develop a connector that allows us to interact with relational databases using JDBC.
+			That connector would contain a &JdbcMetadataSource; Java class that implements &RepositorySource;,
 			and that has all of the various JavaBean properties for setting the name of the driver class, URL, username, password,
-			and other properties.  (Or we might have a JavaBean property that defines the JNDI name where we can find a JDBC
-			<code>DataSource</code> instance pointing to our JDBC database.)
+			and other properties.  If we add a JavaBean property defining the JNDI name, our connector could look in JNDI to find a JDBC
+			<code>DataSource</code> instance, perhaps already configured to use connection pools.
 		</para>
+		<note>
+			<para>
+				Of course, before you develop a connector, you should probably check the
+				<ulink url="http://docs.jboss.org/jbossdna/latest/manuals/reference/html/provied-connectors-part.html">list of connectors</ulink> JBoss DNA already provides out of the box.
+				With this latest release, JBoss DNA already includes this JDBC metadata connector!  And we're always interested in new
+				connectors and new contributors, so please consider developing your custom connector as part of JBoss DNA.
+			</para>
+		</note>
 		<para>
 			Our new connector would also have a <code>JdbcRepositoryConnection</code> Java class that implements the 
 			&RepositoryConnection; interface.  This class would probably wrap a JDBC database connection,
@@ -180,8 +188,8 @@
 		</para>
 		<para>
 			To use our connector in an application that uses JBoss DNA, we need to create an instance of the 
-			<classname>JdbcRepositorySource</classname> for each database instance that we want to access.  If we have 3 MySQL databases, 
-			9 Oracle databases, and 4 PostgreSQL databases, then we'd need to create a total of 16 <classname>JdbcRepositorySource</classname> 
+			&JdbcMetadataSource; for each database instance that we want to access.  If we have 3 MySQL databases, 
+			9 Oracle databases, and 4 PostgreSQL databases, then we'd need to create a total of 16 &JdbcMetadataSource; 
 			instances, each with the properties describing a single database instance.  Those sources are then available for use by 
 			JBoss DNA components, including the <link linkend="jcr">JCR</link> implementation.
 		</para>
@@ -218,14 +226,24 @@
 		    <listitem>
 		      <para>
 						Implement the &RepositorySource; interface, using JavaBean properties for each bit of information the implementation will
-						need to establish a connection to the source system.
-					</para>
-		      <para>
-						Then, implement the &RepositoryConnection; interface with a class that represents a connection to the source.  The 
+						need to establish a connection to the source system. Then, implement the &RepositoryConnection; interface with 
+						a class that represents a connection to the source.  The 
 						<code>execute(&ExecutionContext;, &Request;)</code> method should process any and all requests that may come down the pike,
-						and the results of each request can be put directly on that request.
+						and the results of each request can be put directly on that request. This approach is pretty straightforward, and gives
+						you ultimate freedom in terms of your class structure.
 					</para>
 					<para>
+						Alternatively, an easier way to get a complete read-write connector would be to extend one of our two abstract
+						&RepositorySource; implementations. If the content your connector exposes has unique keys (such as a unique string,
+						UUID or other identifier), consider implementing &MapRepositorySource;, subclassing &MapRepository;, and
+						using the existing &MapRepositoryConnection; implementation.  This &MapRepositoryConnection; does most of the work
+						already, relying upon your &MapRepository; subclass for anything that might be source-specific. 
+						Or, if the content your connector exposes is simply path-based, consider implementing &PathRepositorySource;, 
+						subclassing &PathRepository;, and using the existing &PathRepositoryConnection; implementation.  
+						Again, &PathRepositoryConnection; class does almost all of the work and delegates to your &PathRepository;
+						subclass for anything that might be source-specific.
+					</para>
+					<para>
 						Don't forget unit tests that verify that the connector is doing what it's expected to do.  (If you'll be committing the connector
 						code to the JBoss DNA project, please ensure that the unit tests can be run by others that may not have access to the
 						source system.  In this case, consider writing integration tests that can be easily configured to use different sources

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 07:57:11 UTC (rev 1583)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 15:56:55 UTC (rev 1584)
@@ -137,6 +137,13 @@
 <!ENTITY RepositorySourceException		"<ulink url='&API;graph/connector/RepositorySourceException.html'><classname>RepositorySourceException</classname></ulink>">
 <!ENTITY InMemoryRepository			  		"<ulink url='&API;graph/connector/inmemory/InMemoryRepository.html'><classname>InMemoryRepository</classname></ulink>">
 <!ENTITY InMemoryRepositorySource  		"<ulink url='&API;graph/connector/inmemory/InMemoryRepositorySource.html'><classname>InMemoryRepositorySource</classname></ulink>">
+<!ENTITY PathRepositorySource  				"<ulink url='&API;graph/connector/path/PathRepositorySource.html'><classname>PathRepositorySource</classname></ulink>">
+<!ENTITY PathRepositoryConnection			"<ulink url='&API;graph/connector/path/PathRepositoryConnection.html'><classname>PathRepositoryConnection</classname></ulink>">
+<!ENTITY PathRepository			  				"<ulink url='&API;graph/connector/path/PathRepository.html'><classname>PathRepository</classname></ulink>">
+<!ENTITY MapRepositorySource  				"<ulink url='&API;graph/connector/map/MapRepositorySource.html'><classname>MapRepositorySource</classname></ulink>">
+<!ENTITY MapRepositoryConnection			"<ulink url='&API;graph/connector/map/MapRepositoryConnection.html'><classname>MapRepositoryConnection</classname></ulink>">
+<!ENTITY MapRepository			  				"<ulink url='&API;graph/connector/map/PathRepository.html'><classname>MapRepository</classname></ulink>">
+<!ENTITY InMemoryRepository			  		"<ulink url='&API;graph/connector/inmemory/InMemoryRepository.html'><classname>InMemoryRepository</classname></ulink>">
 <!ENTITY FederatedRepository			  	"<ulink url='&API;graph/connector/federation/FederatedRepository.html'><classname>FederatedRepository</classname></ulink>">
 <!ENTITY FederatedRepositorySource  	"<ulink url='&API;graph/connector/federation/FederatedRepositorySource.html'><classname>FederatedRepositorySource</classname></ulink>">
 <!ENTITY ForkRequestProcessor			  	"<ulink url='&API;graph/connector/federation/ForkRequestProcessor.html'><classname>ForkRequestProcessor</classname></ulink>">


From dna-commits at lists.jboss.org  Sun Jan 10 11:13:41 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 11:13:41 -0500
Subject: [dna-commits] DNA SVN: r1585 -
	trunk/docs/reference/src/main/docbook/en-US/content/core.
Message-ID: <201001101613.o0AGDf31024279@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 11:13:40 -0500 (Sun, 10 Jan 2010)
New Revision: 1585

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
Log:
Merge branch 'dna-621'

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 15:56:55 UTC (rev 1584)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 16:13:40 UTC (rev 1585)
@@ -237,11 +237,13 @@
 						&RepositorySource; implementations. If the content your connector exposes has unique keys (such as a unique string,
 						UUID or other identifier), consider implementing &MapRepositorySource;, subclassing &MapRepository;, and
 						using the existing &MapRepositoryConnection; implementation.  This &MapRepositoryConnection; does most of the work
-						already, relying upon your &MapRepository; subclass for anything that might be source-specific. 
+						already, relying upon your &MapRepository; subclass for anything that might be source-specific.
+						(See the <ulink url="&API;graph/connector/map/package-frame.html">JavaDoc</ulink> for details.)
 						Or, if the content your connector exposes is simply path-based, consider implementing &PathRepositorySource;, 
 						subclassing &PathRepository;, and using the existing &PathRepositoryConnection; implementation.  
 						Again, &PathRepositoryConnection; class does almost all of the work and delegates to your &PathRepository;
 						subclass for anything that might be source-specific.
+						(See the <ulink url="&API;graph/connector/path/package-frame.html">JavaDoc</ulink> for details.)
 					</para>
 					<para>
 						Don't forget unit tests that verify that the connector is doing what it's expected to do.  (If you'll be committing the connector


From dna-commits at lists.jboss.org  Sun Jan 10 11:16:32 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 11:16:32 -0500
Subject: [dna-commits] DNA SVN: r1586 -
	trunk/docs/reference/src/main/docbook/en-US/content/core.
Message-ID: <201001101616.o0AGGWGM024747@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 11:16:31 -0500 (Sun, 10 Jan 2010)
New Revision: 1586

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
Log:
Merge branch 'dna-621'

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 16:13:40 UTC (rev 1585)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 16:16:31 UTC (rev 1586)
@@ -238,12 +238,12 @@
 						UUID or other identifier), consider implementing &MapRepositorySource;, subclassing &MapRepository;, and
 						using the existing &MapRepositoryConnection; implementation.  This &MapRepositoryConnection; does most of the work
 						already, relying upon your &MapRepository; subclass for anything that might be source-specific.
-						(See the <ulink url="&API;graph/connector/map/package-frame.html">JavaDoc</ulink> for details.)
+						(See the <ulink url="&API;graph/connector/map/package-summary.html">JavaDoc</ulink> for details.)
 						Or, if the content your connector exposes is simply path-based, consider implementing &PathRepositorySource;, 
 						subclassing &PathRepository;, and using the existing &PathRepositoryConnection; implementation.  
 						Again, &PathRepositoryConnection; class does almost all of the work and delegates to your &PathRepository;
 						subclass for anything that might be source-specific.
-						(See the <ulink url="&API;graph/connector/path/package-frame.html">JavaDoc</ulink> for details.)
+						(See the <ulink url="&API;graph/connector/path/package-summary.html">JavaDoc</ulink> for details.)
 					</para>
 					<para>
 						Don't forget unit tests that verify that the connector is doing what it's expected to do.  (If you'll be committing the connector


From dna-commits at lists.jboss.org  Sun Jan 10 15:35:10 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 15:35:10 -0500
Subject: [dna-commits] DNA SVN: r1587 -
	trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn.
Message-ID: <201001102035.o0AKZAa7013633@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-10 15:35:10 -0500 (Sun, 10 Jan 2010)
New Revision: 1587

Modified:
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
Log:
Removed unused variable

Modified: trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-10 16:16:31 UTC (rev 1586)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SvnRepositorySource.java	2010-01-10 20:35:10 UTC (rev 1587)
@@ -60,7 +60,6 @@
     protected static final String SVN_REPOSITORY_ROOT_URL = "repositoryRootURL";
     protected static final String SVN_USERNAME = "username";
     protected static final String SVN_PASSWORD = "password";
-    protected static final String CACHE_TIME_TO_LIVE_IN_MILLISECONDS = "cacheTimeToLiveInMilliseconds";
     protected static final String RETRY_LIMIT = "retryLimit";
     protected static final String ROOT_NODE_UUID = "rootNodeUuid";
     protected static final String DEFAULT_WORKSPACE = "defaultWorkspace";


From dna-commits at lists.jboss.org  Sun Jan 10 18:32:54 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 18:32:54 -0500
Subject: [dna-commits] DNA SVN: r1588 - in
	trunk/docs/reference/src/main/docbook/en-US: content and 5
	other directories.
Message-ID: <201001102332.o0ANWspT019931@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 18:32:54 -0500 (Sun, 10 Jan 2010)
New Revision: 1588

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/infinispan.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
DNA-621 Applied Brian's patch (with one or two very minor modifications) for the Reference Guide.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -237,7 +237,7 @@
 <programlisting>
 /Vehicles => /                                  for source "Cars"
 /Vehicles/Aircraft => /Aviation                 for source "Aircraft"
-/Vehicles/Spacecraft => /Space Vehicles         for source "Cars"
+/Vehicles/Spacecraft => /Space Vehicles         for source "Spacecraft"
 </programlisting>
 		  <para>
 		  The result is a unified repository with the following structure:
@@ -436,7 +436,7 @@
 					We're using XML to represent a graph structure, since the two map pretty well.  Each XML element represents
 					a node and XML attributes represent properties on a node.  The name of the node is defined by either the 
 					<code>jcr:name</code> attribute (if it exists) or the name of the XML element.  And we use XML namespaces
-					to define the namespaces used in the node and property names.  BTW, this is exactly how the XML graph importer
+					to define the namespaces used in the node and property names.  As an aside, this is exactly how the XML graph importer
 					works.
 				</para>
 			</note>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -34,14 +34,14 @@
 		This connector exposes an area of the local file system as a graph of "nt:file" and "nt:folder" nodes. 
 		The connector can be configured so that the workspace name is either a path to the directory on the file system that represents the root of that
 		workspace <emphasis>or</emphasis> the name of subdirectory within a root directory (see the <code>workspaceRootPath</code> property below). Each 
-		connector can define whether it allows new workspaces can be created, but if so the names of the new workspaces
+		connector can define whether it allows new workspaces to be created, but if so the names of the new workspaces
 		must represent valid paths to existing directories.
 		<note>
 			<para>
 			The file nodes returned by this connector will have a primary type of <code>nt:file</code> and a child node named <code>jcr:content</code>.
 			The <code>jcr:content</code> node will have a primary type of <code>dna:resource</code>.  The <code>dna:resource</code> node type is equivalent
 			to the built-in <code>nt:resource</code> node type in all ways except one: it does not extend <code>mix:referenceable</code>.  This is because
-			DNA cannot assign a persistent UUID to the files in the file system or guarantee that no other process will not move or delete the files outside of DNA.
+			DNA cannot assign a persistent UUID to the files in the file system or guarantee that no other process will move or delete the files outside of DNA.
 			The <code>mix:referenceable</code> node type cannot be implemented if either of these conditions cannot be met.   
 
 			Additional properties (including mixin types) can be added by setting the <code>customPropertiesFactory</code> property to point to an implementation of 
@@ -65,29 +65,23 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>cachePolicy</entry>
+					<entry>Optional property that, if used, defines the cache policy for this repository source.  When not used, this source will not define a specific
+						duration for caching information.</entry>
 				</row>
 				<row>
-					<entry>updatesAllowed</entry>
-					<entry>Determines whether the content in the file system can be updated ("true"), or if the content may only be read ("false").
-						The default value is "false" to avoid unintentional security vulnerabilities.</entry>
+					<entry>creatingWorkspaceAllowed</entry>
+					<entry>Optional property that defines whether clients can create additional workspaces.  The default value is "true".
+					</entry>
 				</row>
 				<row>
-					<entry>cacheTimeToLiveInMilliseconds</entry>
-					<entry>Optional property that, if used, defines the maximum time in milliseconds that any information returned by this connector
-						is allowed to be cached before being considered invalid.  When not used, this source will not define a specific
-						duration for caching information.</entry>
-				</row>
-				<row>
 					<entry>defaultWorkspaceName</entry>
 					<entry>Optional property that is initialized to <code>"default"</code> and which defines the name for the workspace that will be used by default
 						if none is specified.</entry>
 				</row>
 				<row>
-					<entry>creatingWorkspaceAllowed</entry>
-					<entry>Optional property that defines whether clients can create additional workspaces.  The default value is "true".
-					</entry>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
 				</row>
 				<row>
 					<entry>predefinedWorkspaceNames</entry>
@@ -103,9 +97,14 @@
 				<row>
 					<entry>rootNodeUuid</entry>
 					<entry>Optional property that, if used, specifies the UUID that should be used for the root node of each workspace.  If no value is
-					specified, a random UUID is generated each time that the repository is started.</entry>
+					specified, a default UUID is used.</entry>
 				</row>	
 				<row>
+					<entry>updatesAllowed</entry>
+					<entry>Determines whether the content in the file system can be updated ("true"), or if the content may only be read ("false").
+						The default value is "false" to avoid unintentional security vulnerabilities.</entry>
+				</row>
+				<row>
 					<entry>workspaceRootPath</entry>
 					<entry>
 					<para>Optional property that, if used, specifies a path on the local file system to the root of all workspaces.  The source will will 

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -52,15 +52,26 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>defaultCachePolicy</entry>
+					<entry>Optional property that, if used, defines the default for how long this information provided by this source may to be 
+						cached by other, higher-level components.  The default value of null implies that this source does not define a specific
+						duration for caching information provided by this repository source.</entry>
 				</row>
 				<row>
+					<entry>defaultWorkspaceName</entry>
+					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
+						if none is specified.</entry>
+				</row>
+				<row>
 					<entry>jndiName</entry>
 					<entry>Optional property that, if used, specifies the name in JNDI where an &InMemoryRepository; instance can be found.
 						This is an advanced property that is infrequently used.</entry>
 				</row>
 				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
 					<entry>rootNodeUuid</entry>
 					<entry>Optional property that, if used, defines the UUID of the root node in the in-memory repository.  If not used,
 						then a new UUID is generated.</entry>
@@ -70,17 +81,6 @@
 					<entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
 						following a communication failure. The default value is '0'.</entry>
 				</row>
-				<row>
-					<entry>defaultCachePolicy</entry>
-					<entry>Optional property that, if used, defines the default for how long this information provided by this source may to be 
-						cached by other, higher-level components.  The default value of null implies that this source does not define a specific
-						duration for caching information provided by this repository source.</entry>
-				</row>
-				<row>
-					<entry>defaultWorkspaceName</entry>
-					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
-						if none is specified.</entry>
-				</row>
 			</tbody>
 		</tgroup>
 	</table>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/infinispan.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/infinispan.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/infinispan.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -33,8 +33,8 @@
   <para>
   	The Infinispan repository connector allows a <ulink url="http://www.jboss.org/infinispan/">Infinispan</ulink> instance to be 
 		used as a JBoss DNA (and thus JCR) repository.  This provides a way for the content in a repository to be stored in an
-		effective, scalable, and distributed data grid.  Like other connectors, this can be paired with other repository sources
-		to provide a local or <link linkend="federation-connector">federated</link> repository.
+		effective, scalable, and distributed data grid,
+		and can be <link linkend="federation-connector">federated</link> with other repository sources to provide a distributed repository.
   </para>
 	<para>
 		The &InfinispanSource; class provides a number of JavaBean properties that control its behavior:
@@ -52,10 +52,6 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
-				</row>
-				<row>
 					<entry>cacheManagerJndiName</entry>
 					<entry>Optional property that, if used, specifies the name in JNDI where an existing Infinispan Cache Manager instance can be found.
 						That factory would then be used if needed to create an Infinispan Cache instance.  If no value is provided, then the
@@ -78,6 +74,10 @@
 						if none is specified.</entry>
 				</row>
 				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
 					<entry>predefinedWorkspaceNames</entry>
 					<entry>Optional property that defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
 				</row>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -33,8 +33,7 @@
   <para>
   	The JBoss Cache repository connector allows a <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink> instance to be 
 		used as a JBoss DNA (and thus JCR) repository.  This provides a repository that is an effective, scalable, and distributed cache,
-		and is often paired with other repository sources to provide a local or <link linkend="federation-connector">federated</link>
-		repository.
+		and can be <link linkend="federation-connector">federated</link> with other repository sources to provide a distributed repository.
   </para>
 	<para>
 		The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
@@ -52,8 +51,9 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>cacheConfigurationName</entry>
+					<entry>Optional property that, if used, specifies the name of the configuration that is supplied to the cache factory
+						when creating a new JBoss Cache instance.</entry>
 				</row>
 				<row>
 					<entry>cacheFactoryJndiName</entry>
@@ -62,11 +62,6 @@
 						JBoss Cache <code>DefaultCacheFactory</code> class is used.</entry>
 				</row>
 				<row>
-					<entry>cacheConfigurationName</entry>
-					<entry>Optional property that, if used, specifies the name of the configuration that is supplied to the cache factory
-						when creating a new JBoss Cache instance.</entry>
-				</row>
-				<row>
 					<entry>cacheJndiName</entry>
 					<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache instance can be found.
 						This should be used if your application already has a cache that is used, or if you need to configure the cache in
@@ -88,6 +83,10 @@
 						if none is specified.</entry>
 				</row>
 				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
 					<entry>predefinedWorkspaceNames</entry>
 					<entry>Optional property that defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
 				</row>
@@ -102,15 +101,15 @@
 					specified, a random UUID is generated each time that the repository is started.</entry>
 				</row>	
 				<row>
-					<entry>uuidPropertyName</entry>
-					<entry>Optional property that, if used, defines the property that should be used to find the UUID value for each node
-						in the cache.  "<code>dna:uuid</code>" is the default.</entry>
-				</row>
-				<row>
 					<entry>updatesAllowed</entry>
 					<entry>Determines whether the content in the connector is can be updated ("true"), or if the content may only be read ("false").
 						The default value is "true".</entry>
 				</row>
+				<row>
+					<entry>uuidPropertyName</entry>
+					<entry>Optional property that, if used, defines the property that should be used to find the UUID value for each node
+						in the cache.  "<code>dna:uuid</code>" is the default.</entry>
+				</row>
 				
 			</tbody>
 		</tgroup>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -72,58 +72,50 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>cachePolicy</entry>
+					<entry>Optional property that, if used, defines the cache policy to use for this repository source.  When not used, this source will not define a specific
+						duration for caching information.
+					</entry>
 				</row>
 				<row>
-					<entry>rootNodeUuid</entry>
-					<entry>Optional property that, if used, defines the UUID of the root node in the repository.  If not used,
-						then a new UUID is generated.</entry>
-				</row>
-				<row>
-					<entry>nameOfDefaultWorkspace</entry>
-					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
-						if none is specified.</entry>
-				</row>
-				<row>
 					<entry>dataSourceJndiName</entry>
 					<entry>
 						The JNDI name of the JDBC DataSource instance that should be used.  If not specified, the other driver properties must be set.
 					</entry>
 				</row>
 				<row>
-					<entry>driverClassName</entry>
+					<entry>defaultCatalogName</entry>
 					<entry>
-						The name of the JDBC driver class.
-						This is not required if the DataSource is found in JNDI, but is required otherwise.
+						The name to use for the catalog name if the database does not support catalogs or the database has a catalog with the empty string
+						as a name.  The default value is "default".
 					</entry>
 				</row>
 				<row>
-					<entry>driverClassloaderName</entry>
+					<entry>defaultSchemaName</entry>
 					<entry>
-						The name of the <!-- link linkend="class_loader_factory" -->class loader or classpath<!--  /link --> that should be used to load the JDBC driver class.
-						This is not required if the DataSource is found in JNDI.
+						The name to use for the schema name if the database does not support schemas or the database has a schema with the empty string
+						as a name.  The default value is "default".
 					</entry>
 				</row>
 				<row>
-					<entry>url</entry>
+					<entry>driverClassloaderName</entry>
 					<entry>
-						The URL that should be used when creating JDBC connections using the JDBC driver class.
+						The name of the <!-- link linkend="class_loader_factory" -->class loader or classpath<!--  /link --> that should be used to load the JDBC driver class.
 						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 				<row>
-					<entry>username</entry>
+					<entry>driverClassName</entry>
 					<entry>
-						The username that should be used when creating JDBC connections using the JDBC driver class.
-						This is not required if the DataSource is found in JNDI.
+						The name of the JDBC driver class.
+						This is not required if the DataSource is found in JNDI, but is required otherwise.
 					</entry>
 				</row>
 				<row>
-					<entry>password</entry>
+					<entry>idleTimeInSecondsBeforeTestingConnections</entry>
 					<entry>
-						The password that should be used when creating JDBC connections using the JDBC driver class.  
-						This is not required if the DataSource is found in JNDI.
+						The number of seconds after a connection remains in the pool that the connection should be tested to ensure it is still valid.
+						The default is 180 seconds (or 3 minutes).
 					</entry>
 				</row>
 				<row>
@@ -134,13 +126,6 @@
 					</entry>
 				</row>
 				<row>
-					<entry>minimumConnectionsInPool</entry>
-					<entry>
-						The minimum number of connections that will be kept in the connection pool.
-						The default is "0".
-					</entry>
-				</row>
-				<row>
 					<entry>maximumConnectionIdleTimeInSeconds</entry>
 					<entry>
 						The maximum number of seconds that a connection should remain in the pool before being closed.
@@ -156,20 +141,38 @@
 					</entry>
 				</row>
 				<row>
-					<entry>numberOfConnectionsToAcquireAsNeeded</entry>
+					<entry>metadataCollectorClassName</entry>
 					<entry>
-						The number of connections that should be added to the pool when there are not enough to be used.
-						The default is "1".
+						The name of a custom class to use for metadata collection.  The class must implement the &MetadataCollector; interface.  If a null
+						value is specified for this property, a default &MetadataCollector; implementation will be used that relies on the &DatabaseMetaData;
+						provided by the JDBC driver for the connection.  This property is provided as a means for connecting to databases with a JDBC driver
+						that provides a non-standard &DatabaseMetaData; implementation or no &DatabaseMetaData; implementation at all. 
 					</entry>
 				</row>
 				<row>
-					<entry>idleTimeInSecondsBeforeTestingConnections</entry>
+					<entry>minimumConnectionsInPool</entry>
 					<entry>
-						The number of seconds after a connection remains in the pool that the connection should be tested to ensure it is still valid.
-						The default is 180 seconds (or 3 minutes).
+						The minimum number of connections that will be kept in the connection pool.
+						The default is "0".
 					</entry>
 				</row>
 				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
+					<entry>nameOfDefaultWorkspace</entry>
+					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
+						if none is specified.</entry>
+				</row>
+				<row>
+					<entry>numberOfConnectionsToAcquireAsNeeded</entry>
+					<entry>
+						The number of connections that should be added to the pool when there are not enough to be used.
+						The default is "1".
+					</entry>
+				</row>
+				<row>
 					<entry>retryLimit</entry>
 					<entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
 						following a communication failure. 
@@ -177,34 +180,29 @@
 					</entry>
 				</row>
 				<row>
-					<entry>cacheTimeToLiveInMilliseconds</entry>
-					<entry>Optional property that, if used, defines the maximum time in milliseconds that any information returned by this connector
-						is allowed to be cached before being considered invalid.  When not used, this source will not define a specific
-						duration for caching information.
-						The default value is "600000" milliseconds, or 10 minutes.
+					<entry>password</entry>
+					<entry>
+						The password that should be used when creating JDBC connections using the JDBC driver class.  
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 				<row>
-					<entry>defaultCatalogName</entry>
-					<entry>
-						The name to use for the catalog name if the database does not support catalogs or the database has a catalog with the empty string
-						as a name.  The default value is "default".
-					</entry>
+					<entry>rootNodeUuid</entry>
+					<entry>Optional property that, if used, defines the UUID of the root node in the repository.  If not used,
+						then a new UUID is generated.</entry>
 				</row>
 				<row>
-					<entry>defaultSchemaName</entry>
+					<entry>url</entry>
 					<entry>
-						The name to use for the schema name if the database does not support schemas or the database has a schema with the empty string
-						as a name.  The default value is "default".
+						The URL that should be used when creating JDBC connections using the JDBC driver class.
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 				<row>
-					<entry>metadataCollectorClassName</entry>
+					<entry>username</entry>
 					<entry>
-						The name of a custom class to use for metadata collection.  The class must implement the &MetadataCollector; interface.  If a null
-						value is specified for this property, a default &MetadataCollector; implementation will be used that relies on the &DatabaseMetaData;
-						provided by the JDBC driver for the connection.  This property is provided as a means for connecting to databases with a JDBC driver
-						that provides a non-standard &DatabaseMetaData; implementation or no &DatabaseMetaData; implementation at all. 
+						The username that should be used when creating JDBC connections using the JDBC driver class.
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 			</tbody>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -52,28 +52,41 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>autoGenerateSchema</entry>
+					<entry>
+			      Sets the Hibernate setting dictating what it does with the database schema upon first connection. Valid values are as
+			      follows (though the value is not checked):
+			      <itemizedlist>
+			      <listitem><para>"<code>create</code>" - Create the database schema objects when the &EntityManagerFactory; is created (actually
+			      when Hibernate's SessionFactory is created by the entity manager factory). If a file named "import.sql" exists in
+			      the root of the class path (e.g., '/import.sql') Hibernate will read and execute the SQL statements in this file after it
+			      has created the database objects. Note that Hibernate first delete all tables, constraints, or any other database object
+			      that is going to be created in the process of building the schema.</para></listitem>
+			      <listitem><para>"<code>create-drop</code>" - Same as "<code>create</code>", except that the schema will be dropped after the
+			      &EntityManagerFactory; is closed.</para></listitem>
+			      <listitem><para>"<code>update</code>" - Attempt to update the database structure to the current mapping (but does not read and invoke
+			      the SQL statements from "import.sql"). <emphasis>Use with caution.</emphasis></para></listitem>
+			      <listitem><para>"<code>validate</code>" - Validates the existing schema with the current entities configuration, but does not make any
+			      changes to the schema (and does not read and invoke the SQL statements from "import.sql"). This is often the proper setting
+			      to use in production, and thus this is the default value.</para></listitem>
+			      </itemizedlist>
+					</entry>
 				</row>
 				<row>
-					<entry>updatesAllowed</entry>
-					<entry>Determines whether the content in the database is can be updated ("true"), or if the content may only be read ("false").
-						The default value is "true".</entry>
+					<entry>cacheTimeToLiveInMilliseconds</entry>
+					<entry>Optional property that, if used, defines the maximum time in milliseconds that any information returned by this connector
+						is allowed to be cached before being considered invalid.  When not used, this source will not define a specific
+						duration for caching information.
+						The default value is "600000" milliseconds, or 10 minutes.
+					</entry>
 				</row>
 				<row>
-					<entry>rootNodeUuid</entry>
-					<entry>Optional property that, if used, defines the UUID of the root node in the repository.  If not used,
-						then a new UUID is generated.</entry>
-				</row>
-				<row>
-					<entry>nameOfDefaultWorkspace</entry>
-					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
-						if none is specified.</entry>
-				</row>
-				<row>
-					<entry>predefinedWorkspaceNames</entry>
-					<entry>Optional property that, if used, defines names of the workspaces that are predefined and need not be created before being used.
-						This can be coupled with a "false" value for the "creatingWorkspaceAllowed" property to allow only the use of only predefined workspaces.
+					<entry>compressData</entry>
+					<entry>
+						An advanced boolean property that dictates whether large binary and string values should be stored in a compressed form.  
+						This is enabled by default.  Setting this value only affects how new records are stored; records can always be read
+						regardless of the value of this setting.
+						The default value is "true".
 					</entry>
 				</row>
 				<row>
@@ -95,13 +108,6 @@
 					</entry>
 				</row>
 				<row>
-					<entry>driverClassName</entry>
-					<entry>
-						The name of the JDBC driver class.
-						This is not required if the DataSource is found in JNDI, but is required otherwise.
-					</entry>
-				</row>
-				<row>
 					<entry>driverClassloaderName</entry>
 					<entry>
 						The name of the <!-- link linkend="class_loader_factory" -->class loader or classpath<!--  /link --> that should be used to load the JDBC driver class.
@@ -109,24 +115,26 @@
 					</entry>
 				</row>
 				<row>
-					<entry>url</entry>
+					<entry>driverClassName</entry>
 					<entry>
-						The URL that should be used when creating JDBC connections using the JDBC driver class.
-						This is not required if the DataSource is found in JNDI.
+						The name of the JDBC driver class.
+						This is not required if the DataSource is found in JNDI, but is required otherwise.
 					</entry>
 				</row>
 				<row>
-					<entry>username</entry>
+					<entry>idleTimeInSecondsBeforeTestingConnections</entry>
 					<entry>
-						The username that should be used when creating JDBC connections using the JDBC driver class.
-						This is not required if the DataSource is found in JNDI.
+						The number of seconds after a connection remains in the pool that the connection should be tested to ensure it is still valid.
+						The default is 180 seconds (or 3 minutes).
 					</entry>
 				</row>
 				<row>
-					<entry>password</entry>
+					<entry>largeValueSizeInBytes</entry>
 					<entry>
-						The password that should be used when creating JDBC connections using the JDBC driver class.  
-						This is not required if the DataSource is found in JNDI.
+						An advanced boolean property that controls the size of property values at which they are considered to be "large values".  
+						Depending upon the model, large property values may be stored in a centralized area and keyed by a secure hash
+						of the value.  This is an space and performance optimization that stores each unique large value only once.
+						The default value is "1024" bytes, or 1 kilobyte.
 					</entry>
 				</row>
 				<row>
@@ -137,13 +145,6 @@
 					</entry>
 				</row>
 				<row>
-					<entry>minimumConnectionsInPool</entry>
-					<entry>
-						The minimum number of connections that will be kept in the connection pool.
-						The default is "0".
-					</entry>
-				</row>
-				<row>
 					<entry>maximumConnectionIdleTimeInSeconds</entry>
 					<entry>
 						The maximum number of seconds that a connection should remain in the pool before being closed.
@@ -159,6 +160,34 @@
 					</entry>
 				</row>
 				<row>
+					<entry>minimumConnectionsInPool</entry>
+					<entry>
+						The minimum number of connections that will be kept in the connection pool.
+						The default is "0".
+					</entry>
+				</row>
+				<row>
+					<entry>model</entry>
+					<entry>
+						An advanced property that dictates the type of storage schema that is used.  Currently, the only supported values are "Basic" and "Simple".  
+						The Basic model supports a read-only mode (q.v., the "updatesAllowed" property) and database-level
+						enforcement of referential integrity (q.v., the "referentialIntegrityEnforced" property above), but does not fully support all JCR functions.
+						As a result, the Simple model is now the default model, but DNA repositories that were created under the Basic model will continue to use
+						the "Basic" model regardless of the value of this property.  Repositories can be converted from the Basic model to the Simple model by exporting
+						them to an XML file as a system view through the JCR interface and then importing them into a new repository created with the model property set
+						to "Simple".
+					</entry>
+				</row>
+				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
+					<entry>nameOfDefaultWorkspace</entry>
+					<entry>Optional property that is initialized to an empty string and which defines the name for the workspace that will be used by default
+						if none is specified.</entry>
+				</row>
+				<row>
 					<entry>numberOfConnectionsToAcquireAsNeeded</entry>
 					<entry>
 						The number of connections that should be added to the pool when there are not enough to be used.
@@ -166,13 +195,19 @@
 					</entry>
 				</row>
 				<row>
-					<entry>idleTimeInSecondsBeforeTestingConnections</entry>
+					<entry>password</entry>
 					<entry>
-						The number of seconds after a connection remains in the pool that the connection should be tested to ensure it is still valid.
-						The default is 180 seconds (or 3 minutes).
+						The password that should be used when creating JDBC connections using the JDBC driver class.  
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 				<row>
+					<entry>predefinedWorkspaceNames</entry>
+					<entry>Optional property that, if used, defines names of the workspaces that are predefined and need not be created before being used.
+						This can be coupled with a "false" value for the "creatingWorkspaceAllowed" property to allow only the use of only predefined workspaces.
+					</entry>
+				</row>
+				<row>
 					<entry>referentialIntegrityEnforced (Basic Model Only)</entry>
 					<entry>
 						An advanced boolean property that dictates whether the database's referential integrity should be enabled, or false if this checking
@@ -183,71 +218,36 @@
 					</entry>
 				</row>
 				<row>
-					<entry>largeValueSizeInBytes</entry>
-					<entry>
-						An advanced boolean property that controls the size of property values at which they are considered to be "large values".  
-						Depending upon the model, large property values may be stored in a centralized area and keyed by a secure hash
-						of the value.  This is an space and performance optimization that stores each unique large value only once.
-						The default value is "1024" bytes, or 1 kilobyte.
+					<entry>retryLimit</entry>
+					<entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
+						following a communication failure. 
+						The default value is '0'.
 					</entry>
 				</row>
 				<row>
-					<entry>compressData</entry>
-					<entry>
-						An advanced boolean property that dictates whether large binary and string values should be stored in a compressed form.  
-						This is enabled by default.  Setting this value only affects how new records are stored; records can always be read
-						regardless of the value of this setting.
-						The default value is "true".
-					</entry>
+					<entry>rootNodeUuid</entry>
+					<entry>Optional property that, if used, defines the UUID of the root node in the repository.  If not used,
+						then a new UUID is generated.</entry>
 				</row>
 				<row>
-					<entry>model</entry>
-					<entry>
-						An advanced property that dictates the type of storage schema that is used.  Currently, the only supported values are "Basic" and "Simple".  
-						The Basic model supports a read-only mode (q.v., the "updatesAllowed" property) and database-level
-						enforcement of referential integrity (q.v., the "referentialIntegrityEnforced" property above), but does not fully support all JCR functions.
-						As a result, the Simple model is now the default model, but DNA repositories that were created under the Basic model will continue to use
-						the "Basic" model regardless of the value of this property.  Repositories can be converted from the Basic model to the Simple model by exporting
-						them to an XML file as a system view through the JCR interface and then importing them into a new repository created with the model property set
-						to "Simple".
-					</entry>
+					<entry>updatesAllowed</entry>
+					<entry>Determines whether the content in the database is can be updated ("true"), or if the content may only be read ("false").
+						The default value is "true".</entry>
 				</row>
 				<row>
-					<entry>autoGenerateSchema</entry>
+					<entry>url</entry>
 					<entry>
-			      Sets the Hibernate setting dictating what it does with the database schema upon first connection. Valid values are as
-			      follows (though the value is not checked):
-			      <itemizedlist>
-			      <listitem><para>"<code>create</code>" - Create the database schema objects when the &EntityManagerFactory; is created (actually
-			      when Hibernate's SessionFactory is created by the entity manager factory). If a file named "import.sql" exists in
-			      the root of the class path (e.g., '/import.sql') Hibernate will read and execute the SQL statements in this file after it
-			      has created the database objects. Note that Hibernate first delete all tables, constraints, or any other database object
-			      that is going to be created in the process of building the schema.</para></listitem>
-			      <listitem><para>"<code>create-drop</code>" - Same as "<code>create</code>", except that the schema will be dropped after the
-			      &EntityManagerFactory; is closed.</para></listitem>
-			      <listitem><para>"<code>update</code>" - Attempt to update the database structure to the current mapping (but does not read and invoke
-			      the SQL statements from "import.sql"). <emphasis>Use with caution.</emphasis></para></listitem>
-			      <listitem><para>"<code>validate</code>" - Validates the existing schema with the current entities configuration, but does not make any
-			      changes to the schema (and does not read and invoke the SQL statements from "import.sql"). This is often the proper setting
-			      to use in production, and thus this is the default value.</para></listitem>
-			      </itemizedlist>
+						The URL that should be used when creating JDBC connections using the JDBC driver class.
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
 				<row>
-					<entry>retryLimit</entry>
-					<entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
-						following a communication failure. 
-						The default value is '0'.
+					<entry>username</entry>
+					<entry>
+						The username that should be used when creating JDBC connections using the JDBC driver class.
+						This is not required if the DataSource is found in JNDI.
 					</entry>
 				</row>
-				<row>
-					<entry>cacheTimeToLiveInMilliseconds</entry>
-					<entry>Optional property that, if used, defines the maximum time in milliseconds that any information returned by this connector
-						is allowed to be cached before being considered invalid.  When not used, this source will not define a specific
-						duration for caching information.
-						The default value is "600000" milliseconds, or 10 minutes.
-					</entry>
-				</row>
 			</tbody>
 		</tgroup>
 	</table>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -31,7 +31,7 @@
 <chapter id="subversion-connector">
   <title>Subversion Connector</title>
   <para>
-		This connector provides read-only access to the directories and folders within a Subversion repository, providing that content in
+		This connector provides read and write access to the directories and folders within a Subversion repository, providing that content in
 		the form of <code>nt:file</code> and <code>nt:folder</code> nodes.
 		This source considers a workspace name to be the path to the directory on the repository's root directory location
 		that represents the root of that workspace (e.g., "trunk" or "branches"). 
@@ -53,22 +53,27 @@
 			</thead>
 			<tbody>
 				<row>
-					<entry>name</entry>
-					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+					<entry>cachePolicy</entry>
+					<entry>Optional property that, if used, defines the cache policy to use for caching information in the repository.  When not used, this source will not define a specific
+						duration for caching information.</entry>
 				</row>
 				<row>
-					<entry>repositoryRootURL</entry>
-					<entry>
-						Required property that should be set with the URL to the Subversion repository.
+					<entry>creatingWorkspaceAllowed</entry>
+					<entry>Optional property that defines whether clients can create additional workspaces.  The default value is "true".
 					</entry>
 				</row>
 				<row>
-					<entry>username</entry>
-					<entry>
-						The username that should be used to establish a connection to the repository.
+					<entry>defaultWorkspaceName</entry>
+					<entry>Optional property that, if used, specifies the name of the workspace to use when no workspace name is specified in an operation.
+						Each workspace name is treated as a path relative to the SVN repository being exposed (e.g., a workspace name of "trunk" will map 
+						to the URL "http://acme.com/repo/trunk" if the repository root URL is "http://acme.com/repo/").
 					</entry>
 				</row>
 				<row>
+					<entry>name</entry>
+					<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+				</row>
+				<row>
 					<entry>password</entry>
 					<entry>
 						The password that should be used to establish a connection to the repository.  This is not required if the URL represents an
@@ -76,22 +81,17 @@
 					</entry>
 				</row>
 				<row>
-					<entry>directoryForDefaultWorkspace</entry>
-					<entry>Optional property that, if used, specifies the relative path of the directory in the repository that should be
-						exposed as the default workspace.
-						Each workspace name is the URL of the portion of the SVN repository being exposed (e.g., "http://acme.com/repo/trunk").
-					</entry>
-				</row>
-				<row>
 					<entry>predefinedWorkspaceNames</entry>
 					<entry>Optional property that, if used, defines names of the workspaces that are predefined and need not be created before being used.
-						Each workspace name is the URL of the portion of the SVN repository being exposed (e.g., "http://acme.com/repo/trunk").
-						This can be coupled with a "fase" value for the "creatingWorkspaceAllowed" property to allow only the use of only predefined workspaces.
+						Each workspace name is treated as a path relative to the SVN repository being exposed (e.g., a workspace name of "trunk" will map 
+						to the URL "http://acme.com/repo/trunk" if the repository root URL is "http://acme.com/repo/").
+						This can be coupled with a "false" value for the "creatingWorkspaceAllowed" property to allow only the use of predefined workspaces.
 					</entry>
 				</row>
 				<row>
-					<entry>creatingWorkspaceAllowed</entry>
-					<entry>Optional property that defines whether clients can create additional workspaces.  The default value is "true".
+					<entry>repositoryRootURL</entry>
+					<entry>
+						Required property that should be set with the URL to the Subversion repository.
 					</entry>
 				</row>
 				<row>
@@ -100,10 +100,10 @@
 						following a communication failure. The default value is '0'.</entry>
 				</row>
 				<row>
-					<entry>cacheTimeToLiveInMilliseconds</entry>
-					<entry>Optional property that, if used, defines the maximum time in milliseconds that any information returned by this connector
-						is allowed to be cached before being considered invalid.  When not used, this source will not define a specific
-						duration for caching information.</entry>
+					<entry>username</entry>
+					<entry>
+						The username that should be used to establish a connection to the repository.
+					</entry>
 				</row>
 			</tbody>
 		</tgroup>
@@ -118,8 +118,8 @@
       .usingClass(SVNRepositorySource.class)
       .setDescription("The DNA SVN repository (anonymous access)")
       .setProperty("repositoryRootUrl", "http://anonsvn.jboss.org/repos/dna");
-      .setProperty("directoryForDefaultWorkspace", "http://anonsvn.jboss.org/repos/dna/trunk");
-      .setProperty("predefinedWorkspaceNames", new String[] {"http://anonsvn.jboss.org/repos/dna/trunk });
+      .setProperty("defaultWorkspaceName", "trunk");
+      .setProperty("predefinedWorkspaceNames", new String[] {"trunk });
  ]]></programlisting>
 	<para>
 		Another way to configure the Subversion connector is to create &JcrConfiguration; instance and load an XML configuration file that contains a repository source that 
@@ -145,8 +145,8 @@
                     dna:classname="org.jboss.dna.graph.connector.svn.SVNRepositorySource" 
                     dna:description="The DNA SVN repository (anonymous access)"
                     dna:repositoryRootUrl="http://anonsvn.jboss.org/repos/dna"
-                    dna:directoryForDefaultWorkspace="http://anonsvn.jboss.org/repos/dna/trunk"
-                    dna:predefinedWorkspaceNames="http://anonsvn.jboss.org/repos/dna/trunk"
+                    dna:defaultWorkspaceName="trunk"
+                    dna:predefinedWorkspaceNames="trunk"
                     dna:defaultWorkspaceName="default"/>    
     </dna:sources>
     

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -40,7 +40,7 @@
 		would break or have to change.  And copying the information means that we'd have to continually synchronize the changes.
 		This not only is a lot of work, but it often makes it difficult to know whether information is accurate and "the master" data.
 	</para>
-  <para>JBoss DNA lets us leave information where it, yet access it through the JCR API as if it were in one big repository.
+  <para>JBoss DNA lets us leave information where it is, yet access it through the JCR API as if it were in one big repository.
 		One major benefit is that existing applications that use the information in the original locations don't break, since they
 		can keep using the information. But now our JCR clients can also access all the information, too.  And if our federating JBoss DNA repository is
     configured to allow updates, JCR client applications can change the information in the repository and JBoss DNA will propagate
@@ -83,7 +83,7 @@
 				<para>a repository that accesses existing JDBC databases to project the schema structure as read-only repository content</para>
 			</listitem>
 			<listitem>
-				<para>a repository that accesses a file systems to present the files and directory structure as (updatable) repository content</para>
+				<para>a repository that accesses a file system to present its files and directory structure as (updatable) repository content</para>
 			</listitem>
 			<listitem>
 				<para>a repository that accesses an SVN repository to present the files and directory structure as (updatable) repository content</para>
@@ -163,9 +163,9 @@
 				</para>
 			</listitem>
 		</itemizedlist>
-		<para>As an example, consider that we want JBoss DNA to give us access through JCR to the schema information contained in a
+		<para>As an example, consider if we wanted JBoss DNA to give us access through JCR to the information contained in a
 			relational database.  We first have to develop a connector that allows us to interact with relational databases using JDBC.
-			That connector would contain a &JdbcMetadataSource; Java class that implements &RepositorySource;,
+			That connector would contain a <code>JdbcAccessSource</code> Java class that implements &RepositorySource;,
 			and that has all of the various JavaBean properties for setting the name of the driver class, URL, username, password,
 			and other properties.  If we add a JavaBean property defining the JNDI name, our connector could look in JNDI to find a JDBC
 			<code>DataSource</code> instance, perhaps already configured to use connection pools.
@@ -179,17 +179,17 @@
 			</para>
 		</note>
 		<para>
-			Our new connector would also have a <code>JdbcRepositoryConnection</code> Java class that implements the 
+			Our new connector might also have a <code>JdbcAccessConnection</code> Java class that implements the 
 			&RepositoryConnection; interface.  This class would probably wrap a JDBC database connection,
 			and would implement the <code>execute(...)</code> method such that the nodes exposed by the connector
-			describe the database schema of the database.  For example, the connector might represent each database table
+			describe the database tables and their contents.  For example, the connector might represent each database table
 			as a node with the table's name, with properties that describe the table (e.g., the description, whether it's a
-			temporary table), and with child nodes that represent each of the columns, keys and constraints.
+			temporary table), and with child nodes that represent rows in the table.
 		</para>
 		<para>
-			To use our connector in an application that uses JBoss DNA, we need to create an instance of the 
-			&JdbcMetadataSource; for each database instance that we want to access.  If we have 3 MySQL databases, 
-			9 Oracle databases, and 4 PostgreSQL databases, then we'd need to create a total of 16 &JdbcMetadataSource; 
+			To use our connector in an application that uses JBoss DNA, we would need to create an instance of the 
+			<code>JdbcAccessSource</code> for each database instance that we want to access.  If we have 3 MySQL databases, 
+			9 Oracle databases, and 4 PostgreSQL databases, then we'd need to create a total of 16 <code>JdbcAccessSource</code> 
 			instances, each with the properties describing a single database instance.  Those sources are then available for use by 
 			JBoss DNA components, including the <link linkend="jcr">JCR</link> implementation.
 		</para>
@@ -279,8 +279,7 @@
 	        and would like to help create it, please <link linkend="preface">join the community</link>.
 				</para>
 		    <para>In lieu of a Maven archetype, you may find it easier to start with a small existing connector project.
-					The <emphasis role="strong">dna-connector-filesystem</emphasis> project is small, but it may be tough to separate
-					the stuff that every connector needs from the extra code and data structures that manage the content.
+					The <emphasis role="strong">dna-connector-filesystem</emphasis> project is small and provides good example of implementing a path-based repository.
 		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-connector-filesystem/">&Subversion;trunk/extensions/dna-connector-filesystem/</ulink>
 		    </para>
 		  </note>
@@ -442,8 +441,14 @@
 					In summary, a connector has total control over whether and for how long the information it provides
 					is cached.
 				</para>
+				<note>
+					<para>
+						At this time, JBoss DNA does not yet take advantage of the connector's cache policies. 
+						However, it is anticipated that this will change.
+					</para>
+				</note>
 			</sect3>
-			<sect3 id="repository_source_jndi">
+ 			<sect3 id="repository_source_jndi">
 				<title>Leveraging JNDI</title>
 				<para>
 					Sometimes it is necessary (or easier) for a &RepositorySource; implementation to look up an object in JNDI.
@@ -516,9 +521,8 @@
 	    <programlisting>
 /**
  * A connection to a repository source.
- * <p>
+ *
  * These connections need not support concurrent operations by multiple threads.
- * </p>
  */
 @NotThreadSafe
 public interface &RepositoryConnection; {
@@ -574,18 +578,12 @@
 }</programlisting>
 			<para>
 				While most of these methods are straightforward, a few warrant additional information.
-				The <code>ping(...)</code> allows DNA to check the connection to see if it is
+				The <code>ping(...)</code> method allows DNA to check the connection to see if it is
 				alive.  This method can be used in a variety of situations, ranging from verifying that a &RepositorySource;'s
 				JavaBean properties are correct to ensuring that a connection is still alive before returning the connection from
 				a connection pool.
 			</para>
 	    <para>
-				If the connector is able to publish events, then 
-				DNA hasn't yet defined the event mechanism, so connectors don't have any methods to invoke on the &RepositorySourceListener;.
-				This will be defined in the next release, so feel free to manage the listeners now.  Note that by default the &RepositorySourceCapabilities; returns
-				<code>false</code> for <code>supportsEvents()</code>.
-			</para>
-	    <para>
 				The most important method on this interface, though, is the <code>execute(...)</code> method, which serves as the
 				mechanism by which the component using the connector access and manipulates the content exposed by the connector.
 				The first parameter to this method is the &ExecutionContext;, which contains the information about environment
@@ -599,11 +597,6 @@
 				where the connector places the results (or the error, if one occurs).
 			</para>
 	    <para>
-				Although there are over a dozen different kinds of requests, we do anticipate adding more in future releases.
-				For example, DNA will likely support searching repository content in sources through an additional subclass of &Request;.
-				Getting the version history for a node will likely be another kind of request added in an upcoming release.
-			</para>
-	    <para>
 				A connector is technically free to implement the <code>execute(...)</code> method in any way, as long as the semantics
 				are maintained.  But as discussed in the <link linkend="graph-request-processors">previous chapter</link>, JBoss DNA provides 
 				a &RequestProcessor; class that can simplify writing your own connector and at the
@@ -628,7 +621,7 @@
 				Also, make sure your &RequestProcessor; is properly <link linkend="connector_events">broadcasting the changes</link> made during execution.
 				The &RequestProcessor; class has a <code>recordChange(&ChangeRequest;)</code> that can be called from each of the <code>process(...)</code>
 				methods that take a &ChangeRequest;.  The &RequestProcessor; enqueues these requests, and when the &RequestProcessor; is
-				closed, the default implementation is to send a &Change; to the &Observer; supplied into the constructor.
+				closed, the default implementation is to send a &Changes; to the &Observer; supplied into the constructor.
 			</para>
 			<para>
 				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -37,7 +37,7 @@
 		and allows for a great deal of flexibility and customization in how the components are configured.  
   </para>
 	<para>
-		The approach that JBoss DNA takes is simple: a simple POJO that represents the everything about the environment
+		The approach that JBoss DNA takes is simple: a simple POJO that represents everything about the environment
 		in which components operate.  Called &ExecutionContext;, it contains references to most of the essential
 		facilities, including: security (authentication and authorization); namespace registry; name factories; factories 
 		for properties and property values; logging; and access to class loaders (given a classpath).  
@@ -182,7 +182,7 @@
 &ExecutionContext; myAppContext = context.with(mySecurityContext);
 </programlisting>
 		<para>
-			These &ExecutionContext; then represent the authenticated user in any component that uses the context.
+			These &ExecutionContext;s then represent the authenticated user in any component that uses the context.
 		</para>
 		<sect2 id="jaas_security">
 			<title>JAAS</title>
@@ -302,7 +302,7 @@
 &ExecutionContext; servletContext = context.with(securityContext);
 </programlisting>
 			<para>
-				We'll see later in the <link linkend="jcr">JCR chapter</link> how this can be use to obtain a JCR &Session; for
+				We'll see later in the <link linkend="jcr">JCR chapter</link> how this can be used to obtain a JCR &Session; for
 				the authenticated user.
 			</para>
 		</sect2>
@@ -411,7 +411,7 @@
 </programlisting>
 			<para>
 				JBoss DNA actually uses several implementations of &NamespaceRegistry;, but you can even implement your own
-				and create &ExecutionContext;s that uses it:
+				and create &ExecutionContext;s that use it:
 			</para>
 <programlisting>
 &NamespaceRegistry; myRegistry = ...
@@ -419,7 +419,7 @@
 </programlisting>
 	</sect1>
 	<sect1 id="class_loader_factory">
-		<title>Class loaders</title>
+		<title>Class Loaders</title>
 	  <para>
 	  	JBoss DNA is designed around extensions: sequencers, connectors, MIME type detectors, and class loader factories.
 			The core part of JBoss DNA is relatively small and has few dependencies, while many of the "interesting" components

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -57,7 +57,7 @@
 			names are a very important concept.
 		</para>
 		<para>
-			JBoss DNA names consist of a local part and are qualified with a namespaces.  The local part can consist of
+			JBoss DNA names consist of a local part that is qualified with a namespace.  The local part can consist of
 			any character, and the namespace is identified by a URI.  Namespaces were introduced in the
 			<link linkend="execution-context">previous chapter</link> and are managed by the &ExecutionContext;'s
 			<link linkend="namespace-registry">namespace registry</link>.  Namespaces help reduce the risk of
@@ -102,7 +102,7 @@
 		</para>
 		<para>
 			The factory for creating &Name; objects is called &NameFactory; and is available within the &ExecutionContext;, 
-			via the <code>getValueFactories()</code> method.  But before we see that, let's first discuss how names are represented as strings.
+			via the <code>getValueFactories()</code> method.  
 		</para>
 		<para>
 			We'll see how names are used later on, but one more point to make:  &Name; is both serializable and comparable,
@@ -351,7 +351,7 @@
 		</para>
 	</sect1>
 	<sect1 id="graph-value-factories">
-		<title>Values and value factories</title>
+		<title>Values and Value Factories</title>
 		<para>
 			JBoss DNA properties can hold a variety of value object types: strings, names, paths, 
 		  URIs, booleans, longs, doubles, decimals, binary content,	dates, UUIDs, references to other nodes, 
@@ -707,6 +707,11 @@
 						"&amp;amp;", '&amp;lt;', '&amp;gt;', '&amp;quot;', and '&amp;#039;'.
 					</para>
 				</listitem>
+				<listitem>
+					<para>The &FileNameEncoder; escapes characters that are not allowed in file names on Linux, OS X, or Windows XP. 
+						Unsafe characters are escaped as described in the &UrlEncoder;.
+					</para>
+				</listitem>
 			</itemizedlist>
 			All of these classes also implement the &TextDecoder; interface, which defines a method that
 			<emphasis>decodes</emphasis> an encoded string using the opposite transformation.
@@ -728,7 +733,7 @@
 		      <para>the &Path; to the node; or</para>
 		    </listitem>
 		    <listitem>
-		      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
+		      <para>one or more <emphasis>identification properties</emphasis> that are likely source-specific
 						and that are represented with &Property; objects; or</para>
 		    </listitem>
 		    <listitem>
@@ -804,7 +809,7 @@
 			The next few subsections describe how to use a &Graph; instance.
 		</para>
 		<sect2 id="graph-api-workspaces">
-			<title>Using workspaces</title>
+			<title>Using Workspaces</title>
 		<para>
 			JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis> that provide different views of the content.  Some graphs may have
 			one workspace, while others may have multiple workspaces.  Some graphs will allow a client to create new workspaces or destroy
@@ -880,7 +885,7 @@
 </programlisting>
     </sect2>
 		<sect2 id="graph_api_nodes">
-			<title>Working with nodes</title>
+			<title>Working with Nodes</title>
 		<para>
 			Now let's switch to working with nodes.  This first example returns a map of properties (keyed by property name) 
 			for a node at a specific &Path;:
@@ -1280,7 +1285,7 @@
 		</table>
     <para>
 			Although there are over a dozen different kinds of requests, we do anticipate adding more in future releases.
-			For example, DNA will likely support searching repository content in sources through an additional subclass of &Request;.
+			For example, DNA has recently added support for searching repository content in sources through an additional subclass of &Request;.
 			Getting the version history for a node will likely be another kind of request added in an upcoming release.
 		</para>
 		<para>
@@ -1320,7 +1325,7 @@
 		</para>
 		<para>
 			Many event frameworks define the listeners and sources as interfaces.  While this is often useful, it requires
-			the implementations properly address the thread-safe semantics of managing and calling the listeners.
+			that the implementations properly address the thread-safe semantics of managing and calling the listeners.
 			The JBoss DNA observation framework uses abstract or concrete classes to minimize the effort required for implementing
 			&ChangeObserver; or &Observable;. These abstract classes provide implementations for a number of
 			utility methods (such as the <code>unregister()</code> method on &ChangeObserver;) that
@@ -1391,8 +1396,8 @@
 		</sect2>
 		<para>
 			As we'll see in the <link linkend="connector-framework">next chapter</link>, each connector is responsible for propagating
-			the &ChangeRequest; objects to the connector's &Observer;.  But that's not the only use of &Observers;.
-			We'll also see later how the <link linkend="sequencing-framework">sequencing system</link> uses &Observers; to monitor
+			the &ChangeRequest; objects to the connector's &Observer;.  But that's not the only use of &Observer;s.
+			We'll also see later how the <link linkend="sequencing-framework">sequencing system</link> uses &Observer;s to monitor
 			for changes in the graph content to determine which, if any, sequencers should be run.  And, the
 			<link linkend="jcr">JCR implementation</link> also uses the observation framework to propagate those changes
 			to JCR clients.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -35,7 +35,7 @@
 		service definitions, policy files, images, media, documents, presentations, application components, 
 		reusable libraries, configuration files, application installations, databases schemas, management scripts, and so on.
 		Unlocking the information buried within	all of those files is what JBoss DNA sequencing is all about.  
-		As files are loaded into the repository, you JBoss DNA can automatically sequence these files to extract 
+		As files are loaded into the repository, you JBoss DNA instance can automatically sequence these files to extract 
 		from their content meaningful information that can be stored in the repository, where it can then be 
 		searched, accessed, and analyzed using the JCR API.
 	</para>
@@ -222,11 +222,11 @@
 					</row>
 				</thead>
 				<tbody>
-					<row><entry>/a/(b|c|d)</entry><entry>Match children of the top level node "<code>a</code>" that are named "<code>a</code>", 
-							 "<code>b</code>" or "<code>c</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
+					<row><entry>/a/(b|c|d)</entry><entry>Match children of the top level node "<code>a</code>" that are named "<code>b</code>", 
+							 "<code>c</code>" or "<code>d</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
 					<row><entry>/a/b[c/d]</entry><entry>Match node "<code>b</code>" child of the top level node "<code>a</code>", when node
 					     "<code>b</code>" has a child named "<code>c</code>", and "<code>c</code>" has a child named "<code>d</code>".
-							 Node "<code>b</code>" is the selected node, while nodes "<code>b</code>" and "<code>b</code>" are used as criteria but are not
+							 Node "<code>b</code>" is the selected node, while nodes "<code>c</code>" and "<code>d</code>" are used as criteria but are not
 							 selected.</entry></row>
 					<row><entry>/a(/(b|c|d|)/e)[f/g/@something]</entry><entry>Match node "<code>/a/b/e</code>", "<code>/a/c/e</code>", "<code>/a/d/e</code>",
 					     or "<code>/a/e</code>" when they also have a child "<code>f</code>" that itself has a child "<code>g</code>" with property
@@ -258,7 +258,7 @@
 		</para>
   </sect1>
   <sect1 id="sequencer-library">
-    <title>Out-of-the-box sequencers</title>
+    <title>Out-of-the-box Sequencers</title>
     <para>
     	A number of sequencers are already available in JBoss DNA, and are outlined in detail
       <link linkend="provied-sequencers-part">later in the document</link>.
@@ -267,8 +267,8 @@
     </para>
   </sect1>
   <sect1 id="custom-sequencers">
-	  <title>Creating custom sequencers</title>
-	  <para>The current release of JBoss DNA comes with six sequencers.  However, it's very easy to create your own
+	  <title>Creating Custom Sequencers</title>
+	  <para>The current release of JBoss DNA comes with eleven sequencers.  However, it's very easy to create your own
 	  sequencers and to then configure JBoss DNA to use them in your own application.
 	  </para>
 	  <para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -33,7 +33,7 @@
   <para>
   	The JBoss DNA project uses automated testing to verify that the software is doing what it's supposed to
 		and not doing what it shouldn't do.  These automated tests are run continuously and also act as regression tests,
-		ensuring that we known if any problems we find and fix reappear later.  All of our tests are executed as part of
+		ensuring that we know if any problems we find and fix reappear later.  All of our tests are executed as part of
 		our <link linkend="maven">Maven</link> build process, and the entire build process (including the tests)
 		is automatically run using <link linkend="hudson">Hudson</link> continuous integration system.
   </para>
@@ -51,7 +51,7 @@
 			they may rely upon the file resources included in the project, but these tests should require no external resources
 			(like databases or servers).  Note that our unit tests are run during the "test" phase of the standard
 			<ulink url="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">Maven lifecycle</ulink>.
-			This means that they are executed against the raw .class files created during complication.
+			This means that they are executed against the raw .class files created during compilation.
 		</para>
 		<para>
 			Developers are expected to run all of the JBoss DNA unit tests in their local environment before committing changes to SVN.
@@ -138,7 +138,7 @@
 			behavior.
 	  </para>
 	  <para>
-		  JBoss DNA has implemented all of the JCR Level 1 and Level 2 features, along with the optional locking and observation
+		  JBoss DNA has implemented almost all of the JCR Level 1 and Level 2 features, along with the optional locking and observation
 		  features. The only optional feature not implemented is versioning, and that will be coming soon.
 		</para>
 		<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -114,8 +114,8 @@
 				Why do we build using JDK 5 and not 6? The main reason is that if we were to use JDK 6, then JBoss DNA couldn't really be used in any
 				applications or projects that still used JDK 5.  Plus, anybody using JDK 6 can still use JBoss DNA.
 				However, considering that the end-of-life for Java 5 is 
-				<ulink url="http://java.sun.com/products/archive/eol.policy.html">October 2009</ulink>, we may be switching to 
-				Java 6 sometime in 2009.
+				<ulink url="http://java.sun.com/products/archive/eol.policy.html">October 2009</ulink>, we will likely be switching to 
+				Java 6 sometime in 2010.
 			</para>
 		</note>
 		<para>
@@ -152,7 +152,7 @@
 			<ulink url="http://www.jboss.org">JBoss.org</ulink>.  Although you can view the
 			<ulink url="&Subversion;trunk/">trunk</ulink> of the Subversion repository directly
 			(or using <ulink url="&Fisheye;trunk">FishEye</ulink>) through your browser,
-			it order to get more than just a few files of the latest version of the source code, you probably want
+			in order to get more than just a few files of the latest version of the source code, you probably want
 		 	to have an SVN client installed.  Several IDE's have SVN support included (or available as plugins),
 			but having the command-line SVN client is recommended.  See 
 			<ulink url="http://subversion.tigris.org/">http://subversion.tigris.org/</ulink> for downloads and instructions for your
@@ -352,7 +352,7 @@
 								"<code>oracle9i</code>", "<code>oracle10g</code>", "<code>oracle11g</code>", 
 								"<code>db2v8</code>", "<code>db2v9</code>", 
 								"<code>sybase15</code>", and 
-								"<code>mysql2005</code>".
+								"<code>mssql2005</code>".
 								The database connection information for these database profiles are in the parent "pom.xml" file,
 								and most of these are configured to use database instances within the JBoss Quality Assurance
 								lab and are accessible only to Red Hat employees.  However, feel free to add your own profiles
@@ -420,10 +420,8 @@
 		<title>Eclipse IDE</title>
 		<para>Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
 			it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
-			Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
-			it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
 		</para>
-		<para>We're using the latest released version of Eclipse (3.4, called "Ganymede"), 
+		<para>We're using the latest released version of Eclipse, 
 			available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>.  Simply follow the instructions for your platform.
 		</para>
 		<para>
@@ -497,7 +495,7 @@
 		<sect2 id="build-all-artifacts-and-assemblies">
 			<title>Building all artifacts and assemblies</title>
 			<para>
-				By default, the project's Maven build process is does <emphasis>not</emphasis> build the documentation, JavaDocs, or assemblies.
+				By default, the project's Maven build process does <emphasis>not</emphasis> build the documentation, JavaDocs, or assemblies.
 				These take extra time, and most of our builds don't require them.  So the first step of releasing JBoss DNA
 				is to use Maven to build all of regular artifacts (e.g., JARs) and these extra documents and assemblies.
 			</para>
@@ -615,10 +613,9 @@
 	<sect1>
 		<title>Summary</title>
 		<para>
-			In this chapter, we described the various aspects of developing code for the JBoss DNA project.  Before we start talking
-			about some of the details of JBoss DNA repositories, connectors, and sequencers, we'll first talk about
-			some very ubiquitous information: how does JBoss DNA load all of the extension classes?
-		  This is the topic of the <link linkend="classloaders">next chapter</link>.
+			In this chapter, we described the various aspects of developing code for the JBoss DNA project.  
+			Next, we must discuss the testing practices for JBoss DNA project.
+		  This is the topic of the <link linkend="testing">next chapter</link>.
 		</para>
 	</sect1>
 </chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -74,7 +74,7 @@
 		</para>
 		<para>
 			But these large and complex use cases aren't the only way to use a JBoss DNA repository.  You could use an embedded JBoss DNA repository
-			to manage configuration information for an application, or you could use JBoss DNA just provide a JCR interface on top of a few non-JCR systems.
+			to manage configuration information for an application, or you could use JBoss DNA just to provide a JCR interface on top of a few non-JCR systems.
 		</para>
 		<para>
 			The point is that JBoss DNA can be used in many different ways, ranging from the very tiny embedded repository to a large and distributed
@@ -102,7 +102,7 @@
 		<para>
 		What we want is <emphasis><link linkend="dna-connector-federation">federation</link></emphasis>.
 		We can connect to these back-end systems to dynamically access the content and project it into a single, unified
-		repository.  We can also cache it for faster access, as long as the cache can be invalidated based upon time or event.
+		repository.  We can cache it for faster access, as long as the cache can be invalidated based upon time or event.
 		But we also need to maintain a clear picture of where all the bits come from, so users can be sure they're looking
 		at the right information.  And we need to make it as easy as possible to write new connectors, since there are
 		a lot of systems out there that have information we want to federate.
@@ -145,8 +145,8 @@
 	  </para>
 	  <para>
 	    Another technique built into the Java language is
-	    <emphasis>Java serialization</emphasis>
-	    , which is capable of persisting the state of an object graph so that it can be read back in at a later time. However, Java
+	    <emphasis>Java serialization</emphasis>,
+	    which is capable of persisting the state of an object graph so that it can be read back in at a later time. However, Java
 	    serialization can quickly become tricky if the classes are changed, and so it's beneficial usually when the information is
 	    persisted for a very short period of time. For example, serialization is sometimes used to send an object graph from one
 	    process to another.  Using serialization for longer-term storage of information is more risky.
@@ -552,8 +552,8 @@
 			and <link linkend="subversion-connector">SVN connector</link> were reworked to support reads and updates, and they 
 			both offer a preview of an optional caching system.  The <link linkend="jdbc-storage-connector">JPA storage connector</link>
 			was dramatically improved and is significantly faster, more capable, and more efficient.
-			The new <link linkend="jdbc-metadata-connector">JDBC metadata connector</link> is a technology preview of a connector
-			that provides read-only access to the schema information of relational databases through JDBC.
+			The new <link linkend="jdbc-metadata-connector">JDBC metadata connector</link> provides read-only access to the schema 
+			information of relational databases through JDBC.
 		</para>
 		<para>
 			JBoss DNA 0.7 includes a number of new and improved sequencers. The new <link linkend="text-sequencer">text sequencer</link>
@@ -561,7 +561,7 @@
 			is capable of parsing a number of DDL dialects to extract the more important DDL statements. The <link linkend="cnd-sequencer">CND sequencer</link>
 			was rewritten and dramatically simplified to perform better, fix a number of known issues, and eliminate a dependency on a third-party library.
 			There is also a new <link linkend="java-class-sequencer">Java class file sequencer</link> that operates on Java class
-			files and produces output that is very similar to the <link linkend="java-source-sequencer">Java source file sequencer</link>,
+			files and produces output that is comparable to the <link linkend="java-source-sequencer">Java source file sequencer</link>,
 			and that can be used in conjunction with the <link linkend="zip-file-sequencer">ZIP file sequencer</link> to extract the Java metadata
 			from JARs, WARs, and EAR files.
 		</para>
@@ -571,7 +571,7 @@
 			<ulink url="http://jbossdna.blogspot.com/2009/09/running-tests-against-different-dbmses.html">running all of the tests against a variety
 		  of databases</ulink>, making it very easy to test against DBMSes that JBoss DNA doesn't directly test against.
 			A new DDL generation utility was also introduced that produces the DDL for the database used by the JPA connector.
-			And JCR repositories now support the use of <link linkend="jcr-guess-access">anonymous users</link>, and this is 
+			And JCR repositories now support the use of <link linkend="jcr-guess-access">anonymous users</link> - this is 
 			enabled by default but can easily be changed for production purposes.
 		</para>
   </sect1>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -140,7 +140,7 @@
 			Each of these approaches has their obvious advantages, so the choice of which one to use is entirely up to you.
 		</para>
 		<sect2 id="loading_from_file">
-			<title>Loading from a configuration file</title>
+			<title>Loading from a Configuration File</title>
 			<para>
 				Loading the JBoss DNA configuration from a file is actually very simple:
 			</para>
@@ -217,7 +217,7 @@
  ]]></programlisting>
 		</sect2>
 		<sect2 id="loading_from_repository">
-			<title>Loading from a configuration repository</title>
+			<title>Loading from a Configuration Repository</title>
 			<para>
 				Loading the JBoss DNA configuration from an existing repository is also pretty straightforward.  Simply create and configure the
 				&RepositorySource; instance to point to the desired repository, and then call the <code>loadFrom(&RepositorySource; source)</code>
@@ -246,7 +246,7 @@
 			</para>
 		</sect2>
 		<sect2 id="programmatic_configuration">
-			<title>Programmatic configuration</title>
+			<title>Programmatic Configuration</title>
 			<para>
 				Defining the configuration programmatically is not terribly complicated, and it for obvious reasons results in more verbose Java code.
 				But this approach is very useful and often the easiest approach when the configuration must change or is a reflection of other
@@ -257,7 +257,7 @@
 				components, especially when using an IDE with code completion.  Here are several examples:
 			</para>
 			<sect3 id="programmatically_configuring_sources">
-				<title>Repository sources</title>
+				<title>Repository Sources</title>
 				<para>Each repository source definition must include the name of the &RepositorySource; class as well as each bean property
 					that should be set on the object:
 				</para>
@@ -328,7 +328,7 @@
 					(loaded from the classpath), that is to sequence the "jcr:data" property on any new or changed nodes that are named 
 					"jcr:content" below a parent node	with a name ending in ".jpg", ".jpeg", ".gif", ".bmp", ".pcx", ".iff", ".ras", 
 					".pbm", ".pgm", ".ppm" or ".psd".  The output of the sequencing operation should be placed at the "/images/$1" node,
-					where the "$1" value is captured as the name of the parent node.  (The capture groups work the same was as regular expressions.)
+					where the "$1" value is captured as the name of the parent node.  (The capture groups work the same way as regular expressions.)
 					Of course, the class can be specified as Class reference or a string (followed by whether the class should be loaded from
 					the classpath or from a specific classpath).
 				</para>
@@ -341,7 +341,7 @@
 				</note>
 			</sect3>
 			<sect3 id="programmatically_configuring_mime_type_detectors">
-				<title>MIME type detectors</title>
+				<title>MIME Type Detectors</title>
 				<para>Each defined MIME type detector must specify the name of the &MimeTypeDetector; implementation class as well as any
 					other bean properties required by the implementation.</para> 
     		<programlisting role="JAVA"><![CDATA[
@@ -513,8 +513,8 @@
 				loading of IDTrust to create the JAAS realm.  (To make this work in Tomcat, the security
 				folder that contains the <code>jaas.conf.xml</code>, <code>users.properties</code>, and
 				<code>roles.properties</code> needs to be moved into the <code>%CATALINA_HOME%</code> directory.
-				Moving the security folder into the <code>conf</code> directory did not allow those files
-				to be visible by the JSP page.)
+				Moving the security folder into the <code>conf</code> directory does not allow those files
+				to be visible to the JSP page.)
 			</para>
 			<note>
 				<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -134,7 +134,7 @@
       </para>
 	  </sect2>
 		<sect2 id="jcr-sessions-custom">
-  		<title>Using Custom security</title>
+  		<title>Using Custom Security</title>
 			<para>
 		Not all applications can or want to use JAAS for their authentication system, so JBoss DNA provides a way to integrate your own custom
 		security provider.  The first step is to provide a custom implementation of &SecurityContext; that integrates with your application security, allowing
@@ -151,10 +151,6 @@
 			</programlisting>			
       Once the &Session; is obtained, the repository content can be accessed and modified like any other JCR repository.
 		</para>
-		<para>
-		  At this time, no roles are required to connect to any workspace, but restrictions on workspace connections will likely be added to JBoss DNA in the near future.  
-		  Please see the <link linkend="dna_jcr_security">JCR Security section</link> for more details on how access is controlled.
-		</para>
 	</sect2>
 		<sect2 id="jcr-sessions-servlet">
   		<title>Using HTTP Servlet security</title>
@@ -214,7 +210,7 @@
 		<sect2>
 			<title>Optional Features</title>
 			<para>
-				JBoss DNA does currently supports the optional JCR locking and observation features (though there still are
+				JBoss DNA does currently support the optional JCR locking and observation features (though there still are
 				a few known issues with our implementation of observation).
 				<note>
 					<para>
@@ -236,13 +232,13 @@
 			</para>
 			<para>
 				JBoss DNA has extended the set of JCR-defined actions ("add_node", "set_property", "remove", and "read") with additional actions ("register_type",  
-				"register_namespace", and "unlock_any").  The register_type and register_namespace permissions restrict the ability to register (and unregister) types and namespaces, respectively.
+				"register_namespace", and "unlock_any").  The register_type and register_namespace permissions restrict the ability to register (and unregister) node types and namespaces, respectively.
 				The unlock_any permission grants the user the ability to unlock any locked node or branch (as opposed to users without that permission who can only unlock nodes or branches that they 
 				have locked themselves or for which they hold the lock token).  
 				Permissions to perform these actions are aggregated in roles that can be assigned to users. 
 			</para>
 			<para>
-				JBoss DNA currently defines three roles: <code>READONLY</code>, <code>READWRITE</code>, and <code>ADMIN</code>.  If the &Credentials; passed into 
+				JBoss DNA currently defines three roles: <code>readonly</code>, <code>readwrite</code>, and <code>admin</code>.  If the &Credentials; passed into 
 				<code>Session.login(...)</code> (or the &Subject; from the &AccessControlContext;, if one of the no-credential <code>login</code> methods were used) have any of these roles, 
 				the session will have the corresponding access to all workspaces within the repository.  The mapping from the roles to the actions that they allow is provided below.
 				for any values of <code>path</code>.  
@@ -257,9 +253,9 @@
 			<thead>
 				<row>
 		  		<entry>Action Name</entry>
-		  		<entry>READONLY</entry>
-		  		<entry>READWRITE</entry>
-		  		<entry>ADMIN</entry>
+		  		<entry>readonly</entry>
+		  		<entry>readwrite</entry>
+		  		<entry>admin</entry>
 				</row>
 			</thead>
 			<tbody>
@@ -331,25 +327,25 @@
 			<tbody>
 				<row>
 					<entry>ROLE_NAME</entry>
-					<entry><code>READONLY</code>, <code>ADMIN</code></entry>
+					<entry><code>readonly</code>, <code>admin</code></entry>
 					<entry>Grants the named role to the assigned user on every workspace in any repository on the DNA server.</entry>
 				</row>
 				<row>
 					<entry>ROLE_NAME.REPOSITORY_NAME</entry>
-					<entry><code>READONLY.dna_repo</code>, <code>ADMIN.localRepository</code></entry>
+					<entry><code>readonly.dna_repo</code>, <code>admin.localRepository</code></entry>
 					<entry>Grants the named role to the assigned user on every workspace in the named repository on the DNA server.</entry>
 				</row>
 				<row>
 					<entry>ROLE_NAME.REPOSITORY_NAME.WORKSPACE_NAME</entry>
-					<entry><code>READONLY.dna_repo.jsmith</code>, <code>ADMIN.localRepository.default</code></entry>
+					<entry><code>readonly.dna_repo.jsmith</code>, <code>admin.localRepository.default</code></entry>
 					<entry>Grants the named role to the assigned user on the named workspace in the named repository on the DNA server.</entry>
 				</row>
 			</tbody>
 		</tgroup>
 	</table>			
 			<para>
-				It is also possible to grant more than one role to the same user.  For example, the user jsmith could be granted the roles READ_ONLY.production, READ_WRITE.production.jsmith,
-				and READ_WRITE.staging to allow read-only access to any workspace on a production repository, read/write access to a personal workspace on the same production repository,
+				It is also possible to grant more than one role to the same user.  For example, the user jsmith could be granted the roles readonly.production, readwrite.production.jsmith,
+				and readwrite.staging to allow read-only access to any workspace on a production repository, read/write access to a personal workspace on the same production repository,
 				and read/write access to any workspace in a staging repository.    
 			</para>
 			<para>
@@ -382,7 +378,7 @@
 				</note>
 			</para>
 			<para>
-				Although the JSR-283 specification is not yet final, it does provide a useful means of programmatically defining JCR node types.  JBoss DNA supports a comparable
+				The JSR-283 specification provides a useful means of programmatically defining JCR node types.  JBoss DNA supports a comparable
 				node type definition API that implements the functionality from the specification, albeit with interfaces in the <code>org.jboss.dna.jcr.nodetype</code> package.  
 				The intent is to deprecate these classes and replace their usage with the JSR-283 equivalents when JBoss DNA fully supports
 				the JSR-283 final adopted specification in a future release.
@@ -450,14 +446,24 @@
 &JcrNodeTypeManager; nodeTypeManager = (JcrNodeTypeManager) workspace.getNodeTypeManager();
 nodeTypeManager.registerNodeTypes(nodeTypeSource);
 </programlisting>
+
     The &CndNodeTypeSource; class actually implements the &JcrNodeTypeSource; interface, so other implementations can actually be defined.
     For more information, see the JavaDoc for &JcrNodeTypeSource;.
-				<note>
-					<para> JBoss DNA does not yet support a simple means of unregistering types at this time, so be careful before registering types outside of a 
-					sandboxed environment.
-					</para>
-				</note> 	
+			</para>
+			<para> 
+				JBoss DNA now supports a simple means of unregistering types, although it is not possible to unregister types that are
+				currently being used by nodes or as required primary types or supertypes of other types.  Unused node types can be unregistered 
+				with the following code:
+<programlisting>
+String unusedNodeTypeName = ...;
 
+&Session; session = ... ;
+// Obtain the DNA-specific node type manager ...
+&Workspace; workspace = session.getWorkspace();
+&JcrNodeTypeManager; nodeTypeManager = (JcrNodeTypeManager) workspace.getNodeTypeManager();
+nodeTypeManager.unregisterNodeType(Collections.singleton(unusedNodeTypeName));
+</programlisting>
+				
 			</para>
 		</sect2>
 	</sect1>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/query_and_search.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -33,12 +33,12 @@
   <para>
 	  The JCR API defines a way to query a repository for content that meets user-defined criteria. 
 	  The JCR API actually makes it possible for implementations to support multiple query languages,
-	  and the only language required by <ulink url="&JSR170;">JCR 1.0</ulink> is a subset of XPath. The 1.0 specification
+	  but the only language required by <ulink url="&JSR170;">JCR 1.0</ulink> is a subset of XPath. The 1.0 specification
 	  also defines a SQL-like query language, but supporting it is optional.
   </para>
 	<para>
-		JBoss DNA now support this query feature, including the required XPath language and two other languages not
-		defined by the specification. This chapter describes how your applications can use queries to search
+		JBoss DNA now supports this query feature, including the required XPath language and two other languages not
+		defined in the <ulink url="&JSR170;">JCR 1.0</ulink> specification. This chapter describes how your applications can use queries to search
 		your repositories, and defines the three query languages that are available with JBoss DNA.
 	</para>
   <sect1 id="jcr-query-api">	
@@ -46,7 +46,7 @@
 	  <para>
 			Like most operations in the JCR API, querying is done through a &Session; instance, from which can be obtained
 			the &QueryManager; that defines methods for creating &Query; objects, storing queries as &Node;s in the repository,
-			and reconstituting queries that were stored on &Nodes;s.  Thus, querying a repository generally follows this pattern:
+			and reconstituting queries that were stored on &Node;s.  Thus, querying a repository generally follows this pattern:
 		</para>
 <programlisting role="JAVA"><![CDATA[
 // Obtain the query manager for the session ...
@@ -101,7 +101,7 @@
 		  the "document view", adapting XPath to workspace content is quite natural.
 		</para>
 		<para>
-			An JCR XPath query specifies the subset of nodes in a workspace that satisfy the constraints defined in the query.
+			A JCR XPath query specifies the subset of nodes in a workspace that satisfy the constraints defined in the query.
 			Constraints can limit the nodes in the results to be those nodes with a specific (primary or mixin) node type,
 			with properties having particular values, or to be within a specific subtree of the workspace.
 			The query also defines how the nodes are to be returned in the result sets using column specifiers
@@ -229,7 +229,7 @@
 	    <title>Property Constraints</title>
 			<para>
 				JCR 1.0 specifies that attribute tests on the last location step is required, but that
-				predicate tests on any other location steps is optional.
+				predicate tests on any other location steps are optional.
 			</para>
 			<para>
 				JBoss DNA does support using attribute tests on the last location step to specify
@@ -536,14 +536,14 @@
         <listitem>
 	        <para>
 						Support for the <code>IN</code> and <code>NOT IN</code> clauses to more easily and concisely supply multiple
-						of discreet static operands.
+						of discrete static operands.
 						For example, "<code>WHERE ... [my:type].[prop1] IN (3,5,7,10,11,50) ...</code>".
 						For detail, see the <link linkend="jcr-sql2-set-constraints">grammar for set constraints</link>.
 	        </para>
         </listitem>
         <listitem>
 	        <para>
-						Support for the <code>BETWEEN</code> clause to more easily and concisely supply a range of discreet operands.
+						Support for the <code>BETWEEN</code> clause to more easily and concisely supply a range of discrete operands.
 						For example, "<code>WHERE ... [my:type].[prop1] BETWEEN 3 EXCLUSIVE AND 10 ...</code>".
 						For detail, see the <link linkend="jcr-sql2-between-constraints">grammar for between constraints</link>.
 	        </para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -73,7 +73,7 @@
 						<entry>Returns a list of available operations within the workspace</entry>
 						<entry>GET</entry>
 					</row>
-					<row>
+					<row>`
 						<entry>/resources/{repositoryName}/{workspaceName}/item/{path}</entry>
 						<entry>Accesses the item (node or property) at the path</entry>
 						<entry>ALL</entry>
@@ -271,6 +271,7 @@
 			The DNA REST server is deployed as a WAR and configured mostly through its web configuration file (web.xml).  
 			Here is an example web configuration that is used for integration testing of the DNA REST server along with
 			an explanation of its parts.
+		</para>
 <programlisting role="XML"><![CDATA[
 <?xml version="1.0"?>
 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
@@ -278,11 +279,13 @@
 <web-app>
   <display-name>JBoss DNA JCR RESTful Interface</display-name>
 ]]></programlisting>			 
+		<para>
 		This first section is largely boilerplate and should look familiar to anyone who has deployed a servlet-based
 		application before.  The display-name can be customized, of course.
 		</para>
 		<para>
 			The next stanza configures the <link linkend="jcr_rest_spi">repository provider</link>.
+		</para>
 <programlisting role="XML"><![CDATA[
   <!--
     This parameter provides the fully-qualified name of a class that implements
@@ -294,6 +297,7 @@
     <param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
   </context-param>
 ]]></programlisting>			 
+		<para>
 		As noted above, this parameter informs the &DnaJcrDeployer; of the specific repository provider in use.
 		Unless you are using the JBoss DNA REST server to connect to a different JCR implementation, this should
 		never change.
@@ -301,6 +305,7 @@
 
 		<para>
 			Next we configure the DNA &JcrEngine; itself.
+		</para>
 <programlisting role="XML"><![CDATA[
   <!--
     This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
@@ -313,6 +318,7 @@
     <param-value>/configRepository.xml</param-value>
   </context-param>
 ]]></programlisting>			 
+		<para>
 		If you are not familiar with the file format for a &JcrEngine; configuration file, you can build one 
 		programatically with the &JcrConfiguration; class and call <code>save(...)</code> instead of <code>build()</code>
 		to output the configuration file that equates to the configuration.
@@ -320,6 +326,7 @@
 
 		<para>
 			This is followed by a bit of RESTEasy and JAX-RS boilerplate.
+		</para>
 <programlisting role="XML"><![CDATA[
   <!--
     This parameter defines the JAX-RS application class, which is really just a metadata class
@@ -356,11 +363,13 @@
   </servlet-mapping>
 
 ]]></programlisting>			 
+		<para>
 		In general, this part of the web configuration file should not be modified.
 		</para>
 		
 		<para>
 			Finally, security must be configured for the REST server.
+		</para>
 <programlisting role="XML"><![CDATA[
   <!-- 
     The JBoss DNA REST implementation leverages the HTTP credentials to for authentication and authorization
@@ -401,6 +410,7 @@
 </web-app>
 
 ]]></programlisting>			 
+		<para>
 		As noted above, the REST server will not function properly unless security is configured.  All authorization
 		methods supported by the Servlet specification are supported by JBoss DNA and can be used interchangeable, as
 		long as authenticated users have the connect role listed above. 
@@ -418,10 +428,11 @@
 	  <para>
 	  		If you are using Maven to build your projects, the WAR can be built from a POM.  Here is a portion of the 
 	  		POM used to build the JBoss DNA REST Server integration subproject.
+		</para>
 <programlisting role='XML'><![CDATA[
 <project xmlns="http://maven.apache.org/POM/4.0.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<artifactId>dna</artifactId>
@@ -457,6 +468,7 @@
 </project>
 
 ]]></programlisting> 
+	  <para>
 		If you use this approach, make sure that web configuration file is in the <code>/src/main/webapp/WEB-INF</code>
 		directory.
 	  </para>
@@ -470,42 +482,45 @@
 	|	+ log4j.properties (Optional)
 	+ /lib
 	|	+ activation-1.1.jar
-	|	+ antlr-runtime-3.1.3.jar
 	|	+ commons-codec-1.2.jar
 	|	+ commons-httpclient-3.1.jar
 	|	+ commons-logging-1.0.4.jar
-	|	+ dna-cnd-0.6.jar
-	|	+ dna-common-0.6.jar
-	|	+ dna-connector-federation-0.6.jar
-	|	+ dna-graph-0.6.jar
-	|	+ dna-jcr-0.6.jar
-	|	+ dna-repository-0.6.jar
-	|	+ dna-web-jcr-rest-0.6.jar
-	|	+ FastInfoset-1.2.2.jar
-	|	+ google-collect-snapshot-20080530.jar
+	|	+ dna-cnd-0.7.jar
+	|	+ dna-common-0.7.jar
+	|	+ dna-graph-0.7.jar
+	|	+ dna-jcr-0.7.jar
+	|	+ dna-repository-0.7.jar
+	|	+ dna-search-lucene-0.7.jar
+	|	+ dna-web-jcr-rest-0.7.jar
+	|	+ google-collections-1.0-rc3.jar
 	|	+ hamcrest-core-1.1.jar
+	|	+ httpclient-4.0.jar
+	|	+ httpcore-4.0.1.jar
+	|	+ jakarta-regexp-1.4.jar
 	|	+ javassist-3.6.0.GA.jar
 	|	+ jaxb-api-2.1.jar
-	|	+ jaxb-impl-2.1.9.jar
-	|	+ jaxrs-api-1.1-RC2.jar
+	|	+ jaxb-impl-2.1.12.jar
+	|	+ jaxrs-api-1.2.1-GA.jar
 	|	+ jcip-annotations-1.0.jar
+	|	+ jcl-over-slf4j-1.5.8.jar
 	|	+ jcr-1.0.1.jar
-	|	+ jettison-1.0.1.jar
+	|	+ jettison-1.1.jar
 	|	+ joda-time-1.4.jar
 	|	+ jsr250-api-1.0.jar
 	|	+ junit-dep-4.4.jar
-	|	+ resteasy-client-1.0-beta-8.jar
-	|	+ resteasy-common-1.0-beta-8.jar
-	|	+ resteasy-jaxb-provider-1.1-RC2.jar
-	|	+ resteasy-jaxrs-1.1-RC2.jar
+	|	+ lucene-analyzers-3.0.0.jar
+	|	+ lucene-core-3.0.0.jar
+	|	+ lucene-regex-3.0.0.jar
+	|	+ lucene-snowball-3.0.0.jar
+	|	+ resteasy-jaxb-provider-1.2.1-GA.jar
+	|	+ resteasy-jettison-provider-1.2.1-GA.jar
 	|	+ scannotation-1.0.2.jar
 	|	+ servlet-api-2.5.jar
 	|	+ sjsxp-1.0.1.jar
-	|	+ slf4j-api-1.4.3.jar
-	|	+ slf4j-log4j12-1.4.3.jar
-	|	+ slf4j-simple-1.5.2.jar
+	|	+ slf4j-api-1.5.8.jar
+	|	+ slf4j-log4j12-1.5.8.jar
+	|	+ slf4j-simple-1.5.8.jar
 	|	+ stax-api-1.0-2.jar
-	|	+ webserver-1.3.3.jar
 	+ web.xml
 			
 </programlisting>	  	
@@ -634,8 +649,8 @@
             ]]></programlisting>
         </para>
         <para>
-            Results of successfully executing the above code is a JCR folder node (<code>nt:folder</code>) for each segment of the 
-            workspace path (a node is created if it doesn't already exist). Also, a JCR file node (a node with primary type <code>nt:file</code>) is 
+            Successfully executing the above code results in the creation a JCR folder node (<code>nt:folder</code>) for each segment of the 
+            workspace path (if the folder didn't already exist). Also, a JCR file node (a node with primary type <code>nt:file</code>) is 
             created or updated under the last folder node and the file contents are encoded and uploaded into a child node of that file node.
         </para>
     </sect1>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -38,7 +38,8 @@
   
   <para>
   	This sequencer can be added to the repository configuration like so:
-<programlisting role="JAVA"><![CDATA[
+  </para>
+  <programlisting role="JAVA"><![CDATA[
 JcrConfiguration config = ...
 
 config.sequencer("CND Sequencer")
@@ -48,5 +49,4 @@
       .sequencingFrom("//(*.cnd[*])/jcr:content[@jcr:data]")
       .andOutputtingTo("/nodeTypes/$1");
 ]]></programlisting>  	 
-  </para>
 </chapter>
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/ddl.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -37,7 +37,7 @@
 				to their grammar, and thus require dialect-specific additions to the graph structure.
 		</para>
 		<para>
-			  The sequencer is designed to behave as smart as possible with as little configuration. Thus, the sequencer
+			  The sequencer is designed to behave as intelligently as possible with as little configuration. Thus, the sequencer
 			  automatically determines the dialect used by a given DDL stream. This can be tricky, of course, since most dialects
 			  are very similar and the distinguishing features of a dialect may only be apparent in some of the statements.
 		</para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_class.xml	2010-01-10 23:32:54 UTC (rev 1588)
@@ -106,7 +106,7 @@
 				    <class:annotation jcr:name="AnnotationNameN"/>
 			    </class:method>
 		    </class:methods>
-		    <class:fields jcr:name="class:field">
+		    <class:fields jcr:name="class:fields">
 			    <class:field jcr:name="fieldName">
 				    <class:annotation jcr:name="AnnotationName1"/>
 				    ...

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 20:35:10 UTC (rev 1587)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2010-01-10 23:32:54 UTC (rev 1588)
@@ -92,6 +92,7 @@
 <!ENTITY UrlEncoder				       			"<ulink url='&API;common/text/Jsr283Encoder.html'><classname>UrlEncoder</classname></ulink>">
 <!ENTITY XmlNameEncoder				       	"<ulink url='&API;common/text/Jsr283Encoder.html'><classname>XmlNameEncoder</classname></ulink>">
 <!ENTITY XmlValueEncoder				      "<ulink url='&API;common/text/XmlValueEncoder.html'><classname>XmlValueEncoder</classname></ulink>">
+<!ENTITY FileNameEncoder				      "<ulink url='&API;common/text/FileNameEncoder.html'><classname>FileNameEncoder</classname></ulink>">
 <!ENTITY Problem								      "<ulink url='&API;common/collection/Problem.html'><interface>Problem</interface></ulink>">
 <!ENTITY Problems								      "<ulink url='&API;common/collection/Problems.html'><interface>Problems</interface></ulink>">
 
@@ -172,12 +173,13 @@
 <!ENTITY MimeTypeDetector					  	"<ulink url='&API;graph/mimetype/MimeTypeDetector.html'><interface>MimeTypeDetector</interface></ulink>">
 <!ENTITY MockSequencerOutput		    	"<ulink url='&API;graph/sequencer/MockSequencerOutput.html'><interface>MockSequencerOutput</interface></ulink>">
 <!ENTITY MockSequencerContext		    	"<ulink url='&API;graph/sequencer/MockSequencerContext.html'><interface>MockSequencerContext</interface></ulink>">
-<!ENTITY Observer											"<ulink url='&API;graph/observer/Observer.html'><interface>Observer</interface></ulink>">
-<!ENTITY Observable										"<ulink url='&API;graph/observer/Observable.html'><interface>Observable</interface></ulink>">
-<!ENTITY ChangeObserver								"<ulink url='&API;graph/observer/ChangeObserver.html'><classname>ChangeObserver</classname></ulink>">
-<!ENTITY NetChangeObserver						"<ulink url='&API;graph/observer/NetChangeObserver.html'><classname>NetChangeObserver</classname></ulink>">
-<!ENTITY ChangeObservers							"<ulink url='&API;graph/observer/ChangeObservers.html'><classname>ChangeObservers</classname></ulink>">
-<!ENTITY Changes											"<ulink url='&API;graph/observer/Changes.html'><classname>Changes</classname></ulink>">
+<!ENTITY Observer											"<ulink url='&API;graph/observe/Observer.html'><interface>Observer</interface></ulink>">
+<!ENTITY Observable										"<ulink url='&API;graph/observe/Observable.html'><interface>Observable</interface></ulink>">
+<!ENTITY ChangeObserver								"<ulink url='&API;graph/observe/ChangeObserver.html'><classname>ChangeObserver</classname></ulink>">
+<!ENTITY NetChange						"<ulink url='&API;graph/observe/NetChange.html'><classname>NetChange</classname></ulink>">
+<!ENTITY NetChangeObserver						"<ulink url='&API;graph/observe/NetChangeObserver.html'><classname>NetChangeObserver</classname></ulink>">
+<!ENTITY ChangeObservers							"<ulink url='&API;graph/observe/ChangeObservers.html'><classname>ChangeObservers</classname></ulink>">
+<!ENTITY Changes											"<ulink url='&API;graph/observe/Changes.html'><classname>Changes</classname></ulink>">
 <!ENTITY SearchEngine									"<ulink url='&API;graph/search/SearchEngine.html'><interface>SearchEngine</interface></ulink>">
 
 <!-- Types in dna-repository -->


From dna-commits at lists.jboss.org  Sun Jan 10 19:26:34 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 19:26:34 -0500
Subject: [dna-commits] DNA SVN: r1589 - in trunk:
	extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile
	and 1 other directories.
Message-ID: <201001110026.o0B0QYEb002565@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-10 19:26:34 -0500 (Sun, 10 Jan 2010)
New Revision: 1589

Modified:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java
   trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
   trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd
Log:
DNA-62 Sequence Java class files to extract the class structure with annotations

Applied patch that adds a sequencedDate to the class output.

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	2010-01-10 23:32:54 UTC (rev 1588)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	2010-01-11 00:26:34 UTC (rev 1589)
@@ -341,6 +341,7 @@
 
 [class:class]
 - class:name (string) mandatory 
+- class:sequencedDate (date) 
 - class:superClassName (string) 
 - class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
 - class:abstract (boolean) mandatory

Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	2010-01-10 23:32:54 UTC (rev 1588)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencer.java	2010-01-11 00:26:34 UTC (rev 1589)
@@ -24,14 +24,14 @@
 package org.jboss.dna.sequencer.classfile;
 
 import java.io.InputStream;
-import net.jcip.annotations.Immutable;
+import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.graph.sequencer.SequencerOutput;
 import org.jboss.dna.graph.sequencer.StreamSequencer;
 import org.jboss.dna.graph.sequencer.StreamSequencerContext;
 import org.jboss.dna.sequencer.classfile.metadata.ClassFileMetadataReader;
 import org.jboss.dna.sequencer.classfile.metadata.ClassMetadata;
 
- at Immutable
+ at ThreadSafe
 public class ClassFileSequencer implements StreamSequencer {
 
     private static final ClassFileRecorder DEFAULT_CLASS_FILE_RECORDER = new DefaultClassFileRecorder();

Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java	2010-01-10 23:32:54 UTC (rev 1588)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/ClassFileSequencerLexicon.java	2010-01-11 00:26:34 UTC (rev 1589)
@@ -55,6 +55,7 @@
     public static final Name NATIVE = new BasicName(Namespace.URI, "native");
     public static final Name PARAMETERS = new BasicName(Namespace.URI, "parameters");
     public static final Name RETURN_TYPE_CLASS_NAME = new BasicName(Namespace.URI, "returnTypeClassName");
+    public static final Name SEQUENCED_DATE = new BasicName(Namespace.URI, "sequencedDate");
     public static final Name STATIC = new BasicName(Namespace.URI, "static");
     public static final Name STRICT_FP = new BasicName(Namespace.URI, "strictFp");
     public static final Name SUPER_CLASS_NAME = new BasicName(Namespace.URI, "superClassName");

Modified: trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	2010-01-10 23:32:54 UTC (rev 1588)
+++ trunk/extensions/dna-sequencer-classfile/src/main/java/org/jboss/dna/sequencer/classfile/DefaultClassFileRecorder.java	2010-01-11 00:26:34 UTC (rev 1589)
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Map;
 import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.property.DateTimeFactory;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.Path.Segment;
@@ -45,11 +46,16 @@
                              ClassMetadata classMetadata ) {
 
         PathFactory pathFactory = pathFactoryFor(context);
+        DateTimeFactory dateFactory = dateFactoryFor(context);
         Path classPath = pathFor(pathFactory, classMetadata);
 
-        writeClassNode(output, pathFactory, classPath, classMetadata);
+        writeClassNode(output, pathFactory, dateFactory, classPath, classMetadata);
     }
 
+    private DateTimeFactory dateFactoryFor( StreamSequencerContext context ) {
+        return context.getValueFactories().getDateFactory();
+    }
+
     private PathFactory pathFactoryFor( StreamSequencerContext context ) {
         return context.getValueFactories().getPathFactory();
     }
@@ -67,6 +73,7 @@
 
     private void writeClassNode( SequencerOutput output,
                                  PathFactory pathFactory,
+                                 DateTimeFactory dateFactory,
                                  Path classPath,
                                  ClassMetadata cmd ) {
 
@@ -86,6 +93,7 @@
          */
 
         output.setProperty(classPath, ClassFileSequencerLexicon.NAME, cmd.getClassName());
+        output.setProperty(classPath, ClassFileSequencerLexicon.SEQUENCED_DATE, dateFactory.create());
         output.setProperty(classPath, ClassFileSequencerLexicon.SUPER_CLASS_NAME, cmd.getSuperclassName());
         output.setProperty(classPath, ClassFileSequencerLexicon.VISIBILITY, cmd.getVisibility().getDescription());
         output.setProperty(classPath, ClassFileSequencerLexicon.ABSTRACT, cmd.isAbstract());

Modified: trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd
===================================================================
--- trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd	2010-01-10 23:32:54 UTC (rev 1588)
+++ trunk/extensions/dna-sequencer-classfile/src/main/resources/org/jboss/dna/sequencer/classfile/sequencer-classfile.cnd	2010-01-11 00:26:34 UTC (rev 1589)
@@ -74,7 +74,8 @@
 + * (class:method) = class:method
 
 [class:class]
-- class:name (string) mandatory 
+- class:name (string) mandatory
+- class:sequencedDate (date) 
 - class:superClassName (string) 
 - class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
 - class:abstract (boolean) mandatory


From dna-commits at lists.jboss.org  Sun Jan 10 20:21:33 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 20:21:33 -0500
Subject: [dna-commits] DNA SVN: r1590 -
	trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic.
Message-ID: <201001110121.o0B1LXcf014008@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2010-01-10 20:21:32 -0500 (Sun, 10 Jan 2010)
New Revision: 1590

Modified:
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
Log:
DNA-644 BasicJpaRepositoryTckTest has failures related to XPath queries

Applied patch that makes BasicRequestProcessor.process(CreateNodeRequest) call recordChange(request) after successful node additions. If recordChange(...) isn't called, the SearchEngineIndexer is never made aware of the change and the node will not be added to the indexes or returned as a search result. Adding this line makes all 5 failing tests pass. I reviewed the rest of the class, but could not find any other places where this call was missing.

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2010-01-11 00:26:34 UTC (rev 1589)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2010-01-11 01:21:32 UTC (rev 1590)
@@ -260,6 +260,7 @@
                                 createProperties(workspace, uuidString, request.properties());
                             }
                             request.setActualLocationOfNode(childLocation);
+                            recordChange(request);
                             return;
                         }
                     }
@@ -306,6 +307,7 @@
             return;
         }
         request.setActualLocationOfNode(actualLocation);
+        recordChange(request);
     }
 
     /**


From dna-commits at lists.jboss.org  Sun Jan 10 21:18:28 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 10 Jan 2010 21:18:28 -0500
Subject: [dna-commits] DNA SVN: r1591 - in trunk:
	extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene
	and 1 other directory.
Message-ID: <201001110218.o0B2ISRe023903@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-10 21:18:28 -0500 (Sun, 10 Jan 2010)
New Revision: 1591

Modified:
   trunk/dna-jcr/src/test/resources/log4j.properties
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/AbstractLuceneSearchEngine.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchProcessor.java
   trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
DNA-644 Added TRACE-level logging to several dna-search-lucene classes to help debug what content is being added to and removed from the Lucene indexes. I tried to make the message very easy to read, especially as there is one line per add, per delete, and per commit or rollback. Also added a fragment to the 'dna-jcr' project's log4j.properties file used in the test cases that will turn on this logging, though this is commented out by default.

Modified: trunk/dna-jcr/src/test/resources/log4j.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/log4j.properties	2010-01-11 01:21:32 UTC (rev 1590)
+++ trunk/dna-jcr/src/test/resources/log4j.properties	2010-01-11 02:18:28 UTC (rev 1591)
@@ -10,3 +10,6 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
+# This line turns on TRACING messages in the LuceneSearchIndex, which show which
+# operations are being performed on the index (including the data going into the index) ...
+#log4j.logger.org.jboss.dna.search.lucene=TRACE

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/AbstractLuceneSearchEngine.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/AbstractLuceneSearchEngine.java	2010-01-11 01:21:32 UTC (rev 1590)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/AbstractLuceneSearchEngine.java	2010-01-11 02:18:28 UTC (rev 1591)
@@ -42,6 +42,7 @@
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.jboss.dna.common.collection.SimpleProblems;
+import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.GraphI18n;
@@ -151,6 +152,7 @@
         protected final TypeSystem typeSystem;
         protected final PropertyFactory propertyFactory;
         protected final Workspaces<WorkspaceType> workspaces;
+        protected final Logger logger = Logger.getLogger(getClass());
 
         protected AbstractLuceneProcessor( String sourceName,
                                            ExecutionContext context,

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchProcessor.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchProcessor.java	2010-01-11 01:21:32 UTC (rev 1590)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchProcessor.java	2010-01-11 02:18:28 UTC (rev 1591)
@@ -68,6 +68,7 @@
 public class LuceneSearchProcessor extends AbstractLuceneProcessor<LuceneSearchWorkspace, LuceneSearchSession> {
 
     protected static final Columns FULL_TEXT_RESULT_COLUMNS = new FullTextSearchResultColumns();
+    private final Logger logger = Logger.getLogger(getClass());
 
     protected LuceneSearchProcessor( String sourceName,
                                      ExecutionContext context,
@@ -165,13 +166,6 @@
         Location location = request.getActualLocationOfNode();
         assert location != null;
 
-        Logger logger = Logger.getLogger(getClass());
-        if (logger.isTraceEnabled()) {
-            logger.trace("indexing {0} in workspace \"{1}\"",
-                         location.getString(getExecutionContext().getNamespaceRegistry()),
-                         request.inWorkspace());
-        }
-
         try {
             session.setOrReplaceProperties(location, request.properties());
             session.recordChange();
@@ -218,6 +212,9 @@
         assert !readOnly;
         try {
             // Create a query to find all the nodes at or below the specified path (this efficiently handles the root path) ...
+            if (logger.isTraceEnabled()) {
+                logger.trace("index for \"{0}\" workspace: DEL '{1}' branch", request.inWorkspace(), stringFactory.create(path));
+            }
             Query query = session.findAllNodesAtOrBelow(path);
             // Now delete the documents from each index using this query, which we can reuse ...
             session.getContentWriter().deleteDocuments(query);

Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-11 01:21:32 UTC (rev 1590)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java	2010-01-11 02:18:28 UTC (rev 1591)
@@ -57,6 +57,7 @@
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.Version;
+import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.Location;
@@ -120,6 +121,7 @@
     private IndexWriter contentWriter;
     private IndexSearcher contentSearcher;
     private int numChanges;
+    private final Logger logger = Logger.getLogger(getClass());
 
     protected LuceneSearchSession( LuceneSearchWorkspace workspace,
                                    LuceneSearchProcessor processor ) {
@@ -205,6 +207,10 @@
      * @see org.jboss.dna.search.lucene.AbstractLuceneSearchEngine.WorkspaceSession#commit()
      */
     public void commit() {
+        if (logger.isTraceEnabled() && numChanges > 0) {
+            logger.trace("index for \"{0}\" workspace: COMMIT", workspace.getWorkspaceName());
+        }
+
         // Is optimization required ...
         final boolean optimize = workspace.isOptimizationRequired(numChanges);
         numChanges = 0;
@@ -256,6 +262,9 @@
      * @see org.jboss.dna.search.lucene.AbstractLuceneSearchEngine.WorkspaceSession#rollback()
      */
     public void rollback() {
+        if (logger.isTraceEnabled() && numChanges > 0) {
+            logger.trace("index for \"{0}\" workspace: ROLLBACK", workspace.getWorkspaceName());
+        }
         numChanges = 0;
         IOException ioError = null;
         RuntimeException runtimeError = null;
@@ -461,6 +470,7 @@
         if (fullTextSearchValue.length() != 0) {
             doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
         }
+        logger.trace("index for \"{0}\" workspace: ADD {1}", workspace.getWorkspaceName(), doc);
         getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);
     }
 


From dna-commits at lists.jboss.org  Mon Jan 11 14:09:49 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 11 Jan 2010 14:09:49 -0500
Subject: [dna-commits] DNA SVN: r1593 - in trunk: dna-cnd and 35 other
	directories.
Message-ID: <201001111909.o0BJ9nhq017495@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-11 14:09:46 -0500 (Mon, 11 Jan 2010)
New Revision: 1593

Modified:
   trunk/dna-cnd/pom.xml
   trunk/dna-common/pom.xml
   trunk/dna-graph/pom.xml
   trunk/dna-integration-tests/pom.xml
   trunk/dna-jcr/pom.xml
   trunk/dna-repository/pom.xml
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/examples/gettingstarted/repositories/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/docs/gettingstarted/pom.xml
   trunk/docs/pom.xml
   trunk/docs/reference/pom.xml
   trunk/extensions/dna-classloader-maven/pom.xml
   trunk/extensions/dna-connector-filesystem/pom.xml
   trunk/extensions/dna-connector-infinispan/pom.xml
   trunk/extensions/dna-connector-jbosscache/pom.xml
   trunk/extensions/dna-connector-jdbc-metadata/pom.xml
   trunk/extensions/dna-connector-store-jpa/pom.xml
   trunk/extensions/dna-connector-svn/pom.xml
   trunk/extensions/dna-mimetype-detector-aperture/pom.xml
   trunk/extensions/dna-search-lucene/pom.xml
   trunk/extensions/dna-sequencer-classfile/pom.xml
   trunk/extensions/dna-sequencer-cnd/pom.xml
   trunk/extensions/dna-sequencer-ddl/pom.xml
   trunk/extensions/dna-sequencer-images/pom.xml
   trunk/extensions/dna-sequencer-java/pom.xml
   trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   trunk/extensions/dna-sequencer-mp3/pom.xml
   trunk/extensions/dna-sequencer-msoffice/pom.xml
   trunk/extensions/dna-sequencer-text/pom.xml
   trunk/extensions/dna-sequencer-xml/pom.xml
   trunk/extensions/dna-sequencer-zip/pom.xml
   trunk/pom.xml
   trunk/utils/dna-jpa-ddl-gen/pom.xml
   trunk/web/dna-web-jcr-rest-client/pom.xml
   trunk/web/dna-web-jcr-rest-war/pom.xml
   trunk/web/dna-web-jcr-rest/pom.xml
Log:
[maven-release-plugin] prepare release dna-0.7

Modified: trunk/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-cnd/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna</groupId>

Modified: trunk/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-common/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -1,10 +1,9 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
 	<artifactId>dna-common</artifactId>

Modified: trunk/dna-graph/pom.xml
===================================================================
--- trunk/dna-graph/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-graph/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-graph</artifactId>

Modified: trunk/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-integration-tests/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
 	<artifactId>dna-integration-tests</artifactId>

Modified: trunk/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-jcr/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-jcr</artifactId>

Modified: trunk/dna-repository/pom.xml
===================================================================
--- trunk/dna-repository/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/dna-repository/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-repository</artifactId>

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/examples/gettingstarted/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>getting_started</artifactId>
   <packaging>pom</packaging>
-  <version>0.7-SNAPSHOT</version>
+  <version>0.7</version>
   <name>JBoss DNA Getting Started examples</name>
   <description />
 

Modified: trunk/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-repositories</artifactId>
-  <version>0.7-SNAPSHOT</version>
+  <version>0.7</version>
   <packaging>jar</packaging>
   <name>JBoss DNA Repositories Examples</name>
   <description>Examples that showcase how to use DNA repositories.</description>

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-sequencers</artifactId>
-  <version>0.7-SNAPSHOT</version>
+  <version>0.7</version>
   <packaging>jar</packaging>
   <name>JBoss DNA Sequencer Examples</name>
   <description>Examples that showcase how to use sequencers with a JCR repository.</description>

Modified: trunk/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/gettingstarted/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
     parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
   <groupId>org.jboss.dna</groupId>
   <artifactId>getting-started-en</artifactId>
-  <version>0.7-SNAPSHOT</version>
+  <version>0.7</version>
   <packaging>jdocbook</packaging>
   <name>JBoss DNA Getting Started manual</name>
   <description>The JBoss DNA Getting Started manual</description>

Modified: trunk/docs/pom.xml
===================================================================
--- trunk/docs/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.docs</groupId>

Modified: trunk/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/docs/reference/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
     parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
   <groupId>org.jboss.dna</groupId>
   <artifactId>reference-guide-en</artifactId>
-  <version>0.7-SNAPSHOT</version>
+  <version>0.7</version>
   <packaging>jdocbook</packaging>
   <name>JBoss DNA Reference Guide</name>
   <description>The reference guide for JBoss DNA developers and advanced users</description>

Modified: trunk/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-filesystem/pom.xml
===================================================================
--- trunk/extensions/dna-connector-filesystem/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-filesystem/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-infinispan/pom.xml
===================================================================
--- trunk/extensions/dna-connector-infinispan/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-infinispan/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-jbosscache/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-jdbc-metadata/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -1,10 +1,9 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-store-jpa/pom.xml
===================================================================
--- trunk/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-svn/pom.xml
===================================================================
--- trunk/extensions/dna-connector-svn/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-connector-svn/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-connector-svn</artifactId>

Modified: trunk/extensions/dna-mimetype-detector-aperture/pom.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-search-lucene/pom.xml
===================================================================
--- trunk/extensions/dna-search-lucene/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-search-lucene/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-classfile/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-cnd/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>

Modified: trunk/extensions/dna-sequencer-ddl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -1,10 +1,9 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-images/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-java/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-java/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-java/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,12 +3,12 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
 	<packaging>jar</packaging>
-	<version>0.7-SNAPSHOT</version>
+	<version>0.7</version>
 	<name>JBoss DNA jBPM jPDL Sequencer</name>
 	<description>
 		JBoss DNA Sequencer that processes jPDL XML document

Modified: trunk/extensions/dna-sequencer-mp3/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-msoffice/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-text/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-text/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-text/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-xml/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-xml/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-zip/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-zip/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/extensions/dna-sequencer-zip/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
+    <version>0.7</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.jboss.dna</groupId>
 	<artifactId>dna</artifactId>
-	<version>0.7-SNAPSHOT</version>
+	<version>0.7</version>
 	<packaging>pom</packaging>
 	<name>JBoss DNA</name>
 	<url>http://www.jboss.org/dna</url>
@@ -11,8 +11,8 @@
 		JBoss DNA is a JCR repository implementation with support for federation and sequencing.
 	</description>
 	<scm>
-		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/trunk</connection>
-    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/trunk</developerConnection>   
+		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/tags/dna-0.7</connection>
+    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.7</developerConnection>   
 	</scm>
   <issueManagement>
     <system>jira</system>
@@ -155,11 +155,11 @@
 		     them via filtering to the resources. If a project needs files filtered, however, make sure to include
 		     a 'testResources' fragment in the 'build' section of the child project POM to say which files need to be filtered.
 		     See the "dna-integration" or "extensions/dna-connector-store-jpa" project POMs for examples. -->
-		<jpaSource.dialect/>
-		<jpaSource.driverClassName/>
-		<jpaSource.url/>
-		<jpaSource.username/>
-		<jpaSource.password/>
+		<jpaSource.dialect />
+		<jpaSource.driverClassName />
+		<jpaSource.url />
+		<jpaSource.username />
+		<jpaSource.password />
 		<jpaSource.maximumConnectionsInPool>1</jpaSource.maximumConnectionsInPool>
 		<jpaSource.minimumConnectionsInPool>0</jpaSource.minimumConnectionsInPool>
 		<jpaSource.numberOfConnectionsToAcquireAsNeeded>1</jpaSource.numberOfConnectionsToAcquireAsNeeded>
@@ -168,16 +168,16 @@
 		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
 		<jpaSource.largeValueSizeInBytes>150</jpaSource.largeValueSizeInBytes>
 		<jpaSource.autoGenerateSchema>create</jpaSource.autoGenerateSchema>
-		<jpaSource.compressData/>
-		<jpaSource.cacheTimeToLiveInMilliseconds/>
-		<jpaSource.creatingWorkspacesAllowed/>
-		<jpaSource.defaultWorkspaceName/>
-		<jpaSource.predefinedWorkspaceNames/>
-		<jpaSource.model/>
-		<jpaSource.numberOfConnectionsToAcquireAsNeeded/>
+		<jpaSource.compressData />
+		<jpaSource.cacheTimeToLiveInMilliseconds />
+		<jpaSource.creatingWorkspacesAllowed />
+		<jpaSource.defaultWorkspaceName />
+		<jpaSource.predefinedWorkspaceNames />
+		<jpaSource.model />
+		<jpaSource.numberOfConnectionsToAcquireAsNeeded />
 		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
 		<jpaSource.retryLimit>3</jpaSource.retryLimit>
-		<jpaSource.rootNodeUuid/>
+		<jpaSource.rootNodeUuid />
 		<jpaSource.showSql>false</jpaSource.showSql>
     <metadata.collectorClassName>org.jboss.dna.connector.meta.jdbc.JdbcMetadataCollector</metadata.collectorClassName>
 	</properties>

Modified: trunk/utils/dna-jpa-ddl-gen/pom.xml
===================================================================
--- trunk/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -1,10 +1,9 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/web/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/web/dna-web-jcr-rest/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest</artifactId>

Modified: trunk/web/dna-web-jcr-rest-client/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -1,10 +1,9 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/web/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ trunk/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 19:09:46 UTC (rev 1593)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
+		<version>0.7</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest-war</artifactId>


From dna-commits at lists.jboss.org  Mon Jan 11 14:10:53 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 11 Jan 2010 14:10:53 -0500
Subject: [dna-commits] DNA SVN: r1594 - in tags: dna-0.7 and 36 other
	directories.
Message-ID: <201001111910.o0BJArgY017909@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-11 14:10:49 -0500 (Mon, 11 Jan 2010)
New Revision: 1594

Added:
   tags/dna-0.7/
   tags/dna-0.7/dna-cnd/pom.xml
   tags/dna-0.7/dna-common/pom.xml
   tags/dna-0.7/dna-graph/pom.xml
   tags/dna-0.7/dna-integration-tests/pom.xml
   tags/dna-0.7/dna-jcr/pom.xml
   tags/dna-0.7/dna-repository/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml
   tags/dna-0.7/docs/gettingstarted/pom.xml
   tags/dna-0.7/docs/pom.xml
   tags/dna-0.7/docs/reference/pom.xml
   tags/dna-0.7/extensions/dna-classloader-maven/pom.xml
   tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml
   tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml
   tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml
   tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml
   tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml
   tags/dna-0.7/extensions/dna-connector-svn/pom.xml
   tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml
   tags/dna-0.7/extensions/dna-search-lucene/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-images/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-java/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-text/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml
   tags/dna-0.7/pom.xml
   tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest/pom.xml
Removed:
   tags/dna-0.7/dna-cnd/pom.xml
   tags/dna-0.7/dna-common/pom.xml
   tags/dna-0.7/dna-graph/pom.xml
   tags/dna-0.7/dna-integration-tests/pom.xml
   tags/dna-0.7/dna-jcr/pom.xml
   tags/dna-0.7/dna-repository/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml
   tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml
   tags/dna-0.7/docs/gettingstarted/pom.xml
   tags/dna-0.7/docs/pom.xml
   tags/dna-0.7/docs/reference/pom.xml
   tags/dna-0.7/extensions/dna-classloader-maven/pom.xml
   tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml
   tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml
   tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml
   tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml
   tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml
   tags/dna-0.7/extensions/dna-connector-svn/pom.xml
   tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml
   tags/dna-0.7/extensions/dna-search-lucene/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-images/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-java/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-text/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml
   tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml
   tags/dna-0.7/pom.xml
   tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml
   tags/dna-0.7/web/dna-web-jcr-rest/pom.xml
Log:
[maven-release-plugin]  copy for tag dna-0.7

Copied: tags/dna-0.7 (from rev 1592, trunk)

Deleted: tags/dna-0.7/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,63 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-cnd</artifactId>
-  <name>JBoss DNA CND Utility</name>
-  <description>JBoss DNA utility for processing and working with JCR CND files</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    
-    <!-- Testing -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-	<dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-cnd/pom.xml (from rev 1593, trunk/dna-cnd/pom.xml)
===================================================================
--- tags/dna-0.7/dna-cnd/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,63 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-cnd</artifactId>
+  <name>JBoss DNA CND Utility</name>
+  <description>JBoss DNA utility for processing and working with JCR CND files</description>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    
+    <!-- Testing -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+	<dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-common/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,97 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-common</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA Common</name>
-	<description>JBoss DNA Common Library and Utilities</description>
-	<url>http://labs.jboss.org/dna</url>
-
-	<build>
-		<plugins>
-			<!--
-				Adding OSGI metadata to the JAR without changing the packaging type.
-			-->
-			<plugin>
-				<artifactId>maven-jar-plugin</artifactId>
-				<configuration>
-					<archive>
-						<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-					</archive>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.felix</groupId>
-				<artifactId>maven-bundle-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>bundle-manifest</id>
-						<phase>process-classes</phase>
-						<goals>
-							<goal>manifest</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-	<!--
-		Define the dependencies. Note that all version and scopes default to
-		those defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<!-- 
-    Testing (note the scope)
-    -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-library</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<!--
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
-			binding for testing)
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-    Java Concurrency in Practice annotations
-    -->
-		<dependency>
-			<groupId>net.jcip</groupId>
-			<artifactId>jcip-annotations</artifactId>
-		</dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-common/pom.xml (from rev 1593, trunk/dna-common/pom.xml)
===================================================================
--- tags/dna-0.7/dna-common/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-common/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,96 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-common</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Common</name>
+	<description>JBoss DNA Common Library and Utilities</description>
+	<url>http://labs.jboss.org/dna</url>
+
+	<build>
+		<plugins>
+			<!--
+				Adding OSGI metadata to the JAR without changing the packaging type.
+			-->
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<configuration>
+					<archive>
+						<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>bundle-manifest</id>
+						<phase>process-classes</phase>
+						<goals>
+							<goal>manifest</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<!--
+		Define the dependencies. Note that all version and scopes default to
+		those defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<!-- 
+    Testing (note the scope)
+    -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+    Java Concurrency in Practice annotations
+    -->
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/dna-graph/pom.xml
===================================================================
--- trunk/dna-graph/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-graph/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,73 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-graph</artifactId>
-  <description>The JBoss DNA Graph API and SPI interfaces</description>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Graph</name>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>joda-time</groupId>
-      <artifactId>joda-time</artifactId>
-    </dependency>
-	  <dependency>
-         <groupId>com.google.collections</groupId>
-         <artifactId>google-collections</artifactId>
-      </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-graph/pom.xml (from rev 1593, trunk/dna-graph/pom.xml)
===================================================================
--- tags/dna-0.7/dna-graph/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-graph/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,73 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-graph</artifactId>
+  <description>The JBoss DNA Graph API and SPI interfaces</description>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Graph</name>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>joda-time</groupId>
+      <artifactId>joda-time</artifactId>
+    </dependency>
+	  <dependency>
+         <groupId>com.google.collections</groupId>
+         <artifactId>google-collections</artifactId>
+      </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-integration-tests/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,246 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-integration-tests</artifactId>
-	<description>The JBoss DNA integration tests</description>
-	<packaging>jar</packaging>
-	<name>JBoss DNA Integration Tests</name>
-	<url>http://labs.jboss.org/dna</url>
-
-	<!--
-		Define the dependencies. Note that all version and scopes default to
-		those defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-classloader-maven</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-repository</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-jcr</artifactId>
-		</dependency>
-		<dependency>
-            <groupId>org.jboss.dna</groupId>
-            <artifactId>dna-sequencer-ddl</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-		<!-- 
-      Testing (note the scope)
-    -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-jcr</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-connector-jbosscache</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-connector-filesystem</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-connector-infinispan</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-        <dependency>
-            <groupId>org.jboss.dna</groupId>
-            <artifactId>dna-connector-svn</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.dna</groupId>
-            <artifactId>dna-connector-jdbc-metadata</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-		<!-- 
-          JPA Connector Dependencies
-          -->
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-connector-store-jpa</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-entitymanager</artifactId>
-			<version>3.4.0.GA</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-c3p0</artifactId>
-			<version>3.3.1.GA</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>hsqldb</groupId>
-			<artifactId>hsqldb</artifactId>
-			<version>1.8.0.2</version>
-			<scope>test</scope>
-		</dependency>
-
-		<!--
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
-			binding for testing)
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-      Java Content Repository API 
-    -->
-		<dependency>
-			<groupId>javax.jcr</groupId>
-			<artifactId>jcr</artifactId>
-			<scope>test</scope>
-		</dependency>
-        <!-- 
-      JCR TCK unit tests
-    -->
-		<dependency>
-			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-jcr-tests</artifactId>
-		</dependency>
-		<!-- 
-      Databases and JDBC Drivers
-    -->
-		<dependency>
-			<groupId>org.apache.derby</groupId>
-			<artifactId>derby</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.security</groupId>
-			<artifactId>jboss-idtrust</artifactId>
-			<version>2.0.2.CR1</version>
-			<scope>test</scope>
-		</dependency>
-
-		<!-- 
-      ID Trust (JAAS Dependency)
-    -->
-		<dependency>
-			<groupId>org.jboss.security</groupId>
-			<artifactId>jboss-security-spi-bare</artifactId>
-			<version>2.0.2.SP6</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.security</groupId>
-			<artifactId>jbosssx-bare</artifactId>
-			<version>2.0.2.SP6</version>
-			<exclusions>
-				<exclusion>
-					<groupId>apache-xalan</groupId>
-					<artifactId>xalan</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>apache-xalan</groupId>
-					<artifactId>serializer</artifactId>
-				</exclusion>
-			</exclusions>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-	<!--
-		Build configuration - run integration tests only in 'integration'
-		phase
-	-->
-	<build>
-    <testResources>
-      <testResource>
-           <filtering>false</filtering>
-           <directory>src/test/resources</directory>
-           <includes>
-             <include>*</include>
-             <include>**/*</include>
-           </includes>
-       </testResource>
-	    <!-- Apply the properties set in the POM to the resource files -->
-      <testResource>
-        <filtering>true</filtering>
-        <directory>src/test/resources</directory>
-        <includes>
-          <include>tck/basic-jpa/configRepository.xml</include>
-          <include>tck/simple-jpa/configRepository.xml</include>
-        </includes>
-      </testResource>
-    </testResources>
-		<plugins>
-			<plugin>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-				<executions>
-					<execution>
-						<id>integration-test</id>
-						<phase>integration-test</phase>
-						<goals>
-							<goal>test</goal>
-						</goals>
-						<configuration>
-							<skip>false</skip>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-integration-tests/pom.xml (from rev 1593, trunk/dna-integration-tests/pom.xml)
===================================================================
--- tags/dna-0.7/dna-integration-tests/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-integration-tests/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,246 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-integration-tests</artifactId>
+	<description>The JBoss DNA integration tests</description>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Integration Tests</name>
+	<url>http://labs.jboss.org/dna</url>
+
+	<!--
+		Define the dependencies. Note that all version and scopes default to
+		those defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-classloader-maven</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-repository</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+		</dependency>
+		<dependency>
+            <groupId>org.jboss.dna</groupId>
+            <artifactId>dna-sequencer-ddl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+		<!-- 
+      Testing (note the scope)
+    -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-connector-jbosscache</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-connector-filesystem</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-connector-infinispan</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+        <dependency>
+            <groupId>org.jboss.dna</groupId>
+            <artifactId>dna-connector-svn</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.dna</groupId>
+            <artifactId>dna-connector-jdbc-metadata</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+		<!-- 
+          JPA Connector Dependencies
+          -->
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-connector-store-jpa</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+			<version>3.4.0.GA</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-c3p0</artifactId>
+			<version>3.3.1.GA</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>hsqldb</groupId>
+			<artifactId>hsqldb</artifactId>
+			<version>1.8.0.2</version>
+			<scope>test</scope>
+		</dependency>
+
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+      Java Content Repository API 
+    -->
+		<dependency>
+			<groupId>javax.jcr</groupId>
+			<artifactId>jcr</artifactId>
+			<scope>test</scope>
+		</dependency>
+        <!-- 
+      JCR TCK unit tests
+    -->
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-jcr-tests</artifactId>
+		</dependency>
+		<!-- 
+      Databases and JDBC Drivers
+    -->
+		<dependency>
+			<groupId>org.apache.derby</groupId>
+			<artifactId>derby</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.security</groupId>
+			<artifactId>jboss-idtrust</artifactId>
+			<version>2.0.2.CR1</version>
+			<scope>test</scope>
+		</dependency>
+
+		<!-- 
+      ID Trust (JAAS Dependency)
+    -->
+		<dependency>
+			<groupId>org.jboss.security</groupId>
+			<artifactId>jboss-security-spi-bare</artifactId>
+			<version>2.0.2.SP6</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.security</groupId>
+			<artifactId>jbosssx-bare</artifactId>
+			<version>2.0.2.SP6</version>
+			<exclusions>
+				<exclusion>
+					<groupId>apache-xalan</groupId>
+					<artifactId>xalan</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>apache-xalan</groupId>
+					<artifactId>serializer</artifactId>
+				</exclusion>
+			</exclusions>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<!--
+		Build configuration - run integration tests only in 'integration'
+		phase
+	-->
+	<build>
+    <testResources>
+      <testResource>
+           <filtering>false</filtering>
+           <directory>src/test/resources</directory>
+           <includes>
+             <include>*</include>
+             <include>**/*</include>
+           </includes>
+       </testResource>
+	    <!-- Apply the properties set in the POM to the resource files -->
+      <testResource>
+        <filtering>true</filtering>
+        <directory>src/test/resources</directory>
+        <includes>
+          <include>tck/basic-jpa/configRepository.xml</include>
+          <include>tck/simple-jpa/configRepository.xml</include>
+        </includes>
+      </testResource>
+    </testResources>
+		<plugins>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+				<executions>
+					<execution>
+						<id>integration-test</id>
+						<phase>integration-test</phase>
+						<goals>
+							<goal>test</goal>
+						</goals>
+						<configuration>
+							<skip>false</skip>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-jcr/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-jcr</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA JCR implementation</name>
-  <description>JBoss DNA implementation of the JCR API</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-repository</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-cnd</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-search-lucene</artifactId>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-  <dependency>
-    <groupId>net.jcip</groupId>
-    <artifactId>jcip-annotations</artifactId>
-  </dependency>
-    <!-- 
-      Java Content Repository API 
-    -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-    </dependency>
-    <!-- 
-      Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
-    -->
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-jcr-tests</artifactId>
-    </dependency>
-	  <dependency>
-         <groupId>com.google.collections</groupId>
-         <artifactId>google-collections</artifactId>
-		 <version>1.0-rc3</version>
-      </dependency>
-
-	<dependency>
-		<groupId>org.jboss.security</groupId>
-		<artifactId>jboss-idtrust</artifactId>
-		<version>2.0.2.CR1</version>
-      <scope>test</scope>
-	</dependency>
-
-	<dependency>
-		<groupId>org.jboss.security</groupId>
-		<artifactId>jboss-security-spi-bare</artifactId>
-		<version>2.0.2.SP6</version>
-      <scope>test</scope>
-	</dependency>
-	<dependency>
-		<groupId>org.jboss.security</groupId>
-		<artifactId>jbosssx-bare</artifactId>
-		<version>2.0.2.SP6</version>
-		<exclusions>
-			<exclusion>
-				<groupId>apache-xalan</groupId>
-				<artifactId>xalan</artifactId>
-		 	</exclusion>
-			<exclusion>
-				<groupId>apache-xalan</groupId>
-				<artifactId>serializer</artifactId>
-			</exclusion>
-		</exclusions>
-      <scope>test</scope>
-	</dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-jcr/pom.xml (from rev 1593, trunk/dna-jcr/pom.xml)
===================================================================
--- tags/dna-0.7/dna-jcr/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-jcr/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-jcr</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA JCR implementation</name>
+  <description>JBoss DNA implementation of the JCR API</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-repository</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-cnd</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-search-lucene</artifactId>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+  <dependency>
+    <groupId>net.jcip</groupId>
+    <artifactId>jcip-annotations</artifactId>
+  </dependency>
+    <!-- 
+      Java Content Repository API 
+    -->
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+    </dependency>
+    <!-- 
+      Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
+    -->
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-jcr-tests</artifactId>
+    </dependency>
+	  <dependency>
+         <groupId>com.google.collections</groupId>
+         <artifactId>google-collections</artifactId>
+		 <version>1.0-rc3</version>
+      </dependency>
+
+	<dependency>
+		<groupId>org.jboss.security</groupId>
+		<artifactId>jboss-idtrust</artifactId>
+		<version>2.0.2.CR1</version>
+      <scope>test</scope>
+	</dependency>
+
+	<dependency>
+		<groupId>org.jboss.security</groupId>
+		<artifactId>jboss-security-spi-bare</artifactId>
+		<version>2.0.2.SP6</version>
+      <scope>test</scope>
+	</dependency>
+	<dependency>
+		<groupId>org.jboss.security</groupId>
+		<artifactId>jbosssx-bare</artifactId>
+		<version>2.0.2.SP6</version>
+		<exclusions>
+			<exclusion>
+				<groupId>apache-xalan</groupId>
+				<artifactId>xalan</artifactId>
+		 	</exclusion>
+			<exclusion>
+				<groupId>apache-xalan</groupId>
+				<artifactId>serializer</artifactId>
+			</exclusion>
+		</exclusions>
+      <scope>test</scope>
+	</dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/dna-repository/pom.xml
===================================================================
--- trunk/dna-repository/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/dna-repository/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,90 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-repository</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Repository</name>
-  <description>JBoss DNA Repository library</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-search-lucene</artifactId>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-	<dependency>
-	  <groupId>net.jcip</groupId>
-	  <artifactId>jcip-annotations</artifactId>
-	</dependency>
-    <!-- 
-      Java Content Repository API 
-    -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/dna-repository/pom.xml (from rev 1593, trunk/dna-repository/pom.xml)
===================================================================
--- tags/dna-0.7/dna-repository/pom.xml	                        (rev 0)
+++ tags/dna-0.7/dna-repository/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,90 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-repository</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Repository</name>
+  <description>JBoss DNA Repository library</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-search-lucene</artifactId>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+	<dependency>
+	  <groupId>net.jcip</groupId>
+	  <artifactId>jcip-annotations</artifactId>
+	</dependency>
+    <!-- 
+      Java Content Repository API 
+    -->
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/examples/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,171 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.examples</groupId>
-  <artifactId>getting_started</artifactId>
-  <packaging>pom</packaging>
-  <version>0.7-SNAPSHOT</version>
-  <name>JBoss DNA Getting Started examples</name>
-  <description />
-
-  <modules>
-    <module>sequencers</module>
-    <module>repositories</module>
-  </modules>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-common</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-graph</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-repository</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-jcr</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-maven-classloader</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-sequencer-images</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-sequencer-java</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-connector-jbosscache</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-connector-federation</artifactId>
-        <version>${project.version}</version>
-        <scope>runtime</scope>
-      </dependency>
-      <!-- Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) -->
-      <dependency>
-		    <groupId>org.slf4j</groupId>
-		    <artifactId>slf4j-api</artifactId>
-		    <version>1.5.8</version>
-      </dependency>
-      <dependency>
-		    <groupId>org.slf4j</groupId>
-		    <artifactId>slf4j-log4j12</artifactId>
-		    <version>1.5.8</version>
-      </dependency>
-	   <dependency>
-		    <groupId>log4j</groupId>
-		    <artifactId>log4j</artifactId>
-		    <version>1.2.14</version>
-      </dependency>
-      <!-- Java Content Repository API -->
-      <dependency>
-        <groupId>javax.jcr</groupId>
-        <artifactId>jcr</artifactId>
-        <version>1.0.1</version>
-        <scope>compile</scope>
-      </dependency>
-      <!-- Testing (note the scope) -->
-      <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.4</version>
-        <scope>test</scope>
-      </dependency>
-			<dependency>
-				<groupId>org.mockito</groupId>
-				<artifactId>mockito-all</artifactId>
-				<version>1.5</version>
-				<scope>test</scope>
-			</dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <build>
-    <plugins> 
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.0.2</version>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-          <debug>true</debug>
-          <showDeprecation>true</showDeprecation>
-          <showWarnings>true</showWarnings>
-          <optimize>true</optimize>
-        </configuration>
-      </plugin>  
-			<plugin>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<includes>
-						<include>**/*TestCase.java</include>
-						<include>**/*Test.java</include>
-					</includes>
-					<!--excludes>
-						<exclude>**/Abstract*TestCase.java</exclude>
-						<exclude>**/Abstract*Test.java</exclude>
-					</excludes-->
-					<systemProperties>
-						<property>
-							<name>java.io.tmpdir</name>
-							<value>${basedir}/target</value>
-						</property>
-					</systemProperties>
-				</configuration>
-			</plugin>
-    </plugins>
-  </build>
-
-	<repositories>
-	<repository>
-      <id>apiviz.release</id>
-      <name>APIviz releases</name>
-      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-	
-	
-		<repository>
-			<id>jboss</id>
-			<url>http://repository.jboss.com/maven2</url>
-		</repository>
-		<repository>
-			<id>jboss-snapshot</id>
-			<url>http://snapshots.jboss.org/maven2</url>
-		</repository>
-	</repositories>
-	<distributionManagement>
-		<repository>
-			<!-- Copy the distribution jar file to a local checkout of the maven repository 
- 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
-			<id>repository.jboss.org</id>
-			<url>file://${jboss.repository.root}</url>
-		</repository>
-	</distributionManagement>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/examples/gettingstarted/pom.xml (from rev 1593, trunk/docs/examples/gettingstarted/pom.xml)
===================================================================
--- tags/dna-0.7/docs/examples/gettingstarted/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/examples/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,171 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.examples</groupId>
+  <artifactId>getting_started</artifactId>
+  <packaging>pom</packaging>
+  <version>0.7</version>
+  <name>JBoss DNA Getting Started examples</name>
+  <description />
+
+  <modules>
+    <module>sequencers</module>
+    <module>repositories</module>
+  </modules>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-common</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-graph</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-repository</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-jcr</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-maven-classloader</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-sequencer-images</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-sequencer-java</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-connector-jbosscache</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-connector-federation</artifactId>
+        <version>${project.version}</version>
+        <scope>runtime</scope>
+      </dependency>
+      <!-- Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) -->
+      <dependency>
+		    <groupId>org.slf4j</groupId>
+		    <artifactId>slf4j-api</artifactId>
+		    <version>1.5.8</version>
+      </dependency>
+      <dependency>
+		    <groupId>org.slf4j</groupId>
+		    <artifactId>slf4j-log4j12</artifactId>
+		    <version>1.5.8</version>
+      </dependency>
+	   <dependency>
+		    <groupId>log4j</groupId>
+		    <artifactId>log4j</artifactId>
+		    <version>1.2.14</version>
+      </dependency>
+      <!-- Java Content Repository API -->
+      <dependency>
+        <groupId>javax.jcr</groupId>
+        <artifactId>jcr</artifactId>
+        <version>1.0.1</version>
+        <scope>compile</scope>
+      </dependency>
+      <!-- Testing (note the scope) -->
+      <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>4.4</version>
+        <scope>test</scope>
+      </dependency>
+			<dependency>
+				<groupId>org.mockito</groupId>
+				<artifactId>mockito-all</artifactId>
+				<version>1.5</version>
+				<scope>test</scope>
+			</dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <build>
+    <plugins> 
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+          <debug>true</debug>
+          <showDeprecation>true</showDeprecation>
+          <showWarnings>true</showWarnings>
+          <optimize>true</optimize>
+        </configuration>
+      </plugin>  
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<includes>
+						<include>**/*TestCase.java</include>
+						<include>**/*Test.java</include>
+					</includes>
+					<!--excludes>
+						<exclude>**/Abstract*TestCase.java</exclude>
+						<exclude>**/Abstract*Test.java</exclude>
+					</excludes-->
+					<systemProperties>
+						<property>
+							<name>java.io.tmpdir</name>
+							<value>${basedir}/target</value>
+						</property>
+					</systemProperties>
+				</configuration>
+			</plugin>
+    </plugins>
+  </build>
+
+	<repositories>
+	<repository>
+      <id>apiviz.release</id>
+      <name>APIviz releases</name>
+      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </repository>
+	
+	
+		<repository>
+			<id>jboss</id>
+			<url>http://repository.jboss.com/maven2</url>
+		</repository>
+		<repository>
+			<id>jboss-snapshot</id>
+			<url>http://snapshots.jboss.org/maven2</url>
+		</repository>
+	</repositories>
+	<distributionManagement>
+		<repository>
+			<!-- Copy the distribution jar file to a local checkout of the maven repository 
+ 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
+			<id>repository.jboss.org</id>
+			<url>file://${jboss.repository.root}</url>
+		</repository>
+	</distributionManagement>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,139 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.jboss.dna.examples</groupId>
-    <artifactId>getting_started</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.examples</groupId>
-  <artifactId>dna-example-repositories</artifactId>
-  <version>0.7-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Repositories Examples</name>
-  <description>Examples that showcase how to use DNA repositories.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-repository</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-jcr</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-jbosscache</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-filesystem</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-store-jpa</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>1.8.0.2</version>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for running) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-      Java Content Repository API 
-    -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-    </dependency>
-    <!-- 
-      JAAS implementation (and dependencies)
-    -->
-    <dependency>
-        <groupId>org.jboss.security</groupId>
-        <artifactId>jboss-idtrust</artifactId>
-        <version>2.0.2.CR1</version>
-    </dependency>
-    <dependency>
-        <groupId>org.jboss.security</groupId>
-        <artifactId>jboss-security-spi-bare</artifactId>
-        <version>2.0.2.SP6</version>
-    </dependency>
-    <dependency>
-        <groupId>org.jboss.security</groupId>
-        <artifactId>jbosssx-bare</artifactId>
-        <version>2.0.2.SP6</version>
-        <exclusions>
-            <exclusion>
-                <groupId>apache-xalan</groupId>
-                <artifactId>xalan</artifactId>
-            </exclusion>
-            <exclusion>
-                <groupId>apache-xalan</groupId>
-                <artifactId>serializer</artifactId>
-            </exclusion>
-        </exclusions>
-    </dependency>
-    <!-- 
-      Test cases use JUnit
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <configuration>
-          <descriptors>
-            <descriptor>src/main/assembly/basic.xml</descriptor>
-          </descriptors>
-          <finalName>${project.artifactId}</finalName>
-        </configuration>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>directory-inline</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml (from rev 1593, trunk/docs/examples/gettingstarted/repositories/pom.xml)
===================================================================
--- tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,139 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <parent>
+    <groupId>org.jboss.dna.examples</groupId>
+    <artifactId>getting_started</artifactId>
+    <version>0.7</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.examples</groupId>
+  <artifactId>dna-example-repositories</artifactId>
+  <version>0.7</version>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Repositories Examples</name>
+  <description>Examples that showcase how to use DNA repositories.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-repository</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-jcr</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-jbosscache</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-filesystem</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-store-jpa</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <version>1.8.0.2</version>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for running) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+      Java Content Repository API 
+    -->
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+    </dependency>
+    <!-- 
+      JAAS implementation (and dependencies)
+    -->
+    <dependency>
+        <groupId>org.jboss.security</groupId>
+        <artifactId>jboss-idtrust</artifactId>
+        <version>2.0.2.CR1</version>
+    </dependency>
+    <dependency>
+        <groupId>org.jboss.security</groupId>
+        <artifactId>jboss-security-spi-bare</artifactId>
+        <version>2.0.2.SP6</version>
+    </dependency>
+    <dependency>
+        <groupId>org.jboss.security</groupId>
+        <artifactId>jbosssx-bare</artifactId>
+        <version>2.0.2.SP6</version>
+        <exclusions>
+            <exclusion>
+                <groupId>apache-xalan</groupId>
+                <artifactId>xalan</artifactId>
+            </exclusion>
+            <exclusion>
+                <groupId>apache-xalan</groupId>
+                <artifactId>serializer</artifactId>
+            </exclusion>
+        </exclusions>
+    </dependency>
+    <!-- 
+      Test cases use JUnit
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptors>
+            <descriptor>src/main/assembly/basic.xml</descriptor>
+          </descriptors>
+          <finalName>${project.artifactId}</finalName>
+        </configuration>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>directory-inline</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,120 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.jboss.dna.examples</groupId>
-    <artifactId>getting_started</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.examples</groupId>
-  <artifactId>dna-example-sequencers</artifactId>
-  <version>0.7-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Sequencer Examples</name>
-  <description>Examples that showcase how to use sequencers with a JCR repository.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-jcr</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-classfile</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-images</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-mp3</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-java</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-text</artifactId>
-      <version>${project.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-zip</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-      Java Content Repository API 
-    -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-    </dependency>
-    <!-- 
-      Test cases use JUnit
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <configuration>
-          <descriptors>
-            <descriptor>src/main/assembly/basic.xml</descriptor>
-          </descriptors>
-          <finalName>${project.artifactId}</finalName>
-        </configuration>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>directory-inline</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml (from rev 1593, trunk/docs/examples/gettingstarted/sequencers/pom.xml)
===================================================================
--- tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,120 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <parent>
+    <groupId>org.jboss.dna.examples</groupId>
+    <artifactId>getting_started</artifactId>
+    <version>0.7</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.examples</groupId>
+  <artifactId>dna-example-sequencers</artifactId>
+  <version>0.7</version>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Sequencer Examples</name>
+  <description>Examples that showcase how to use sequencers with a JCR repository.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-jcr</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-classfile</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-images</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-mp3</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-java</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-text</artifactId>
+      <version>${project.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-zip</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+      Java Content Repository API 
+    -->
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+    </dependency>
+    <!-- 
+      Test cases use JUnit
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptors>
+            <descriptor>src/main/assembly/basic.xml</descriptor>
+          </descriptors>
+          <finalName>${project.artifactId}</finalName>
+        </configuration>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>directory-inline</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,104 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <!--
-    parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>getting-started-en</artifactId>
-  <version>0.7-SNAPSHOT</version>
-  <packaging>jdocbook</packaging>
-  <name>JBoss DNA Getting Started manual</name>
-  <description>The JBoss DNA Getting Started manual</description>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.jboss.maven.plugins</groupId>
-        <artifactId>maven-jdocbook-plugin</artifactId>
-        <version>2.1.2</version>
-        <extensions>true</extensions>
-        <dependencies>
-          <dependency>
-            <groupId>net.sf.docbook</groupId>
-            <artifactId>docbook</artifactId>
-            <version>1.74.0</version>
-          </dependency>
-          <dependency>
-            <groupId>org.jboss</groupId>
-            <artifactId>jbossorg-docbook-xslt</artifactId>
-            <version>1.1.0</version>
-          </dependency>
-          <dependency>
-            <groupId>org.jboss</groupId>
-            <artifactId>jbossorg-jdocbook-style</artifactId>
-            <version>1.1.0</version>
-            <type>jdocbook-style</type>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <sourceDocumentName>master.xml</sourceDocumentName>
-          <imageResource>
-              <directory>${basedir}/src/main/docbook/en-US/images</directory>
-              <includes>
-                <include>*.png</include>
-              </includes>
-          </imageResource>
-          <targetDirectory>${basedir}/target/docbook/en-US</targetDirectory>
-          <formats>
-            <format>
-              <formatName>html</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
-              <finalName>index.html</finalName>
-            </format>
-            <format>
-              <formatName>html_single</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
-              <finalName>${project.artifactId}.html</finalName>
-            </format>
-            <format>
-              <formatName>pdf</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>${project.artifactId}.pdf</finalName>
-            </format>
-          </formats>
-          <options>
-            <xincludeSupported>true</xincludeSupported>
-            <xmlTransformerType>saxon</xmlTransformerType>
-            <!-- needed for uri-resolvers; can be ommitted if using 'current' uri scheme -->
-            <!--     could also locate the docbook dependency and inspect its version... -->
-            <docbookVersion>1.72.0</docbookVersion>          
-          </options>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-	<repositories>
-	<repository>
-      <id>apiviz.release</id>
-      <name>APIviz releases</name>
-      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-	
-	
-		<repository>
-			<id>jboss</id>
-			<url>http://repository.jboss.com/maven2</url>
-		</repository>
-		<repository>
-			<id>jboss-snapshot</id>
-			<url>http://snapshots.jboss.org/maven2</url>
-		</repository>
-	</repositories>
-	<distributionManagement>
-		<repository>
-			<!-- Copy the distribution jar file to a local checkout of the maven repository 
- 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
-			<id>repository.jboss.org</id>
-			<url>file://${jboss.repository.root}</url>
-		</repository>
-	</distributionManagement>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/gettingstarted/pom.xml (from rev 1593, trunk/docs/gettingstarted/pom.xml)
===================================================================
--- tags/dna-0.7/docs/gettingstarted/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,104 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <!--
+    parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>getting-started-en</artifactId>
+  <version>0.7</version>
+  <packaging>jdocbook</packaging>
+  <name>JBoss DNA Getting Started manual</name>
+  <description>The JBoss DNA Getting Started manual</description>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.jboss.maven.plugins</groupId>
+        <artifactId>maven-jdocbook-plugin</artifactId>
+        <version>2.1.2</version>
+        <extensions>true</extensions>
+        <dependencies>
+          <dependency>
+            <groupId>net.sf.docbook</groupId>
+            <artifactId>docbook</artifactId>
+            <version>1.74.0</version>
+          </dependency>
+          <dependency>
+            <groupId>org.jboss</groupId>
+            <artifactId>jbossorg-docbook-xslt</artifactId>
+            <version>1.1.0</version>
+          </dependency>
+          <dependency>
+            <groupId>org.jboss</groupId>
+            <artifactId>jbossorg-jdocbook-style</artifactId>
+            <version>1.1.0</version>
+            <type>jdocbook-style</type>
+          </dependency>
+        </dependencies>
+        <configuration>
+          <sourceDocumentName>master.xml</sourceDocumentName>
+          <imageResource>
+              <directory>${basedir}/src/main/docbook/en-US/images</directory>
+              <includes>
+                <include>*.png</include>
+              </includes>
+          </imageResource>
+          <targetDirectory>${basedir}/target/docbook/en-US</targetDirectory>
+          <formats>
+            <format>
+              <formatName>html</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
+              <finalName>index.html</finalName>
+            </format>
+            <format>
+              <formatName>html_single</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
+              <finalName>${project.artifactId}.html</finalName>
+            </format>
+            <format>
+              <formatName>pdf</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+              <finalName>${project.artifactId}.pdf</finalName>
+            </format>
+          </formats>
+          <options>
+            <xincludeSupported>true</xincludeSupported>
+            <xmlTransformerType>saxon</xmlTransformerType>
+            <!-- needed for uri-resolvers; can be ommitted if using 'current' uri scheme -->
+            <!--     could also locate the docbook dependency and inspect its version... -->
+            <docbookVersion>1.72.0</docbookVersion>          
+          </options>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+	<repositories>
+	<repository>
+      <id>apiviz.release</id>
+      <name>APIviz releases</name>
+      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </repository>
+	
+	
+		<repository>
+			<id>jboss</id>
+			<url>http://repository.jboss.com/maven2</url>
+		</repository>
+		<repository>
+			<id>jboss-snapshot</id>
+			<url>http://snapshots.jboss.org/maven2</url>
+		</repository>
+	</repositories>
+	<distributionManagement>
+		<repository>
+			<!-- Copy the distribution jar file to a local checkout of the maven repository 
+ 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
+			<id>repository.jboss.org</id>
+			<url>file://${jboss.repository.root}</url>
+		</repository>
+	</distributionManagement>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/pom.xml
===================================================================
--- trunk/docs/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,49 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.docs</groupId>
-  <artifactId>dna-docs</artifactId>
-  <packaging>pom</packaging>
-  <name>JBoss DNA Documents</name>
-  <url>http://www.jboss.org/dna</url>
-  <description>JBoss DNA Documentation</description>
-  <modules>
-    <module>gettingstarted</module>
-    <module>reference</module>
-  </modules>
-	<repositories>
-	<repository>
-      <id>apiviz.release</id>
-      <name>APIviz releases</name>
-      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-	
-	
-		<repository>
-			<id>jboss</id>
-			<url>http://repository.jboss.com/maven2</url>
-		</repository>
-		<repository>
-			<id>jboss-snapshot</id>
-			<url>http://snapshots.jboss.org/maven2</url>
-		</repository>
-	</repositories>
-	<distributionManagement>
-		<repository>
-			<!-- Copy the distribution jar file to a local checkout of the maven repository 
- 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
-			<id>repository.jboss.org</id>
-			<url>file://${jboss.repository.root}</url>
-		</repository>
-	</distributionManagement>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/pom.xml (from rev 1593, trunk/docs/pom.xml)
===================================================================
--- tags/dna-0.7/docs/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,49 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.docs</groupId>
+  <artifactId>dna-docs</artifactId>
+  <packaging>pom</packaging>
+  <name>JBoss DNA Documents</name>
+  <url>http://www.jboss.org/dna</url>
+  <description>JBoss DNA Documentation</description>
+  <modules>
+    <module>gettingstarted</module>
+    <module>reference</module>
+  </modules>
+	<repositories>
+	<repository>
+      <id>apiviz.release</id>
+      <name>APIviz releases</name>
+      <url>http://apiviz.googlecode.com/svn/site/repo/mvn/release</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </repository>
+	
+	
+		<repository>
+			<id>jboss</id>
+			<url>http://repository.jboss.com/maven2</url>
+		</repository>
+		<repository>
+			<id>jboss-snapshot</id>
+			<url>http://snapshots.jboss.org/maven2</url>
+		</repository>
+	</repositories>
+	<distributionManagement>
+		<repository>
+			<!-- Copy the distribution jar file to a local checkout of the maven repository 
+ 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
+			<id>repository.jboss.org</id>
+			<url>file://${jboss.repository.root}</url>
+		</repository>
+	</distributionManagement>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/docs/reference/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,73 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <!--
-    parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>reference-guide-en</artifactId>
-  <version>0.7-SNAPSHOT</version>
-  <packaging>jdocbook</packaging>
-  <name>JBoss DNA Reference Guide</name>
-  <description>The reference guide for JBoss DNA developers and advanced users</description>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.jboss.maven.plugins</groupId>
-        <artifactId>maven-jdocbook-plugin</artifactId>
-        <version>2.1.2</version>
-        <extensions>true</extensions>
-        <dependencies>
-          <dependency>
-            <groupId>net.sf.docbook</groupId>
-            <artifactId>docbook</artifactId>
-            <version>1.74.0</version>
-          </dependency>
-          <dependency>
-            <groupId>org.jboss</groupId>
-            <artifactId>jbossorg-docbook-xslt</artifactId>
-            <version>1.1.0</version>
-          </dependency>
-          <dependency>
-            <groupId>org.jboss</groupId>
-            <artifactId>jbossorg-jdocbook-style</artifactId>
-            <version>1.1.0</version>
-            <type>jdocbook-style</type>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <sourceDocumentName>master.xml</sourceDocumentName>
-           <imageResource>
-               <directory>${basedir}/src/main/docbook/en-US/images/</directory>
-               <includes>
-                 <include>*.png</include>
-               </includes>
-           </imageResource>
-          <targetDirectory>${basedir}/target/docbook/en-US</targetDirectory>
-          <formats>
-            <format>
-              <formatName>html</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
-              <finalName>index.html</finalName>
-            </format>
-            <format>
-              <formatName>html_single</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
-              <finalName>${project.artifactId}.html</finalName>
-            </format>
-            <format>
-              <formatName>pdf</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>${project.artifactId}.pdf</finalName>
-            </format>
-          </formats>
-          <options>
-            <xincludeSupported>true</xincludeSupported>
-            <xmlTransformerType>saxon</xmlTransformerType>
-            <!-- needed for uri-resolvers; can be ommitted if using 'current' uri scheme -->
-            <!--     could also locate the docbook dependency and inspect its version... -->
-            <docbookVersion>1.72.0</docbookVersion>          
-          </options>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/docs/reference/pom.xml (from rev 1593, trunk/docs/reference/pom.xml)
===================================================================
--- tags/dna-0.7/docs/reference/pom.xml	                        (rev 0)
+++ tags/dna-0.7/docs/reference/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,73 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <!--
+    parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>reference-guide-en</artifactId>
+  <version>0.7</version>
+  <packaging>jdocbook</packaging>
+  <name>JBoss DNA Reference Guide</name>
+  <description>The reference guide for JBoss DNA developers and advanced users</description>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.jboss.maven.plugins</groupId>
+        <artifactId>maven-jdocbook-plugin</artifactId>
+        <version>2.1.2</version>
+        <extensions>true</extensions>
+        <dependencies>
+          <dependency>
+            <groupId>net.sf.docbook</groupId>
+            <artifactId>docbook</artifactId>
+            <version>1.74.0</version>
+          </dependency>
+          <dependency>
+            <groupId>org.jboss</groupId>
+            <artifactId>jbossorg-docbook-xslt</artifactId>
+            <version>1.1.0</version>
+          </dependency>
+          <dependency>
+            <groupId>org.jboss</groupId>
+            <artifactId>jbossorg-jdocbook-style</artifactId>
+            <version>1.1.0</version>
+            <type>jdocbook-style</type>
+          </dependency>
+        </dependencies>
+        <configuration>
+          <sourceDocumentName>master.xml</sourceDocumentName>
+           <imageResource>
+               <directory>${basedir}/src/main/docbook/en-US/images/</directory>
+               <includes>
+                 <include>*.png</include>
+               </includes>
+           </imageResource>
+          <targetDirectory>${basedir}/target/docbook/en-US</targetDirectory>
+          <formats>
+            <format>
+              <formatName>html</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/xhtml.xsl</stylesheetResource>
+              <finalName>index.html</finalName>
+            </format>
+            <format>
+              <formatName>html_single</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
+              <finalName>${project.artifactId}.html</finalName>
+            </format>
+            <format>
+              <formatName>pdf</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+              <finalName>${project.artifactId}.pdf</finalName>
+            </format>
+          </formats>
+          <options>
+            <xincludeSupported>true</xincludeSupported>
+            <xmlTransformerType>saxon</xmlTransformerType>
+            <!-- needed for uri-resolvers; can be ommitted if using 'current' uri scheme -->
+            <!--     could also locate the docbook dependency and inspect its version... -->
+            <docbookVersion>1.72.0</docbookVersion>          
+          </options>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-classloader-maven/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,104 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-classloader-maven</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Maven Classloader</name>
-  <description>JBoss DNA Maven Classloader</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-      Java Content Repository API 
-    -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-    </dependency>
-    <!-- 
-      Apache Jackrabbit (JCR Implementation) for testing purposes
-    -->
-		<dependency>
-			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-api</artifactId>
-			<version>1.4</version>
-			<scope>test</scope>
-			<!-- Exclude these since they are included in JDK 1.5 -->
-			<exclusions>
-				<exclusion>
-					<groupId>xml-apis</groupId>
-					<artifactId>xml-apis</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>xerces</groupId>
-					<artifactId>xercesImpl</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-core</artifactId>
-			<version>1.4.5</version>
-			<scope>test</scope>
-			<!-- Exclude these since they are included in JDK 1.5 -->
-			<exclusions>
-				<exclusion>
-					<groupId>xml-apis</groupId>
-					<artifactId>xml-apis</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>xerces</groupId>
-					<artifactId>xercesImpl</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-classloader-maven/pom.xml (from rev 1593, trunk/extensions/dna-classloader-maven/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-classloader-maven/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-classloader-maven/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,104 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-classloader-maven</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Maven Classloader</name>
+  <description>JBoss DNA Maven Classloader</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+      Java Content Repository API 
+    -->
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+    </dependency>
+    <!-- 
+      Apache Jackrabbit (JCR Implementation) for testing purposes
+    -->
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-api</artifactId>
+			<version>1.4</version>
+			<scope>test</scope>
+			<!-- Exclude these since they are included in JDK 1.5 -->
+			<exclusions>
+				<exclusion>
+					<groupId>xml-apis</groupId>
+					<artifactId>xml-apis</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>xerces</groupId>
+					<artifactId>xercesImpl</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-core</artifactId>
+			<version>1.4.5</version>
+			<scope>test</scope>
+			<!-- Exclude these since they are included in JDK 1.5 -->
+			<exclusions>
+				<exclusion>
+					<groupId>xml-apis</groupId>
+					<artifactId>xml-apis</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>xerces</groupId>
+					<artifactId>xercesImpl</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml
===================================================================
--- trunk/extensions/dna-connector-filesystem/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-connector-filesystem</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Connector to a local file system</name>
-  <description>JBoss DNA Connector that exposes the files and directories of (part of) a local file system.</description>
-  <url>http://labs.jboss.org/dna</url>
-  <!--
-    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
-    parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    JBoss DNA
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml (from rev 1593, trunk/extensions/dna-connector-filesystem/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-filesystem/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-connector-filesystem</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Connector to a local file system</name>
+  <description>JBoss DNA Connector that exposes the files and directories of (part of) a local file system.</description>
+  <url>http://labs.jboss.org/dna</url>
+  <!--
+    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
+    parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    JBoss DNA
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml
===================================================================
--- trunk/extensions/dna-connector-infinispan/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-connector-infinispan</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Connector to JBoss Infinispan</name>
-  <description>JBoss DNA Connector that accesses an in-process JBoss Infinispan instance.</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    Common
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    JBoss Cache
-    -->
-    <dependency>
-      <groupId>org.infinispan</groupId>
-      <artifactId>infinispan-core</artifactId>
-      <version>4.0.0.BETA1</version>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-  <dependency>
-    <groupId>net.jcip</groupId>
-    <artifactId>jcip-annotations</artifactId>
-  </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml (from rev 1593, trunk/extensions/dna-connector-infinispan/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-infinispan/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-connector-infinispan</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Connector to JBoss Infinispan</name>
+  <description>JBoss DNA Connector that accesses an in-process JBoss Infinispan instance.</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    Common
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    JBoss Cache
+    -->
+    <dependency>
+      <groupId>org.infinispan</groupId>
+      <artifactId>infinispan-core</artifactId>
+      <version>4.0.0.BETA1</version>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+  <dependency>
+    <groupId>net.jcip</groupId>
+    <artifactId>jcip-annotations</artifactId>
+  </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-connector-jbosscache</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Connector to JBoss Cache</name>
-  <description>JBoss DNA Connector that accesses an in-process JBoss Cache instance.</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    Common
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    JBoss Cache
-    -->
-    <dependency>
-      <groupId>org.jboss.cache</groupId>
-      <artifactId>jbosscache-core</artifactId>
-      <version>3.0.3.GA</version>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-  <dependency>
-    <groupId>net.jcip</groupId>
-    <artifactId>jcip-annotations</artifactId>
-  </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml (from rev 1593, trunk/extensions/dna-connector-jbosscache/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-connector-jbosscache</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Connector to JBoss Cache</name>
+  <description>JBoss DNA Connector that accesses an in-process JBoss Cache instance.</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    Common
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    JBoss Cache
+    -->
+    <dependency>
+      <groupId>org.jboss.cache</groupId>
+      <artifactId>jbosscache-core</artifactId>
+      <version>3.0.3.GA</version>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+  <dependency>
+    <groupId>net.jcip</groupId>
+    <artifactId>jcip-annotations</artifactId>
+  </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,99 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>dna</artifactId>
-		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-connector-jdbc-metadata</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA Connector to JDBC Schemas</name>
-	<description>JBoss DNA Connector that processes JDBC metadata</description>
-	<url>http://labs.jboss.org/dna</url>
-	<dependencies>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-c3p0</artifactId>
-			<version>3.3.0.GA</version>
-		</dependency>
-		<!--
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
-			binding for testing)
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-		</dependency>
-        <dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<artifactId>junit</artifactId>
-			<groupId>junit</groupId>
-			<version>4.4</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>hsqldb</groupId>
-			<artifactId>hsqldb</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-  <build>
-    <testResources>
-      <testResource>
-           <filtering>false</filtering>
-           <directory>src/test/resources</directory>
-           <includes>
-             <include>*</include>
-             <include>**/*</include>
-           </includes>
-       </testResource>
-	    <!-- Apply the properties set in the POM to the resource files -->
-      <testResource>
-        <filtering>true</filtering>
-        <directory>src/test/resources</directory>
-        <includes>
-          <include>database.properties</include>
-        </includes>
-      </testResource>
-    </testResources>
-  </build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml (from rev 1593, trunk/extensions/dna-connector-jdbc-metadata/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,98 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>dna</artifactId>
+		<groupId>org.jboss.dna</groupId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-connector-jdbc-metadata</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Connector to JDBC Schemas</name>
+	<description>JBoss DNA Connector that processes JDBC metadata</description>
+	<url>http://labs.jboss.org/dna</url>
+	<dependencies>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-c3p0</artifactId>
+			<version>3.3.0.GA</version>
+		</dependency>
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+		</dependency>
+        <dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<artifactId>junit</artifactId>
+			<groupId>junit</groupId>
+			<version>4.4</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>hsqldb</groupId>
+			<artifactId>hsqldb</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+  <build>
+    <testResources>
+      <testResource>
+           <filtering>false</filtering>
+           <directory>src/test/resources</directory>
+           <includes>
+             <include>*</include>
+             <include>**/*</include>
+           </includes>
+       </testResource>
+	    <!-- Apply the properties set in the POM to the resource files -->
+      <testResource>
+        <filtering>true</filtering>
+        <directory>src/test/resources</directory>
+        <includes>
+          <include>database.properties</include>
+        </includes>
+      </testResource>
+    </testResources>
+  </build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml
===================================================================
--- trunk/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-connector-store-jpa</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Connector to JPA Persistence Store</name>
-  <description>JBoss DNA Connector that persists graph content using JPA.</description>
-  <url>http://labs.jboss.org/dna</url>
-  <!--
-    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
-    parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    JBoss DNA
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <!-- 
-    JPA via Hibernate Entity Manager
-    -->
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-entitymanager</artifactId>
-      <version>3.4.0.GA</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-c3p0</artifactId>
-      <version>3.3.2.GA</version>
-    </dependency>
-    <!-- 
-    HSQLDB
-    -->
-    <dependency>
-      <groupId>hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-         <groupId>com.google.collections</groupId>
-         <artifactId>google-collections</artifactId>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-  <build>
-    <testResources>
-      <testResource>
-           <filtering>false</filtering>
-           <directory>src/test/resources</directory>
-           <includes>
-             <include>*</include>
-             <include>**/*</include>
-           </includes>
-       </testResource>
-	    <!-- Apply the properties set in the POM to the resource files -->
-      <testResource>
-        <filtering>true</filtering>
-        <directory>src/test/resources</directory>
-        <includes>
-          <include>database.properties</include>
-        </includes>
-      </testResource>
-    </testResources>
-  </build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml (from rev 1593, trunk/extensions/dna-connector-store-jpa/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-connector-store-jpa</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Connector to JPA Persistence Store</name>
+  <description>JBoss DNA Connector that persists graph content using JPA.</description>
+  <url>http://labs.jboss.org/dna</url>
+  <!--
+    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
+    parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    JBoss DNA
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <!-- 
+    JPA via Hibernate Entity Manager
+    -->
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-entitymanager</artifactId>
+      <version>3.4.0.GA</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-c3p0</artifactId>
+      <version>3.3.2.GA</version>
+    </dependency>
+    <!-- 
+    HSQLDB
+    -->
+    <dependency>
+      <groupId>hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+         <groupId>com.google.collections</groupId>
+         <artifactId>google-collections</artifactId>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+  <build>
+    <testResources>
+      <testResource>
+           <filtering>false</filtering>
+           <directory>src/test/resources</directory>
+           <includes>
+             <include>*</include>
+             <include>**/*</include>
+           </includes>
+       </testResource>
+	    <!-- Apply the properties set in the POM to the resource files -->
+      <testResource>
+        <filtering>true</filtering>
+        <directory>src/test/resources</directory>
+        <includes>
+          <include>database.properties</include>
+        </includes>
+      </testResource>
+    </testResources>
+  </build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-connector-svn/pom.xml
===================================================================
--- trunk/extensions/dna-connector-svn/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-connector-svn/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,101 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<artifactId>dna-connector-svn</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA Connector to SVN</name>
-	<description>
-		JBoss DNA Connector that accesses an in-process SVN instance.
-	</description>
-	<url>http://labs.jboss.org/dna</url>
-	<!--
-		Define the dependencies.  Note that all version and scopes default to those 
-		defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<!-- 
-			Common
-		-->
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<!-- 
-			SVNKit
-		-->
-		<dependency>
-			<groupId>org.tmatesoft.svnkit</groupId>
-			<artifactId>svnkit</artifactId>
-			<version>1.3.0.5847</version>
-		</dependency>
-		<dependency>
-			<groupId>com.sun.jna</groupId>
-			<artifactId>jna</artifactId>
-			<version>3.0.9</version>
-		</dependency>
-		<!-- 
-			Testing (note the scope)
-		-->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-		</dependency>
-		<!-- 
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-			Java Concurrency in Practice annotations
-		-->
-		<dependency>
-			<groupId>net.jcip</groupId>
-			<artifactId>jcip-annotations</artifactId>
-		</dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-connector-svn/pom.xml (from rev 1593, trunk/extensions/dna-connector-svn/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-connector-svn/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-connector-svn/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,101 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<artifactId>dna-connector-svn</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Connector to SVN</name>
+	<description>
+		JBoss DNA Connector that accesses an in-process SVN instance.
+	</description>
+	<url>http://labs.jboss.org/dna</url>
+	<!--
+		Define the dependencies.  Note that all version and scopes default to those 
+		defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<!-- 
+			Common
+		-->
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<!-- 
+			SVNKit
+		-->
+		<dependency>
+			<groupId>org.tmatesoft.svnkit</groupId>
+			<artifactId>svnkit</artifactId>
+			<version>1.3.0.5847</version>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.jna</groupId>
+			<artifactId>jna</artifactId>
+			<version>3.0.9</version>
+		</dependency>
+		<!-- 
+			Testing (note the scope)
+		-->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+		</dependency>
+		<!-- 
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+			Java Concurrency in Practice annotations
+		-->
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,248 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-mimetype-detector-aperture</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Aperture MIME-type detector</name>
-  <description>JBoss DNA MIME-type detector using Aperture library</description>
-  <url>http://labs.jboss.org/dna</url>
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-<!--
-    <dependency>
-      <groupId>org.apache.tika</groupId>
-      <artifactId>tika</artifactId>
-      <version>0.1-incubating</version>
-    </dependency>
--->
-    <!-- 
-    MIME-type detection and metadata extraction
-    -->
-    <dependency>
-      <groupId>org.semanticdesktop</groupId>
-      <artifactId>aperture</artifactId>
-      <version>1.1.0.Beta1</version>
-      <!-- Exclude these since they are not needed for MIME-type detection -->
-      <exclusions>
-        <exclusion>
-          <groupId>javax.activation</groupId>
-          <artifactId>activation</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.gnowsis</groupId>
-          <artifactId>applewrapper</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>bouncycastle</groupId>
-          <artifactId>bcmail-jdk14</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>bouncycastle</groupId>
-          <artifactId>bcprov-jdk14</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-codec</groupId>
-          <artifactId>commons-codec</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-httpclient</groupId>
-          <artifactId>commons-httpclient</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-lang</groupId>
-          <artifactId>commons-lang</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semanticdesktop</groupId>
-          <artifactId>demork</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>de.dfki</groupId>
-          <artifactId>utils</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.aetrion</groupId>
-          <artifactId>flickr</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.fontbox</groupId>
-          <artifactId>fontbox</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.htmlparser</groupId>
-          <artifactId>htmlparser</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>ical4j</groupId>
-          <artifactId>ical4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semanticdesktop.nepomuk</groupId>
-          <artifactId>infsail</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.jacob</groupId>
-          <artifactId>jacob</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.media</groupId>
-          <artifactId>jai-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.media</groupId>
-          <artifactId>jai-codec</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jaudiotagger</groupId>
-          <artifactId>jaudiotagger</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>jcl104-over-slf4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>net.wimpi</groupId>
-          <artifactId>pim</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>junit</groupId>
-          <artifactId>junit</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.beetstra.jutf7</groupId>
-          <artifactId>jutf7</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.mail</groupId>
-          <artifactId>mail</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.drewnoakes</groupId>
-          <artifactId>metadata-extractor</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>mstor</groupId>
-          <artifactId>mstor</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semanticdesktop.nepomuk</groupId>
-          <artifactId>nrlvalidator</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.openrdf</groupId>
-          <artifactId>openrdf-sesame-onejar-osgi</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.osgi</groupId>
-          <artifactId>org.osgi.core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>pdfbox</groupId>
-          <artifactId>pdfbox</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.poi</groupId>
-          <artifactId>poi</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.poi</groupId>
-          <artifactId>poi-scratchpad</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semweb4j</groupId>
-          <artifactId>rdf2go.impl.base</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semweb4j</groupId>
-          <artifactId>rdf2go.impl.sesame20</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semweb4j</groupId>
-          <artifactId>rdf2go.impl.util</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-jdk14</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.semanticdesktop.nepomuk</groupId>
-          <artifactId>unionsail</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>winlaf</groupId>
-          <artifactId>winlaf</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-	<dependency>
-	  <groupId>net.jcip</groupId>
-	  <artifactId>jcip-annotations</artifactId>
-	</dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml (from rev 1593, trunk/extensions/dna-mimetype-detector-aperture/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,248 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-mimetype-detector-aperture</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Aperture MIME-type detector</name>
+  <description>JBoss DNA MIME-type detector using Aperture library</description>
+  <url>http://labs.jboss.org/dna</url>
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+<!--
+    <dependency>
+      <groupId>org.apache.tika</groupId>
+      <artifactId>tika</artifactId>
+      <version>0.1-incubating</version>
+    </dependency>
+-->
+    <!-- 
+    MIME-type detection and metadata extraction
+    -->
+    <dependency>
+      <groupId>org.semanticdesktop</groupId>
+      <artifactId>aperture</artifactId>
+      <version>1.1.0.Beta1</version>
+      <!-- Exclude these since they are not needed for MIME-type detection -->
+      <exclusions>
+        <exclusion>
+          <groupId>javax.activation</groupId>
+          <artifactId>activation</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.gnowsis</groupId>
+          <artifactId>applewrapper</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>bouncycastle</groupId>
+          <artifactId>bcmail-jdk14</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>bouncycastle</groupId>
+          <artifactId>bcprov-jdk14</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>commons-codec</groupId>
+          <artifactId>commons-codec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>commons-httpclient</groupId>
+          <artifactId>commons-httpclient</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>commons-lang</groupId>
+          <artifactId>commons-lang</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semanticdesktop</groupId>
+          <artifactId>demork</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>de.dfki</groupId>
+          <artifactId>utils</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.aetrion</groupId>
+          <artifactId>flickr</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.fontbox</groupId>
+          <artifactId>fontbox</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.htmlparser</groupId>
+          <artifactId>htmlparser</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>ical4j</groupId>
+          <artifactId>ical4j</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semanticdesktop.nepomuk</groupId>
+          <artifactId>infsail</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.jacob</groupId>
+          <artifactId>jacob</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.media</groupId>
+          <artifactId>jai-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.media</groupId>
+          <artifactId>jai-codec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jaudiotagger</groupId>
+          <artifactId>jaudiotagger</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>jcl104-over-slf4j</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>net.wimpi</groupId>
+          <artifactId>pim</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.beetstra.jutf7</groupId>
+          <artifactId>jutf7</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.mail</groupId>
+          <artifactId>mail</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.drewnoakes</groupId>
+          <artifactId>metadata-extractor</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>mstor</groupId>
+          <artifactId>mstor</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semanticdesktop.nepomuk</groupId>
+          <artifactId>nrlvalidator</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.openrdf</groupId>
+          <artifactId>openrdf-sesame-onejar-osgi</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.osgi</groupId>
+          <artifactId>org.osgi.core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>pdfbox</groupId>
+          <artifactId>pdfbox</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.poi</groupId>
+          <artifactId>poi</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.poi</groupId>
+          <artifactId>poi-scratchpad</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semweb4j</groupId>
+          <artifactId>rdf2go.impl.base</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semweb4j</groupId>
+          <artifactId>rdf2go.impl.sesame20</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semweb4j</groupId>
+          <artifactId>rdf2go.impl.util</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-jdk14</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.semanticdesktop.nepomuk</groupId>
+          <artifactId>unionsail</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>winlaf</groupId>
+          <artifactId>winlaf</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+	<dependency>
+	  <groupId>net.jcip</groupId>
+	  <artifactId>jcip-annotations</artifactId>
+	</dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-search-lucene/pom.xml
===================================================================
--- trunk/extensions/dna-search-lucene/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-search-lucene/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-search-lucene</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Search Engine for Lucene</name>
-  <description>JBoss DNA Search Engine that uses Lucene.</description>
-  <url>http://labs.jboss.org/dna</url>
-  <!--
-    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
-    parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    JBoss DNA
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <!-- 
-    Lucene
-    -->
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>3.0.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers</artifactId>
-      <version>3.0.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-snowball</artifactId>
-      <version>3.0.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-regex</artifactId>
-      <version>3.0.0</version>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-search-lucene/pom.xml (from rev 1593, trunk/extensions/dna-search-lucene/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-search-lucene/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-search-lucene/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-search-lucene</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Search Engine for Lucene</name>
+  <description>JBoss DNA Search Engine that uses Lucene.</description>
+  <url>http://labs.jboss.org/dna</url>
+  <!--
+    Define the dependencies. Note that all version and scopes default to those defined in the dependencyManagement section of the
+    parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    JBoss DNA
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <!-- 
+    Lucene
+    -->
+    <dependency>
+      <groupId>org.apache.lucene</groupId>
+      <artifactId>lucene-core</artifactId>
+      <version>3.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lucene</groupId>
+      <artifactId>lucene-analyzers</artifactId>
+      <version>3.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lucene</groupId>
+      <artifactId>lucene-snowball</artifactId>
+      <version>3.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.lucene</groupId>
+      <artifactId>lucene-regex</artifactId>
+      <version>3.0.0</version>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,66 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-classfile</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Java Class File Sequencer</name>
-  
-  <description>JBoss DNA Sequencer that processes Java class files</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>javassist</groupId>
-      <artifactId>javassist</artifactId>
-      <version>3.11.0.GA</version>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-classfile/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,66 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-classfile</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Java Class File Sequencer</name>
+  
+  <description>JBoss DNA Sequencer that processes Java class files</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>    
+    <dependency>
+      <groupId>javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <version>3.11.0.GA</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,51 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-sequencer-cnd</artifactId>
-  <name>JBoss DNA CND Sequencer</name>
-  <description>JBoss DNA Sequencer that processes JCR CND files</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-cnd</artifactId>
-		</dependency>
-    
-    <!-- Testing -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-cnd/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,51 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-sequencer-cnd</artifactId>
+  <name>JBoss DNA CND Sequencer</name>
+  <description>JBoss DNA Sequencer that processes JCR CND files</description>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-cnd</artifactId>
+		</dependency>
+    
+    <!-- Testing -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,88 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-ddl</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA DDL Sequencer</name>
-  <description>JBoss DNA Sequencer that processes DDL files</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <!-- 
-    Common
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-    <dependency>
-      <groupId>net.jcip</groupId>
-      <artifactId>jcip-annotations</artifactId>
-    </dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>

Copied: tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-ddl/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,87 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-ddl</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA DDL Sequencer</name>
+  <description>JBoss DNA Sequencer that processes DDL files</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <!-- 
+    Common
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+    <dependency>
+      <groupId>net.jcip</groupId>
+      <artifactId>jcip-annotations</artifactId>
+    </dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>

Deleted: tags/dna-0.7/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-images/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,92 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-images</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Image Sequencer</name>
-  <description>JBoss DNA Sequencer that processes PNG, JPEG, GIF and other image files</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    Common
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-	<dependency>
-	  <groupId>net.jcip</groupId>
-	  <artifactId>jcip-annotations</artifactId>
-	</dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-images/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-images/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-images/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-images/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,92 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-images</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Image Sequencer</name>
+  <description>JBoss DNA Sequencer that processes PNG, JPEG, GIF and other image files</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    Common
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+	<dependency>
+	  <groupId>net.jcip</groupId>
+	  <artifactId>jcip-annotations</artifactId>
+	</dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-java/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-java/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-java/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,136 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-sequencer-java</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA Java Sequencer</name>
-	<description>
-		JBoss DNA Sequencer that processes java sources
-	</description>
-	<url>http://labs.jboss.org/dna</url>
-	<!--
-		Define the dependencies.  Note that all version and scopes default to those 
-		defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<!-- 
-			Common
-		-->
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<!-- 
-			Testing (note the scope)
-		-->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-library</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-		</dependency>
-		<!-- 
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-			Java Concurrency in Practice annotations
-		-->
-		<dependency>
-			<groupId>net.jcip</groupId>
-			<artifactId>jcip-annotations</artifactId>
-		</dependency>
-		<!-- 
-			Eclipse Java Development Tools (JDT) parser and its (many) required libraries
-		-->
-    <dependency>
-      <groupId>org.eclipse</groupId>
-      <artifactId>osgi</artifactId>
-      <version>3.4.3.R34x_v20081215-1030</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jdt</groupId>
-      <artifactId>core</artifactId>
-      <version>3.4.2.v_883_R34x</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.core</groupId>
-      <artifactId>resources</artifactId>
-      <version>[3.2.0,4.0.0)</version>
-      <exclusions>
-        <exclusion>
-			    <groupId>org.eclipse.core.runtime.compatibility</groupId>
-			    <artifactId>auth</artifactId>
-        </exclusion>
-        <exclusion>
-			    <groupId>org.eclipse.equinox</groupId>
-			    <artifactId>app</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.core</groupId>
-      <artifactId>runtime</artifactId>
-      <version>[3.2.0,4.0.0)</version>
-      <exclusions>
-        <exclusion>
-			    <groupId>org.eclipse.core.runtime.compatibility</groupId>
-			    <artifactId>auth</artifactId>
-        </exclusion>
-        <exclusion>
-			    <groupId>org.eclipse.equinox</groupId>
-			    <artifactId>app</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-java/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-java/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-java/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-java/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,136 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-sequencer-java</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA Java Sequencer</name>
+	<description>
+		JBoss DNA Sequencer that processes java sources
+	</description>
+	<url>http://labs.jboss.org/dna</url>
+	<!--
+		Define the dependencies.  Note that all version and scopes default to those 
+		defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<!-- 
+			Common
+		-->
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<!-- 
+			Testing (note the scope)
+		-->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+		</dependency>
+		<!-- 
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+			Java Concurrency in Practice annotations
+		-->
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+		<!-- 
+			Eclipse Java Development Tools (JDT) parser and its (many) required libraries
+		-->
+    <dependency>
+      <groupId>org.eclipse</groupId>
+      <artifactId>osgi</artifactId>
+      <version>3.4.3.R34x_v20081215-1030</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jdt</groupId>
+      <artifactId>core</artifactId>
+      <version>3.4.2.v_883_R34x</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.core</groupId>
+      <artifactId>resources</artifactId>
+      <version>[3.2.0,4.0.0)</version>
+      <exclusions>
+        <exclusion>
+			    <groupId>org.eclipse.core.runtime.compatibility</groupId>
+			    <artifactId>auth</artifactId>
+        </exclusion>
+        <exclusion>
+			    <groupId>org.eclipse.equinox</groupId>
+			    <artifactId>app</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.core</groupId>
+      <artifactId>runtime</artifactId>
+      <version>[3.2.0,4.0.0)</version>
+      <exclusions>
+        <exclusion>
+			    <groupId>org.eclipse.core.runtime.compatibility</groupId>
+			    <artifactId>auth</artifactId>
+        </exclusion>
+        <exclusion>
+			    <groupId>org.eclipse.equinox</groupId>
+			    <artifactId>app</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,116 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
-	<packaging>jar</packaging>
-	<version>0.7-SNAPSHOT</version>
-	<name>JBoss DNA jBPM jPDL Sequencer</name>
-	<description>
-		JBoss DNA Sequencer that processes jPDL XML document
-	</description>
-	<url>http://labs.jboss.org/dna</url>
-	<!--
-		Define the dependencies.  Note that all version and scopes default to those 
-		defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<!-- 
-			Common
-		-->
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<!-- 
-			jBPM jPDL 
-		-->
-		<dependency>
-			<groupId>org.jbpm</groupId>
-			<artifactId>jbpm-jpdl</artifactId>
-			<version>3.2.2</version>
-		</dependency>
-		<dependency>
-			<groupId>dom4j</groupId>
-			<artifactId>dom4j</artifactId>
-			<version>1.6.1</version>
-		</dependency>
-		<!-- 
-			Testing (note the scope)
-		-->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-library</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-		</dependency>
-		<!-- 
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-			Java Concurrency in Practice annotations
-		-->
-		<dependency>
-			<groupId>net.jcip</groupId>
-			<artifactId>jcip-annotations</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>1.4</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-			<version>2.4</version>
-		</dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,116 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
+	<packaging>jar</packaging>
+	<version>0.7</version>
+	<name>JBoss DNA jBPM jPDL Sequencer</name>
+	<description>
+		JBoss DNA Sequencer that processes jPDL XML document
+	</description>
+	<url>http://labs.jboss.org/dna</url>
+	<!--
+		Define the dependencies.  Note that all version and scopes default to those 
+		defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<!-- 
+			Common
+		-->
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<!-- 
+			jBPM jPDL 
+		-->
+		<dependency>
+			<groupId>org.jbpm</groupId>
+			<artifactId>jbpm-jpdl</artifactId>
+			<version>3.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>1.6.1</version>
+		</dependency>
+		<!-- 
+			Testing (note the scope)
+		-->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+		</dependency>
+		<!-- 
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+			Java Concurrency in Practice annotations
+		-->
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.4</version>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,34 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-mp3</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA MP3 Sequencer</name>
-  <description>JBoss DNA Sequencer that processes MP3 audio files</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jaudiotagger</groupId>
-      <artifactId>jaudiotagger</artifactId>
-      <version>1.0.8</version>
-   </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-mp3/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-mp3</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA MP3 Sequencer</name>
+  <description>JBoss DNA Sequencer that processes MP3 audio files</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jaudiotagger</groupId>
+      <artifactId>jaudiotagger</artifactId>
+      <version>1.0.8</version>
+   </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,63 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-msoffice</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Microsoft Office Sequencer</name>
-  <description>JBoss DNA Sequencer that processes Microsoft Office files and searches for common metadata</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.poi</groupId>
-        <artifactId>poi</artifactId>
-        <version>3.2-FINAL</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.poi</groupId>
-        <artifactId>poi-scratchpad</artifactId>
-        <version>3.2-FINAL</version>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-msoffice/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,63 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-msoffice</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Microsoft Office Sequencer</name>
+  <description>JBoss DNA Sequencer that processes Microsoft Office files and searches for common metadata</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.poi</groupId>
+        <artifactId>poi</artifactId>
+        <version>3.2-FINAL</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.poi</groupId>
+        <artifactId>poi-scratchpad</artifactId>
+        <version>3.2-FINAL</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-text/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-text/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-text/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,60 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-text</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Text File Sequencer</name>
-  <description>JBoss DNA Sequencer that processes fixed width and delimited text files</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-text/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-text/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-text/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-text/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,60 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-text</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Text File Sequencer</name>
+  <description>JBoss DNA Sequencer that processes fixed width and delimited text files</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,92 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-xml</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA XML Sequencer</name>
-  <description>JBoss DNA Sequencer that processes XML files</description>
-  <url>http://labs.jboss.org/dna</url>
-  
-  <!--
-  Define the dependencies.  Note that all version and scopes default to those 
-  defined in the dependencyManagement section of the parent pom.
-  -->
-  <dependencies>
-    <!-- 
-    Common
-    -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
-    Testing (note the scope)
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <!-- 
-    Java Concurrency in Practice annotations
-    -->
-	<dependency>
-	  <groupId>net.jcip</groupId>
-	  <artifactId>jcip-annotations</artifactId>
-	</dependency>
-  </dependencies>
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-xml/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-xml/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,92 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-xml</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA XML Sequencer</name>
+  <description>JBoss DNA Sequencer that processes XML files</description>
+  <url>http://labs.jboss.org/dna</url>
+  
+  <!--
+  Define the dependencies.  Note that all version and scopes default to those 
+  defined in the dependencyManagement section of the parent pom.
+  -->
+  <dependencies>
+    <!-- 
+    Common
+    -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- 
+    Testing (note the scope)
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <!-- 
+    Java Concurrency in Practice annotations
+    -->
+	<dependency>
+	  <groupId>net.jcip</groupId>
+	  <artifactId>jcip-annotations</artifactId>
+	</dependency>
+  </dependencies>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-zip/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,62 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>dna</artifactId>
-    <groupId>org.jboss.dna</groupId>
-    <version>0.7-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-sequencer-zip</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA ZIP Sequencer</name>
-  <description>JBoss DNA Sequencer that processes zip files and extracts content to repository</description>
-  <url>http://labs.jboss.org/dna</url>
-  <dependencies>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit-dep</artifactId>
-      <version>4.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-    </dependency>
-    <!-- 
-    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
-    -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml (from rev 1593, trunk/extensions/dna-sequencer-zip/pom.xml)
===================================================================
--- tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml	                        (rev 0)
+++ tags/dna-0.7/extensions/dna-sequencer-zip/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,62 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>dna</artifactId>
+    <groupId>org.jboss.dna</groupId>
+    <version>0.7</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-sequencer-zip</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA ZIP Sequencer</name>
+  <description>JBoss DNA Sequencer that processes zip files and extracts content to repository</description>
+  <url>http://labs.jboss.org/dna</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit-dep</artifactId>
+      <version>4.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+    </dependency>
+    <!-- 
+    Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
+    -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,1034 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>org.jboss.dna</groupId>
-	<artifactId>dna</artifactId>
-	<version>0.7-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<name>JBoss DNA</name>
-	<url>http://www.jboss.org/dna</url>
-	<inceptionYear>2008</inceptionYear>
-	<description>
-		JBoss DNA is a JCR repository implementation with support for federation and sequencing.
-	</description>
-	<scm>
-		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/trunk</connection>
-    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/trunk</developerConnection>   
-	</scm>
-  <issueManagement>
-    <system>jira</system>
-    <url>http://jira.jboss.org/jira/browse/DNA</url>
-  </issueManagement>
-	<licenses>
-		<license>
-			<name>GNU Lesser General Public License</name>
-			<url>http://repository.jboss.org/licenses/lgpl-2.1.txt</url>
-			<!--url>http://www.gnu.org/licenses/lgpl.html</url-->
-			<distribution>repo</distribution>
-			<comments>A business-friendly OSS license</comments>
-		</license>
-	</licenses>
-	<organization>
-		<name>JBoss, a division of Red Hat</name>
-		<url>http://www.jboss.org</url>
-	</organization>
-	<developers>
-		<developer>
-			<name>Randall Hauch</name>
-			<id>randall</id>
-			<email>rhauch at redhat.com</email>
-			<organization>JBoss, a division of Red Hat</organization>
-			<roles>
-				<role>Project Lead</role>
-				<role>Developer</role>
-			</roles>
-			<timezone>-6</timezone>
-		</developer>
-		<developer>
-			<name>John Verhaeg</name>
-			<id>johnny</id>
-			<email>jverhaeg at redhat.com</email>
-			<organization>JBoss, a division of Red Hat</organization>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>-6</timezone>
-		</developer>
-		<developer>
-			<name>Dan Florian</name>
-			<id>dan</id>
-			<email>dflorian at redhat.com</email>
-			<organization>JBoss, a division of Red Hat</organization>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>-6</timezone>
-		</developer>
-		<developer>
-			<name>Stefano Maestri</name>
-			<id>stefano</id>
-			<email>stefano.maestri at javalinux.it</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>+1</timezone>
-		</developer>
-		<developer>
-			<name>Serge Pagop</name>
-			<id>spagop</id>
-			<email>Serge.Pagop at innoq.com</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>+1</timezone>
-		</developer>
-		<developer>
-			<name>Michael Trezzi</name>
-			<id>mathwizard</id>
-			<email>michael at mathwizard.org</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>+1</timezone>
-		</developer>
-		<developer>
-			<name>Alexandre Porcelli</name>
-			<id>porcelli</id>
-			<email>porcelli at devexp.com.br</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>-3</timezone>
-		</developer>
-		<developer>
-			<name>Sergiy Litsenko</name>
-			<id>lisbor</id>
-			<email>litsenko_sergey at yahoo.com</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>+10</timezone>
-		</developer>
-	</developers>
-	<contributors>
-		<contributor>
-			<name>Greg Haber</name>
-			<organization>JBoss, a division of Red Hat</organization>
-			<timezone>-5</timezone>
-		</contributor>
-	</contributors>
-	<modules>
-		<module>dna-common</module>
-		<module>dna-graph</module>
-		<module>dna-repository</module>
-		<module>dna-cnd</module>
-		<module>extensions/dna-search-lucene</module>
-		<module>dna-jcr</module>
-		<module>extensions/dna-classloader-maven</module>
-		<module>extensions/dna-sequencer-images</module>
-		<module>extensions/dna-sequencer-mp3</module>
-		<module>extensions/dna-sequencer-jbpm-jpdl</module>
-		<!--module>extensions/dna-sequencer-esbMessage</module-->
-		<module>extensions/dna-sequencer-cnd</module>
-		<module>extensions/dna-sequencer-java</module>
-		<module>extensions/dna-sequencer-classfile</module>
-		<module>extensions/dna-sequencer-msoffice</module>
-		<module>extensions/dna-sequencer-text</module>
-		<module>extensions/dna-sequencer-xml</module>
-		<module>extensions/dna-sequencer-zip</module>
-		<module>extensions/dna-sequencer-ddl</module>
-		<module>extensions/dna-connector-filesystem</module>
-		<module>extensions/dna-connector-infinispan</module>
-		<module>extensions/dna-connector-jbosscache</module>
-		<module>extensions/dna-connector-svn</module>
-		<module>extensions/dna-connector-store-jpa</module>
-		<module>extensions/dna-connector-jdbc-metadata</module> 
-		<module>extensions/dna-mimetype-detector-aperture</module>
-		<module>web/dna-web-jcr-rest</module> 
-		<module>web/dna-web-jcr-rest-client</module> 
-		<module>web/dna-web-jcr-rest-war</module> 
-		<module>utils/dna-jpa-ddl-gen</module> 
-	</modules>
-	<properties>
-		<!-- Instruct the build to use only UTF-8 encoding for source code -->
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<!-- These are properties used in the database profiles. Must initialize them to be empty so that Maven applies
-		     them via filtering to the resources. If a project needs files filtered, however, make sure to include
-		     a 'testResources' fragment in the 'build' section of the child project POM to say which files need to be filtered.
-		     See the "dna-integration" or "extensions/dna-connector-store-jpa" project POMs for examples. -->
-		<jpaSource.dialect/>
-		<jpaSource.driverClassName/>
-		<jpaSource.url/>
-		<jpaSource.username/>
-		<jpaSource.password/>
-		<jpaSource.maximumConnectionsInPool>1</jpaSource.maximumConnectionsInPool>
-		<jpaSource.minimumConnectionsInPool>0</jpaSource.minimumConnectionsInPool>
-		<jpaSource.numberOfConnectionsToAcquireAsNeeded>1</jpaSource.numberOfConnectionsToAcquireAsNeeded>
-		<jpaSource.maximumSizeOfStatementCache>100</jpaSource.maximumSizeOfStatementCache>
-		<jpaSource.maximumConnectionIdleTimeInSeconds>0</jpaSource.maximumConnectionIdleTimeInSeconds>
-		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
-		<jpaSource.largeValueSizeInBytes>150</jpaSource.largeValueSizeInBytes>
-		<jpaSource.autoGenerateSchema>create</jpaSource.autoGenerateSchema>
-		<jpaSource.compressData/>
-		<jpaSource.cacheTimeToLiveInMilliseconds/>
-		<jpaSource.creatingWorkspacesAllowed/>
-		<jpaSource.defaultWorkspaceName/>
-		<jpaSource.predefinedWorkspaceNames/>
-		<jpaSource.model/>
-		<jpaSource.numberOfConnectionsToAcquireAsNeeded/>
-		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
-		<jpaSource.retryLimit>3</jpaSource.retryLimit>
-		<jpaSource.rootNodeUuid/>
-		<jpaSource.showSql>false</jpaSource.showSql>
-    <metadata.collectorClassName>org.jboss.dna.connector.meta.jdbc.JdbcMetadataCollector</metadata.collectorClassName>
-	</properties>
-
-	<profiles>
-		<profile>
-			<id>release</id>
-			<modules>
-				<module>dna-integration-tests</module>
-				<module>docs</module>
-        <module>docs/examples/gettingstarted</module>
-			</modules>
-		</profile>
-		<profile>
-			<id>integration</id>
-			<modules>
-				<module>dna-integration-tests</module>
-        <module>docs/examples/gettingstarted</module>
-			</modules>
-		</profile>
-		<profile>
-			<id>jcr-tck</id>
-			<modules>
-				<module>dna-jcr-tck</module>
-			</modules>
-		</profile>
-		<profile>
-		    <!-- 
-			This profile is activated when the "generate.docs" property is set,
-			as in "mvn ... -Dgenerate.docs=true ..."
-		    -->
-	      <id>docs</id>
-	      <activation>
-	        <property>
-	          <name>generate.docs</name>
-	        </property>
-	      </activation>
-	      <modules>
-	        <module>docs</module>
-					<module>docs/examples/gettingstarted</module>
-	      </modules>
-		  <reporting>
-		    <plugins>
-		      <plugin>
-		        <groupId>org.apache.maven.plugins</groupId>
-		        <artifactId>maven-javadoc-plugin</artifactId>
-		        <configuration>
-		          <aggregate>true</aggregate>
-				  <show>public</show>
-				  <title>JBoss DNA ${project.version}</title>
-		        </configuration>
-		      </plugin>
-		    </plugins>
-		  </reporting>
-	    </profile>
-		<profile>
-		  <!-- 
-          This profile is activated manually, as in "mvn ... -P assembly ..."
-		  -->
-	      <id>assembly</id>
-	      <build>
-	        <plugins>
-	          <plugin>
-	            <artifactId>maven-assembly-plugin</artifactId>
-	            <inherited>false</inherited>
-	            <executions>
-	              <execution>
-	                <id>make-assembly</id>
-	                <phase>install</phase>
-	                <goals>
-	                  <goal>assembly</goal>
-	                </goals>
-	              </execution>
-	            </executions>
-	            <configuration>
-								<finalName>
-									jboss-dna-${project.version}
-								</finalName>
-			          <descriptors>
-									<descriptor>
-										build/assembly/examples.xml
-									</descriptor>
-									<descriptor>
-										build/assembly/javadoc.xml
-									</descriptor>
-									<descriptor>
-										build/assembly/dist.xml
-									</descriptor>
-									<descriptor>
-										build/assembly/src.xml
-									</descriptor>
-									<descriptor>
-										build/assembly/all.xml
-									</descriptor>
-								</descriptors>
-	            </configuration>
-	          </plugin>
-			      <plugin>
-			        <artifactId>maven-javadoc-plugin</artifactId>
-			        <version>2.5</version>
-			        <executions>
-			          <execution>
-			            <id>generate-javadoc</id>
-			            <phase>package</phase>
-			            <goals>
-			              <goal>javadoc</goal>
-			            </goals>
-			          </execution>
-			        </executions>
-			        <configuration>
-			          <doclet>org.jboss.apiviz.APIviz</doclet>
-			          <docletArtifact>
-			            <groupId>org.jboss.apiviz</groupId>
-			            <artifactId>apiviz</artifactId>
-			            <version>1.3.0.GA</version>
-			          </docletArtifact>
-			          <attach>false</attach>
-			          <!--stylesheetfile>${basedir}/src/javadoc/stylesheet.css</stylesheetfile-->
-			          <useStandardDocletOptions>true</useStandardDocletOptions>
-			          <outputDirectory>${project.build.directory}/apidoc</outputDirectory>
-			          <reportOutputDirectory>${project.build.directory}/apidoc</reportOutputDirectory>
-			          <destDir>apidoc</destDir>
-			          <charset>UTF-8</charset>
-			          <docencoding>UTF-8</docencoding>
-			          <breakiterator>true</breakiterator>
-			          <version>true</version>
-			          <author>true</author>
-			          <keywords>true</keywords>
-			          <overview>${basedir}/src/javadoc/overview.html</overview>
-			          <doctitle>${project.name} API Reference (${project.version})</doctitle>
-			          <windowtitle>${project.name} API Reference (${project.version})</windowtitle>
-			          <maxmemory>1024m</maxmemory>
-			          <additionalparam>
-			            -link http://java.sun.com/javase/6/docs/api/
-			            -link http://java.sun.com/products/servlet/2.5/docs/servlet-2_5-mr2/
-			            -link http://www.slf4j.org/apidocs/
-			            -link http://logging.apache.org/log4j/1.2/apidocs/
-
-			            -group "JCR implementation" ${project.groupId}.jcr*:${project.groupId}.cnd*
-			            -group "Repository engine" ${project.groupId}.repository*
-			            -group "Graph API" ${project.groupId}.graph:${project.groupId}.graph.io*:${project.groupId}.graph.property*:${project.groupId}.graph.request*:${project.groupId}.graph.session*:${project.groupId}.graph.xml*
-			            -group "Connectors" ${project.groupId}.graph.cache*:${project.groupId}.graph.connector*:${project.groupId}.connector*
-			            -group "Observation" ${project.groupId}.graph.observation*
-			            -group "Sequencers" ${project.groupId}.graph.sequencer*:${project.groupId}.sequencer*
-			            -group "MIME type detectors" ${project.groupId}.graph.mimetype*:${project.groupId}.mimetype*
-			            -group "Web services" ${project.groupId}.web*
-			            -group "Common utilities" ${project.groupId}.common*
-
-			            -nopackagediagram
-			          </additionalparam>
-			          <encoding>UTF-8</encoding>
-			          <locale>en_US</locale>
-			          <excludePackageNames>${project.groupId}.test*:org.jboss.example.dna*</excludePackageNames>
-			        </configuration>
-			      </plugin>
-	        </plugins>
-	      </build>
-	      <modules>
-					<module>dna-integration-tests</module>
-	        <module>docs</module>
-	        <module>docs/examples/gettingstarted</module>
-	      </modules>
-			  <reporting>
-			    <plugins>
-			      <plugin>
-			        <groupId>org.apache.maven.plugins</groupId>
-			        <artifactId>maven-javadoc-plugin</artifactId>
-			        <configuration>
-			          <aggregate>true</aggregate>
-							  <show>public</show>
-							  <title>JBoss DNA ${project.version}</title>
-			        </configuration>
-			      </plugin>
-			    </plugins>
-			  </reporting>
-	    </profile>
-	
-      <!--
-          ###################################################################
-          Database profiles to specify which DBMS is used for tests.
-          ###################################################################
-
-          To use, specify "-Ddatbase=<dbProfileName>" on the Maven command line.
-      -->
-
-      <!-- The default test environment is HSQLDB (may eventually move to H2) -->
-      <profile>
-          <id>default_dbms</id>
-		      <activation>
-		        <property>
-		          <name>!database</name>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>hsqldb</groupId>
-              <artifactId>hsqldb</artifactId>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>hsqldb</database>
-            <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
-            <jpaSource.username>sa</jpaSource.username>
-            <jpaSource.password />
-          </properties>
-      </profile>
-
-      <!-- The HSQLDB test environment -->
-      <profile>
-          <id>hsqldb</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>h2</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>hsqldb</groupId>
-              <artifactId>hsqldb</artifactId>
-              <version>1.8.0.2</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>hsqldb</database>
-            <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
-            <jpaSource.username>sa</jpaSource.username>
-            <jpaSource.password />
-          </properties>
-      </profile>
-
-      <!-- The H2 test environment -->
-
-      <profile>
-          <id>h2</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>h2</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>org.h2database</groupId>
-              <artifactId>h2database</artifactId>
-              <version>1.0.20061217</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>h2</database>
-            <jpaSource.dialect>org.hibernate.dialect.H2Dialect</jpaSource.dialect>
-            <jpaSource.driverClassName>org.h2.Driver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:h2:mem:target/test/db/h2/dna</jpaSource.url>
-            <jpaSource.username>sa</jpaSource.username>
-            <jpaSource.password />
-          </properties>
-      </profile>
-
-      <!-- The PostgreSQL test environment, local to the developer -->
-      <!--profile>
-          <id>postgresql_local</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>postgresql_local</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>postgresql</groupId>
-              <artifactId>postgresql</artifactId>
-              <version>8.4-701.jdbc3</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-            <jpaSource.dialect>org.hibernate.dialect.PostgreSQLDialect</jpaSource.dialect>
-            <jpaSource.driver>org.postgresql.Driver</jpaSource.driver>
-            <jpaSource.url>jdbc:postgresql://localhost/unit_test</jpaSource.url>
-            <jpaSource.username>postgres</jpaSource.username>
-            <jpaSource.password>data</jpaSource.password>
-          </properties>
-      </profile-->
-
-      <!--
-          ###################################################################
-          Profiles naming db instances in the Red Hat QA/QE lab
-          First, those with OSS drivers
-          ###################################################################
-      -->
-
-      <!-- The MySQL5 test environment -->
-      <profile>
-          <id>mysql5</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>mysql5</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>mysql</groupId>
-              <artifactId>mysql-connector-java</artifactId>
-              <version>5.0.5</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>mysql5</database>
-            <jpaSource.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>com.mysql.jdbc.Driver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:mysql://vmg02.mw.lab.eng.bos.redhat.com/jbossdna</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!-- The PostgreSQL test environment -->
-      <profile>
-          <id>postgresql8</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>postgresql8</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>postgresql</groupId>
-              <artifactId>postgresql</artifactId>
-              <version>8.4-701.jdbc3</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>postgresql8</database>
-            <jpaSource.dialect>org.hibernate.dialect.PostgreSQLDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>org.postgresql.Driver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:postgresql://vmg03.mw.lab.eng.bos.redhat.com:5432:jbossdna</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!--
-          ###################################################################
-          Then, those with commercial drivers
-          ###################################################################
-      -->
-
-      <!-- The DB2 9.x test environment (using 9x drivers)-->
-      <profile>
-          <id>db2v9</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>db2v9</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>com.ibm</groupId>
-              <artifactId>db2jcc</artifactId>
-              <version>3.8.47</version>
-            </dependency>
-            <dependency>
-              <groupId>com.ibm</groupId>
-              <artifactId>db2jcc_license_cu</artifactId>
-              <version>3.8.47</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>db2v9</database>
-            <jpaSource.dialect>org.hibernate.dialect.DB2Dialect</jpaSource.dialect>
-            <jpaSource.driverClassName>com.ibm.db2.jcc.DB2Driver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:db2://vmg06.mw.lab.eng.bos.redhat.com:50000/jbossqa</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!-- The Oracle10g test environment -->
-      <profile>
-          <id>oracle10g</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>oracle10g</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>com.oracle</groupId>
-              <artifactId>ojdbc14</artifactId>
-              <!-- use the 10g drivers which are surprisingly largely bug free -->
-              <version>10.0.2.0</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>oracle10g</database>
-            <jpaSource.dialect>org.hibernate.dialect.Oracle10gDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>oracle.jdbc.driver.OracleDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:oracle:thin:@vmg05.mw.lab.eng.bos.redhat.com:1521:QAORA10</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!-- The Oracle11g test environment -->
-      <profile>
-          <id>oracle11g</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>oracle11g</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>com.oracle</groupId>
-              <artifactId>ojdbc6</artifactId>
-              <version>11.1.0.7.0</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>oracle11g</database>
-            <jpaSource.dialect>org.hibernate.dialect.Oracle10gDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>oracle.jdbc.driver.OracleDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:oracle:thin:@dev04.qa.atl2.redhat.com:1521:qaora11</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!-- The Sybase 15 test environment -->
-      <profile>
-          <id>sybase15</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>sybase15</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>com.sybase</groupId>
-              <artifactId>jconnect</artifactId>
-              <version>6.0.5</version>
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>sybase15</database>
-            <jpaSource.dialect>org.hibernate.dialect.SybaseDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>com.sybase.jdbc3.jdbc.SybDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:sybase:Tds:vmg07.mw.lab.eng.bos.redhat.com:5000/jbossdna</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-      <!-- The SQLServer2008 (MS JDBC) test environment -->
-      <profile>
-          <id>mssql2008</id>
-		      <activation>
-		        <property>
-		          <name>database</name>
-		          <value>mssql2008</value>
-		        </property>
-		      </activation>
-          <dependencies>
-            <dependency>
-              <groupId>com.microsoft.sqlserver</groupId>
-              <artifactId>msjdbc</artifactId>
-              <version>2.0.1008.2</version>
-              <classifier>4</classifier><!-- Must use the JDBC-4 driver on JDK6 -->
-              <scope>test</scope>
-            </dependency>
-          </dependencies>
-          <properties>
-		        <database>mssql2008</database>
-		        <metadata.collectorClassName>org.jboss.dna.connector.meta.jdbc.SqlServerMetadataCollector</metadata.collectorClassName>
-            <jpaSource.dialect>org.hibernate.dialect.SQLServerDialect</jpaSource.dialect>
-            <jpaSource.driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</jpaSource.driverClassName>
-            <jpaSource.url>jdbc:sqlserver://vmg04.mw.lab.eng.bos.redhat.com</jpaSource.url>
-            <jpaSource.username>jbossdna</jpaSource.username>
-            <jpaSource.password>jbossdna</jpaSource.password>
-          </properties>
-      </profile>
-
-	</profiles>
-	<build>
-		<!-- This section defines the default plugin settings inherited by child projects. -->
-		<pluginManagement>
-			<plugins>
-				<!-- Fixes how test resources of a project can be used in projects dependent on it  -->
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-jar-plugin</artifactId>
-					<version>2.2</version>
-				</plugin>
-				<plugin>
-			    	<groupId>org.apache.felix</groupId>
-			    	<artifactId>maven-bundle-plugin</artifactId>
-			    	<extensions>true</extensions>
-					<version>1.4.3</version>
-			   </plugin>
-			</plugins>
-		</pluginManagement>
-		<plugins>
-			<!-- Specify the compiler options and settings -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-               <version>2.0.2</version>
-				<configuration>
-					<source>1.5</source>
-					<target>1.5</target>
-					<showDeprecation>false</showDeprecation>
-					<showWarnings>false</showWarnings>
-				</configuration>
-			</plugin>
-			<!-- Produce source jars during the 'verify' phase -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<phase>verify</phase>
-						<goals>
-							<goal>jar</goal>
-							<goal>test-jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<includes>
-						<include>**/*TestCase.java</include>
-						<include>**/*Test.java</include>
-					</includes>
-					<!--excludes>
-						<exclude>**/Abstract*TestCase.java</exclude>
-						<exclude>**/Abstract*Test.java</exclude>
-					</excludes-->
-					<systemProperties>
-						<property>
-							<name>java.io.tmpdir</name>
-							<value>${basedir}/target</value>
-						</property>
-					</systemProperties>
-				</configuration>
-			</plugin>
-			
-			<!-- DNA-600 Bug - version 2.7 has a bug -->
-			<plugin>
-		      <groupId>org.apache.maven.plugins</groupId>
-		      <artifactId>maven-eclipse-plugin</artifactId>
-		      <version>2.6</version>
-		    </plugin>
-			<!-- 
-           Build a test-jar for each project, so that src/test/* resources and classes can be used
-           in other projects.  Also customize how the jar files are assembled.
-           -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<executions>
-					<execution>
-						<goals>
-							<goal>test-jar</goal>
-						</goals>
-					</execution>
-				</executions>
-				<configuration>
-					<archive>
-						<manifest>
-							<addDefaultSpecificationEntries>
-								true
-							</addDefaultSpecificationEntries>
-							<addDefaultImplementationEntries>
-								true
-							</addDefaultImplementationEntries>
-						</manifest>
-						<manifestEntries>
-							<Implementation-URL>
-								${project.url}
-							</Implementation-URL>
-						</manifestEntries>
-					</archive>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	<!--
-	This section defines the default dependency settings inherited by child projects.
-	Note that this section does not add dependencies, but rather provide default settings.
-	-->
-	<dependencyManagement>
-		<dependencies>
-			<!-- DNA subprojects -->
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-common</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-classloader-maven</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-graph</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-cnd</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-search-lucene</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-repository</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-jcr</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-jcr-tck</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-jbosscache</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-store-jpa</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-filesystem</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-svn</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-mimetype-detector-aperture</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-cnd</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-images</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-java</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-mp3</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-msoffice</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-xml</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-zip</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-web-jcr-rest</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-web-jcr-rest-client</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-web-jcr-rest-war</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<!-- 
-		    Time and Date
-		    -->
-			<dependency>
-				<groupId>joda-time</groupId>
-				<artifactId>joda-time</artifactId>
-				<version>1.4</version>
-			</dependency>
-			<!-- Testing (note the scope) -->
-			<dependency>
-				<groupId>junit</groupId>
-				<artifactId>junit</artifactId>
-				<version>4.4</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.hamcrest</groupId>
-				<artifactId>hamcrest-library</artifactId>
-				<version>1.1</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.mockito</groupId>
-				<artifactId>mockito-all</artifactId>
-				<version>1.5</version>
-				<scope>test</scope>
-			</dependency>
-			<!-- Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) -->
-			<dependency>
-				<groupId>org.slf4j</groupId>
-				<artifactId>slf4j-api</artifactId>
-				<version>1.5.8</version>
-				<scope>compile</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.slf4j</groupId>
-				<artifactId>slf4j-log4j12</artifactId>
-				<version>1.5.8</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>log4j</groupId>
-				<artifactId>log4j</artifactId>
-				<version>1.2.14</version>
-				<scope>test</scope>
-			</dependency>
-			<!-- Java Concurrency in Practice annotations -->
-			<dependency>
-				<groupId>net.jcip</groupId>
-				<artifactId>jcip-annotations</artifactId>
-				<version>1.0</version>
-				<scope>compile</scope>
-			</dependency>
-			<!-- Java Content Repository API -->
-			<dependency>
-				<groupId>javax.jcr</groupId>
-				<artifactId>jcr</artifactId>
-				<version>1.0.1</version>
-				<scope>compile</scope>
-			</dependency>
-		    <!-- 
-		      Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
-		    -->
-	    <dependency>
-         <groupId>com.google.collections</groupId>
-         <artifactId>google-collections</artifactId>
-	      <version>1.0-rc3</version>
-	    </dependency>
-	    <dependency>
-				<groupId>org.apache.jackrabbit</groupId>
-				<artifactId>jackrabbit-jcr-tests</artifactId>
-				<version>1.4</version>
-				<scope>test</scope>
-		    </dependency>
-			<!-- Databases and JDBC Drivers -->
-			<dependency>
-				<groupId>mysql</groupId>
-				<artifactId>mysql-connector-java</artifactId>
-				<version>5.0.7</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.derby</groupId>
-				<artifactId>derby</artifactId>
-				<version>10.2.1.6</version>
-				<scope>test</scope>
-			</dependency>
-      <dependency>
-        <groupId>hsqldb</groupId>
-        <artifactId>hsqldb</artifactId>
-        <version>1.8.0.2</version>
-        <scope>test</scope>
-      </dependency>
-		</dependencies>
-	</dependencyManagement>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-				<version>2.4.3</version>
-			</plugin>
-	    </plugins>
-	</reporting>
-
-	<repositories>
-		<repository>
-			<id>jboss</id>
-			<url>http://repository.jboss.com/maven2</url>
-		</repository>
-		<repository>
-			<id>jboss-snapshot</id>
-			<url>http://snapshots.jboss.org/maven2</url>
-		</repository>
-	</repositories>
-	<distributionManagement>
-		<repository>
-			<!-- Copy the distribution jar file to a local checkout of the maven repository 
- 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
-			<id>repository.jboss.org</id>
-			<url>file://${jboss.repository.root}</url>
-		</repository>
-	</distributionManagement>
-</project>

Copied: tags/dna-0.7/pom.xml (from rev 1593, trunk/pom.xml)
===================================================================
--- tags/dna-0.7/pom.xml	                        (rev 0)
+++ tags/dna-0.7/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,1034 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.jboss.dna</groupId>
+	<artifactId>dna</artifactId>
+	<version>0.7</version>
+	<packaging>pom</packaging>
+	<name>JBoss DNA</name>
+	<url>http://www.jboss.org/dna</url>
+	<inceptionYear>2008</inceptionYear>
+	<description>
+		JBoss DNA is a JCR repository implementation with support for federation and sequencing.
+	</description>
+	<scm>
+		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/tags/dna-0.7</connection>
+    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.7</developerConnection>   
+	</scm>
+  <issueManagement>
+    <system>jira</system>
+    <url>http://jira.jboss.org/jira/browse/DNA</url>
+  </issueManagement>
+	<licenses>
+		<license>
+			<name>GNU Lesser General Public License</name>
+			<url>http://repository.jboss.org/licenses/lgpl-2.1.txt</url>
+			<!--url>http://www.gnu.org/licenses/lgpl.html</url-->
+			<distribution>repo</distribution>
+			<comments>A business-friendly OSS license</comments>
+		</license>
+	</licenses>
+	<organization>
+		<name>JBoss, a division of Red Hat</name>
+		<url>http://www.jboss.org</url>
+	</organization>
+	<developers>
+		<developer>
+			<name>Randall Hauch</name>
+			<id>randall</id>
+			<email>rhauch at redhat.com</email>
+			<organization>JBoss, a division of Red Hat</organization>
+			<roles>
+				<role>Project Lead</role>
+				<role>Developer</role>
+			</roles>
+			<timezone>-6</timezone>
+		</developer>
+		<developer>
+			<name>John Verhaeg</name>
+			<id>johnny</id>
+			<email>jverhaeg at redhat.com</email>
+			<organization>JBoss, a division of Red Hat</organization>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>-6</timezone>
+		</developer>
+		<developer>
+			<name>Dan Florian</name>
+			<id>dan</id>
+			<email>dflorian at redhat.com</email>
+			<organization>JBoss, a division of Red Hat</organization>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>-6</timezone>
+		</developer>
+		<developer>
+			<name>Stefano Maestri</name>
+			<id>stefano</id>
+			<email>stefano.maestri at javalinux.it</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>+1</timezone>
+		</developer>
+		<developer>
+			<name>Serge Pagop</name>
+			<id>spagop</id>
+			<email>Serge.Pagop at innoq.com</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>+1</timezone>
+		</developer>
+		<developer>
+			<name>Michael Trezzi</name>
+			<id>mathwizard</id>
+			<email>michael at mathwizard.org</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>+1</timezone>
+		</developer>
+		<developer>
+			<name>Alexandre Porcelli</name>
+			<id>porcelli</id>
+			<email>porcelli at devexp.com.br</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>-3</timezone>
+		</developer>
+		<developer>
+			<name>Sergiy Litsenko</name>
+			<id>lisbor</id>
+			<email>litsenko_sergey at yahoo.com</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>+10</timezone>
+		</developer>
+	</developers>
+	<contributors>
+		<contributor>
+			<name>Greg Haber</name>
+			<organization>JBoss, a division of Red Hat</organization>
+			<timezone>-5</timezone>
+		</contributor>
+	</contributors>
+	<modules>
+		<module>dna-common</module>
+		<module>dna-graph</module>
+		<module>dna-repository</module>
+		<module>dna-cnd</module>
+		<module>extensions/dna-search-lucene</module>
+		<module>dna-jcr</module>
+		<module>extensions/dna-classloader-maven</module>
+		<module>extensions/dna-sequencer-images</module>
+		<module>extensions/dna-sequencer-mp3</module>
+		<module>extensions/dna-sequencer-jbpm-jpdl</module>
+		<!--module>extensions/dna-sequencer-esbMessage</module-->
+		<module>extensions/dna-sequencer-cnd</module>
+		<module>extensions/dna-sequencer-java</module>
+		<module>extensions/dna-sequencer-classfile</module>
+		<module>extensions/dna-sequencer-msoffice</module>
+		<module>extensions/dna-sequencer-text</module>
+		<module>extensions/dna-sequencer-xml</module>
+		<module>extensions/dna-sequencer-zip</module>
+		<module>extensions/dna-sequencer-ddl</module>
+		<module>extensions/dna-connector-filesystem</module>
+		<module>extensions/dna-connector-infinispan</module>
+		<module>extensions/dna-connector-jbosscache</module>
+		<module>extensions/dna-connector-svn</module>
+		<module>extensions/dna-connector-store-jpa</module>
+		<module>extensions/dna-connector-jdbc-metadata</module> 
+		<module>extensions/dna-mimetype-detector-aperture</module>
+		<module>web/dna-web-jcr-rest</module> 
+		<module>web/dna-web-jcr-rest-client</module> 
+		<module>web/dna-web-jcr-rest-war</module> 
+		<module>utils/dna-jpa-ddl-gen</module> 
+	</modules>
+	<properties>
+		<!-- Instruct the build to use only UTF-8 encoding for source code -->
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<!-- These are properties used in the database profiles. Must initialize them to be empty so that Maven applies
+		     them via filtering to the resources. If a project needs files filtered, however, make sure to include
+		     a 'testResources' fragment in the 'build' section of the child project POM to say which files need to be filtered.
+		     See the "dna-integration" or "extensions/dna-connector-store-jpa" project POMs for examples. -->
+		<jpaSource.dialect />
+		<jpaSource.driverClassName />
+		<jpaSource.url />
+		<jpaSource.username />
+		<jpaSource.password />
+		<jpaSource.maximumConnectionsInPool>1</jpaSource.maximumConnectionsInPool>
+		<jpaSource.minimumConnectionsInPool>0</jpaSource.minimumConnectionsInPool>
+		<jpaSource.numberOfConnectionsToAcquireAsNeeded>1</jpaSource.numberOfConnectionsToAcquireAsNeeded>
+		<jpaSource.maximumSizeOfStatementCache>100</jpaSource.maximumSizeOfStatementCache>
+		<jpaSource.maximumConnectionIdleTimeInSeconds>0</jpaSource.maximumConnectionIdleTimeInSeconds>
+		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
+		<jpaSource.largeValueSizeInBytes>150</jpaSource.largeValueSizeInBytes>
+		<jpaSource.autoGenerateSchema>create</jpaSource.autoGenerateSchema>
+		<jpaSource.compressData />
+		<jpaSource.cacheTimeToLiveInMilliseconds />
+		<jpaSource.creatingWorkspacesAllowed />
+		<jpaSource.defaultWorkspaceName />
+		<jpaSource.predefinedWorkspaceNames />
+		<jpaSource.model />
+		<jpaSource.numberOfConnectionsToAcquireAsNeeded />
+		<jpaSource.referentialIntegrityEnforced>true</jpaSource.referentialIntegrityEnforced>
+		<jpaSource.retryLimit>3</jpaSource.retryLimit>
+		<jpaSource.rootNodeUuid />
+		<jpaSource.showSql>false</jpaSource.showSql>
+    <metadata.collectorClassName>org.jboss.dna.connector.meta.jdbc.JdbcMetadataCollector</metadata.collectorClassName>
+	</properties>
+
+	<profiles>
+		<profile>
+			<id>release</id>
+			<modules>
+				<module>dna-integration-tests</module>
+				<module>docs</module>
+        <module>docs/examples/gettingstarted</module>
+			</modules>
+		</profile>
+		<profile>
+			<id>integration</id>
+			<modules>
+				<module>dna-integration-tests</module>
+        <module>docs/examples/gettingstarted</module>
+			</modules>
+		</profile>
+		<profile>
+			<id>jcr-tck</id>
+			<modules>
+				<module>dna-jcr-tck</module>
+			</modules>
+		</profile>
+		<profile>
+		    <!-- 
+			This profile is activated when the "generate.docs" property is set,
+			as in "mvn ... -Dgenerate.docs=true ..."
+		    -->
+	      <id>docs</id>
+	      <activation>
+	        <property>
+	          <name>generate.docs</name>
+	        </property>
+	      </activation>
+	      <modules>
+	        <module>docs</module>
+					<module>docs/examples/gettingstarted</module>
+	      </modules>
+		  <reporting>
+		    <plugins>
+		      <plugin>
+		        <groupId>org.apache.maven.plugins</groupId>
+		        <artifactId>maven-javadoc-plugin</artifactId>
+		        <configuration>
+		          <aggregate>true</aggregate>
+				  <show>public</show>
+				  <title>JBoss DNA ${project.version}</title>
+		        </configuration>
+		      </plugin>
+		    </plugins>
+		  </reporting>
+	    </profile>
+		<profile>
+		  <!-- 
+          This profile is activated manually, as in "mvn ... -P assembly ..."
+		  -->
+	      <id>assembly</id>
+	      <build>
+	        <plugins>
+	          <plugin>
+	            <artifactId>maven-assembly-plugin</artifactId>
+	            <inherited>false</inherited>
+	            <executions>
+	              <execution>
+	                <id>make-assembly</id>
+	                <phase>install</phase>
+	                <goals>
+	                  <goal>assembly</goal>
+	                </goals>
+	              </execution>
+	            </executions>
+	            <configuration>
+								<finalName>
+									jboss-dna-${project.version}
+								</finalName>
+			          <descriptors>
+									<descriptor>
+										build/assembly/examples.xml
+									</descriptor>
+									<descriptor>
+										build/assembly/javadoc.xml
+									</descriptor>
+									<descriptor>
+										build/assembly/dist.xml
+									</descriptor>
+									<descriptor>
+										build/assembly/src.xml
+									</descriptor>
+									<descriptor>
+										build/assembly/all.xml
+									</descriptor>
+								</descriptors>
+	            </configuration>
+	          </plugin>
+			      <plugin>
+			        <artifactId>maven-javadoc-plugin</artifactId>
+			        <version>2.5</version>
+			        <executions>
+			          <execution>
+			            <id>generate-javadoc</id>
+			            <phase>package</phase>
+			            <goals>
+			              <goal>javadoc</goal>
+			            </goals>
+			          </execution>
+			        </executions>
+			        <configuration>
+			          <doclet>org.jboss.apiviz.APIviz</doclet>
+			          <docletArtifact>
+			            <groupId>org.jboss.apiviz</groupId>
+			            <artifactId>apiviz</artifactId>
+			            <version>1.3.0.GA</version>
+			          </docletArtifact>
+			          <attach>false</attach>
+			          <!--stylesheetfile>${basedir}/src/javadoc/stylesheet.css</stylesheetfile-->
+			          <useStandardDocletOptions>true</useStandardDocletOptions>
+			          <outputDirectory>${project.build.directory}/apidoc</outputDirectory>
+			          <reportOutputDirectory>${project.build.directory}/apidoc</reportOutputDirectory>
+			          <destDir>apidoc</destDir>
+			          <charset>UTF-8</charset>
+			          <docencoding>UTF-8</docencoding>
+			          <breakiterator>true</breakiterator>
+			          <version>true</version>
+			          <author>true</author>
+			          <keywords>true</keywords>
+			          <overview>${basedir}/src/javadoc/overview.html</overview>
+			          <doctitle>${project.name} API Reference (${project.version})</doctitle>
+			          <windowtitle>${project.name} API Reference (${project.version})</windowtitle>
+			          <maxmemory>1024m</maxmemory>
+			          <additionalparam>
+			            -link http://java.sun.com/javase/6/docs/api/
+			            -link http://java.sun.com/products/servlet/2.5/docs/servlet-2_5-mr2/
+			            -link http://www.slf4j.org/apidocs/
+			            -link http://logging.apache.org/log4j/1.2/apidocs/
+
+			            -group "JCR implementation" ${project.groupId}.jcr*:${project.groupId}.cnd*
+			            -group "Repository engine" ${project.groupId}.repository*
+			            -group "Graph API" ${project.groupId}.graph:${project.groupId}.graph.io*:${project.groupId}.graph.property*:${project.groupId}.graph.request*:${project.groupId}.graph.session*:${project.groupId}.graph.xml*
+			            -group "Connectors" ${project.groupId}.graph.cache*:${project.groupId}.graph.connector*:${project.groupId}.connector*
+			            -group "Observation" ${project.groupId}.graph.observation*
+			            -group "Sequencers" ${project.groupId}.graph.sequencer*:${project.groupId}.sequencer*
+			            -group "MIME type detectors" ${project.groupId}.graph.mimetype*:${project.groupId}.mimetype*
+			            -group "Web services" ${project.groupId}.web*
+			            -group "Common utilities" ${project.groupId}.common*
+
+			            -nopackagediagram
+			          </additionalparam>
+			          <encoding>UTF-8</encoding>
+			          <locale>en_US</locale>
+			          <excludePackageNames>${project.groupId}.test*:org.jboss.example.dna*</excludePackageNames>
+			        </configuration>
+			      </plugin>
+	        </plugins>
+	      </build>
+	      <modules>
+					<module>dna-integration-tests</module>
+	        <module>docs</module>
+	        <module>docs/examples/gettingstarted</module>
+	      </modules>
+			  <reporting>
+			    <plugins>
+			      <plugin>
+			        <groupId>org.apache.maven.plugins</groupId>
+			        <artifactId>maven-javadoc-plugin</artifactId>
+			        <configuration>
+			          <aggregate>true</aggregate>
+							  <show>public</show>
+							  <title>JBoss DNA ${project.version}</title>
+			        </configuration>
+			      </plugin>
+			    </plugins>
+			  </reporting>
+	    </profile>
+	
+      <!--
+          ###################################################################
+          Database profiles to specify which DBMS is used for tests.
+          ###################################################################
+
+          To use, specify "-Ddatbase=<dbProfileName>" on the Maven command line.
+      -->
+
+      <!-- The default test environment is HSQLDB (may eventually move to H2) -->
+      <profile>
+          <id>default_dbms</id>
+		      <activation>
+		        <property>
+		          <name>!database</name>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>hsqldb</groupId>
+              <artifactId>hsqldb</artifactId>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>hsqldb</database>
+            <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
+            <jpaSource.username>sa</jpaSource.username>
+            <jpaSource.password />
+          </properties>
+      </profile>
+
+      <!-- The HSQLDB test environment -->
+      <profile>
+          <id>hsqldb</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>h2</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>hsqldb</groupId>
+              <artifactId>hsqldb</artifactId>
+              <version>1.8.0.2</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>hsqldb</database>
+            <jpaSource.dialect>org.hibernate.dialect.HSQLDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>org.hsqldb.jdbcDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:hsqldb:mem:dna</jpaSource.url>
+            <jpaSource.username>sa</jpaSource.username>
+            <jpaSource.password />
+          </properties>
+      </profile>
+
+      <!-- The H2 test environment -->
+
+      <profile>
+          <id>h2</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>h2</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>org.h2database</groupId>
+              <artifactId>h2database</artifactId>
+              <version>1.0.20061217</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>h2</database>
+            <jpaSource.dialect>org.hibernate.dialect.H2Dialect</jpaSource.dialect>
+            <jpaSource.driverClassName>org.h2.Driver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:h2:mem:target/test/db/h2/dna</jpaSource.url>
+            <jpaSource.username>sa</jpaSource.username>
+            <jpaSource.password />
+          </properties>
+      </profile>
+
+      <!-- The PostgreSQL test environment, local to the developer -->
+      <!--profile>
+          <id>postgresql_local</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>postgresql_local</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>postgresql</groupId>
+              <artifactId>postgresql</artifactId>
+              <version>8.4-701.jdbc3</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+            <jpaSource.dialect>org.hibernate.dialect.PostgreSQLDialect</jpaSource.dialect>
+            <jpaSource.driver>org.postgresql.Driver</jpaSource.driver>
+            <jpaSource.url>jdbc:postgresql://localhost/unit_test</jpaSource.url>
+            <jpaSource.username>postgres</jpaSource.username>
+            <jpaSource.password>data</jpaSource.password>
+          </properties>
+      </profile-->
+
+      <!--
+          ###################################################################
+          Profiles naming db instances in the Red Hat QA/QE lab
+          First, those with OSS drivers
+          ###################################################################
+      -->
+
+      <!-- The MySQL5 test environment -->
+      <profile>
+          <id>mysql5</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>mysql5</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>mysql</groupId>
+              <artifactId>mysql-connector-java</artifactId>
+              <version>5.0.5</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>mysql5</database>
+            <jpaSource.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>com.mysql.jdbc.Driver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:mysql://vmg02.mw.lab.eng.bos.redhat.com/jbossdna</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!-- The PostgreSQL test environment -->
+      <profile>
+          <id>postgresql8</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>postgresql8</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>postgresql</groupId>
+              <artifactId>postgresql</artifactId>
+              <version>8.4-701.jdbc3</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>postgresql8</database>
+            <jpaSource.dialect>org.hibernate.dialect.PostgreSQLDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>org.postgresql.Driver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:postgresql://vmg03.mw.lab.eng.bos.redhat.com:5432:jbossdna</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!--
+          ###################################################################
+          Then, those with commercial drivers
+          ###################################################################
+      -->
+
+      <!-- The DB2 9.x test environment (using 9x drivers)-->
+      <profile>
+          <id>db2v9</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>db2v9</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>com.ibm</groupId>
+              <artifactId>db2jcc</artifactId>
+              <version>3.8.47</version>
+            </dependency>
+            <dependency>
+              <groupId>com.ibm</groupId>
+              <artifactId>db2jcc_license_cu</artifactId>
+              <version>3.8.47</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>db2v9</database>
+            <jpaSource.dialect>org.hibernate.dialect.DB2Dialect</jpaSource.dialect>
+            <jpaSource.driverClassName>com.ibm.db2.jcc.DB2Driver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:db2://vmg06.mw.lab.eng.bos.redhat.com:50000/jbossqa</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!-- The Oracle10g test environment -->
+      <profile>
+          <id>oracle10g</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>oracle10g</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>com.oracle</groupId>
+              <artifactId>ojdbc14</artifactId>
+              <!-- use the 10g drivers which are surprisingly largely bug free -->
+              <version>10.0.2.0</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>oracle10g</database>
+            <jpaSource.dialect>org.hibernate.dialect.Oracle10gDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>oracle.jdbc.driver.OracleDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:oracle:thin:@vmg05.mw.lab.eng.bos.redhat.com:1521:QAORA10</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!-- The Oracle11g test environment -->
+      <profile>
+          <id>oracle11g</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>oracle11g</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>com.oracle</groupId>
+              <artifactId>ojdbc6</artifactId>
+              <version>11.1.0.7.0</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>oracle11g</database>
+            <jpaSource.dialect>org.hibernate.dialect.Oracle10gDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>oracle.jdbc.driver.OracleDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:oracle:thin:@dev04.qa.atl2.redhat.com:1521:qaora11</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!-- The Sybase 15 test environment -->
+      <profile>
+          <id>sybase15</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>sybase15</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>com.sybase</groupId>
+              <artifactId>jconnect</artifactId>
+              <version>6.0.5</version>
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>sybase15</database>
+            <jpaSource.dialect>org.hibernate.dialect.SybaseDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>com.sybase.jdbc3.jdbc.SybDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:sybase:Tds:vmg07.mw.lab.eng.bos.redhat.com:5000/jbossdna</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+      <!-- The SQLServer2008 (MS JDBC) test environment -->
+      <profile>
+          <id>mssql2008</id>
+		      <activation>
+		        <property>
+		          <name>database</name>
+		          <value>mssql2008</value>
+		        </property>
+		      </activation>
+          <dependencies>
+            <dependency>
+              <groupId>com.microsoft.sqlserver</groupId>
+              <artifactId>msjdbc</artifactId>
+              <version>2.0.1008.2</version>
+              <classifier>4</classifier><!-- Must use the JDBC-4 driver on JDK6 -->
+              <scope>test</scope>
+            </dependency>
+          </dependencies>
+          <properties>
+		        <database>mssql2008</database>
+		        <metadata.collectorClassName>org.jboss.dna.connector.meta.jdbc.SqlServerMetadataCollector</metadata.collectorClassName>
+            <jpaSource.dialect>org.hibernate.dialect.SQLServerDialect</jpaSource.dialect>
+            <jpaSource.driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</jpaSource.driverClassName>
+            <jpaSource.url>jdbc:sqlserver://vmg04.mw.lab.eng.bos.redhat.com</jpaSource.url>
+            <jpaSource.username>jbossdna</jpaSource.username>
+            <jpaSource.password>jbossdna</jpaSource.password>
+          </properties>
+      </profile>
+
+	</profiles>
+	<build>
+		<!-- This section defines the default plugin settings inherited by child projects. -->
+		<pluginManagement>
+			<plugins>
+				<!-- Fixes how test resources of a project can be used in projects dependent on it  -->
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-jar-plugin</artifactId>
+					<version>2.2</version>
+				</plugin>
+				<plugin>
+			    	<groupId>org.apache.felix</groupId>
+			    	<artifactId>maven-bundle-plugin</artifactId>
+			    	<extensions>true</extensions>
+					<version>1.4.3</version>
+			   </plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<!-- Specify the compiler options and settings -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+               <version>2.0.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+					<showDeprecation>false</showDeprecation>
+					<showWarnings>false</showWarnings>
+				</configuration>
+			</plugin>
+			<!-- Produce source jars during the 'verify' phase -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>jar</goal>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<includes>
+						<include>**/*TestCase.java</include>
+						<include>**/*Test.java</include>
+					</includes>
+					<!--excludes>
+						<exclude>**/Abstract*TestCase.java</exclude>
+						<exclude>**/Abstract*Test.java</exclude>
+					</excludes-->
+					<systemProperties>
+						<property>
+							<name>java.io.tmpdir</name>
+							<value>${basedir}/target</value>
+						</property>
+					</systemProperties>
+				</configuration>
+			</plugin>
+			
+			<!-- DNA-600 Bug - version 2.7 has a bug -->
+			<plugin>
+		      <groupId>org.apache.maven.plugins</groupId>
+		      <artifactId>maven-eclipse-plugin</artifactId>
+		      <version>2.6</version>
+		    </plugin>
+			<!-- 
+           Build a test-jar for each project, so that src/test/* resources and classes can be used
+           in other projects.  Also customize how the jar files are assembled.
+           -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<archive>
+						<manifest>
+							<addDefaultSpecificationEntries>
+								true
+							</addDefaultSpecificationEntries>
+							<addDefaultImplementationEntries>
+								true
+							</addDefaultImplementationEntries>
+						</manifest>
+						<manifestEntries>
+							<Implementation-URL>
+								${project.url}
+							</Implementation-URL>
+						</manifestEntries>
+					</archive>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<!--
+	This section defines the default dependency settings inherited by child projects.
+	Note that this section does not add dependencies, but rather provide default settings.
+	-->
+	<dependencyManagement>
+		<dependencies>
+			<!-- DNA subprojects -->
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-common</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-classloader-maven</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-graph</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-cnd</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-search-lucene</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-repository</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-jcr</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-jcr-tck</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-jbosscache</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-store-jpa</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-filesystem</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-svn</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-mimetype-detector-aperture</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-cnd</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-images</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-java</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-mp3</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-msoffice</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-xml</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-zip</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-web-jcr-rest</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-web-jcr-rest-client</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-web-jcr-rest-war</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<!-- 
+		    Time and Date
+		    -->
+			<dependency>
+				<groupId>joda-time</groupId>
+				<artifactId>joda-time</artifactId>
+				<version>1.4</version>
+			</dependency>
+			<!-- Testing (note the scope) -->
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>4.4</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.hamcrest</groupId>
+				<artifactId>hamcrest-library</artifactId>
+				<version>1.1</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.mockito</groupId>
+				<artifactId>mockito-all</artifactId>
+				<version>1.5</version>
+				<scope>test</scope>
+			</dependency>
+			<!-- Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) -->
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>1.5.8</version>
+				<scope>compile</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-log4j12</artifactId>
+				<version>1.5.8</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>log4j</groupId>
+				<artifactId>log4j</artifactId>
+				<version>1.2.14</version>
+				<scope>test</scope>
+			</dependency>
+			<!-- Java Concurrency in Practice annotations -->
+			<dependency>
+				<groupId>net.jcip</groupId>
+				<artifactId>jcip-annotations</artifactId>
+				<version>1.0</version>
+				<scope>compile</scope>
+			</dependency>
+			<!-- Java Content Repository API -->
+			<dependency>
+				<groupId>javax.jcr</groupId>
+				<artifactId>jcr</artifactId>
+				<version>1.0.1</version>
+				<scope>compile</scope>
+			</dependency>
+		    <!-- 
+		      Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
+		    -->
+	    <dependency>
+         <groupId>com.google.collections</groupId>
+         <artifactId>google-collections</artifactId>
+	      <version>1.0-rc3</version>
+	    </dependency>
+	    <dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-jcr-tests</artifactId>
+				<version>1.4</version>
+				<scope>test</scope>
+		    </dependency>
+			<!-- Databases and JDBC Drivers -->
+			<dependency>
+				<groupId>mysql</groupId>
+				<artifactId>mysql-connector-java</artifactId>
+				<version>5.0.7</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.derby</groupId>
+				<artifactId>derby</artifactId>
+				<version>10.2.1.6</version>
+				<scope>test</scope>
+			</dependency>
+      <dependency>
+        <groupId>hsqldb</groupId>
+        <artifactId>hsqldb</artifactId>
+        <version>1.8.0.2</version>
+        <scope>test</scope>
+      </dependency>
+		</dependencies>
+	</dependencyManagement>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+				<version>2.4.3</version>
+			</plugin>
+	    </plugins>
+	</reporting>
+
+	<repositories>
+		<repository>
+			<id>jboss</id>
+			<url>http://repository.jboss.com/maven2</url>
+		</repository>
+		<repository>
+			<id>jboss-snapshot</id>
+			<url>http://snapshots.jboss.org/maven2</url>
+		</repository>
+	</repositories>
+	<distributionManagement>
+		<repository>
+			<!-- Copy the distribution jar file to a local checkout of the maven repository 
+ 			  -  This variable can be set in $MAVEN_HOME/conf/settings.xml -->
+			<id>repository.jboss.org</id>
+			<url>file://${jboss.repository.root}</url>
+		</repository>
+	</distributionManagement>
+</project>

Deleted: tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml
===================================================================
--- trunk/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,111 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-jpa-ddl-gen</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA JPA Connector DDL Generator</name>
-	<description>
-		Utility application to generate ddl for JBoss DNA JPA connector
-	</description>
-	<url>http://labs.jboss.org/dna</url>
-	<!--
-		Define the dependencies. Note that all version and scopes default to
-		those defined in the dependencyManagement section of the parent pom.
-	-->
-
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-assembly-plugin</artifactId>
-				<configuration>
-					<descriptorRefs>
-						<descriptorRef>jar-with-dependencies</descriptorRef>
-					</descriptorRefs>
-					<archive>
-						<manifest>
-							<addClasspath>true</addClasspath>
-							<mainClass>org.jboss.dna.util.SchemaGen</mainClass>
-						</manifest>
-					</archive>
-				</configuration>
-				<executions>
-					<execution>
-						<id>make-my-jar-with-dependencies</id>
-						<phase>package</phase>
-						<goals>
-							<goal>single</goal>
-						</goals>
-					</execution>
-				</executions>
- 			</plugin>
-		</plugins>
-	</build>
-
-	<dependencies>
-		<!-- 
-			Common
-		-->
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-connector-store-jpa</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-tools</artifactId>
-			<version>3.2.4.GA</version>
-		</dependency>
-		<!-- 
-			Testing (note the scope)
-		-->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-library</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<!--
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
-			binding for testing)
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		    <!--  This defaults to test scope; needs to be compile scope to be in executable JAR -->
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		    <!--  This defaults to test scope; needs to be compile scope to be in executable JAR -->
-			<scope>compile</scope>
-		</dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-</project>
\ No newline at end of file

Copied: tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml (from rev 1593, trunk/utils/dna-jpa-ddl-gen/pom.xml)
===================================================================
--- tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml	                        (rev 0)
+++ tags/dna-0.7/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,110 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-jpa-ddl-gen</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA JPA Connector DDL Generator</name>
+	<description>
+		Utility application to generate ddl for JBoss DNA JPA connector
+	</description>
+	<url>http://labs.jboss.org/dna</url>
+	<!--
+		Define the dependencies. Note that all version and scopes default to
+		those defined in the dependencyManagement section of the parent pom.
+	-->
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<configuration>
+					<descriptorRefs>
+						<descriptorRef>jar-with-dependencies</descriptorRef>
+					</descriptorRefs>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+							<mainClass>org.jboss.dna.util.SchemaGen</mainClass>
+						</manifest>
+					</archive>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-my-jar-with-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+ 			</plugin>
+		</plugins>
+	</build>
+
+	<dependencies>
+		<!-- 
+			Common
+		-->
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-connector-store-jpa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-tools</artifactId>
+			<version>3.2.4.GA</version>
+		</dependency>
+		<!-- 
+			Testing (note the scope)
+		-->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		    <!--  This defaults to test scope; needs to be compile scope to be in executable JAR -->
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		    <!--  This defaults to test scope; needs to be compile scope to be in executable JAR -->
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.7/web/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/web/dna-web-jcr-rest/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,76 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>dna</artifactId>
-		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<artifactId>dna-web-jcr-rest</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA JCR REST Library</name>
-	<description>JBoss DNA REST support library</description>
-	<url>http://labs.jboss.org/dna</url>
-	<dependencies>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxrs</artifactId>
-            <version>1.2.1.GA</version>
-        </dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jaxb-provider</artifactId>
-			<version>1.2.1.GA</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.sun.xml.bind</groupId>
-                    <artifactId>jaxb-impl</artifactId>
-                </exclusion>
-            </exclusions>
-		</dependency>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jettison-provider</artifactId>
-            <version>1.2.1.GA</version>
-        </dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-jcr</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-			<version>1.5.8</version>
-			<scope>runtime</scope>
-		</dependency>
-		<!-- 
-      Java Content Repository API 
-    -->
-		<dependency>
-			<groupId>javax.jcr</groupId>
-			<artifactId>jcr</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>servlet-api</artifactId>
-			<version>2.5</version>
-			<scope>provided</scope>
-		</dependency>
-
-		<!--  TESTING DEPENDENCIES -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit-dep</artifactId>
-			<version>4.4</version>
-			<scope>integration-test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>javax.xml.bind</groupId>
-			<artifactId>jaxb-api</artifactId>
-			<version>2.1</version>
-		</dependency>
-
-	</dependencies>
-</project>

Copied: tags/dna-0.7/web/dna-web-jcr-rest/pom.xml (from rev 1593, trunk/web/dna-web-jcr-rest/pom.xml)
===================================================================
--- tags/dna-0.7/web/dna-web-jcr-rest/pom.xml	                        (rev 0)
+++ tags/dna-0.7/web/dna-web-jcr-rest/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,76 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>dna</artifactId>
+		<groupId>org.jboss.dna</groupId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<artifactId>dna-web-jcr-rest</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA JCR REST Library</name>
+	<description>JBoss DNA REST support library</description>
+	<url>http://labs.jboss.org/dna</url>
+	<dependencies>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jaxrs</artifactId>
+            <version>1.2.1.GA</version>
+        </dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxb-provider</artifactId>
+			<version>1.2.1.GA</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </exclusion>
+            </exclusions>
+		</dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jettison-provider</artifactId>
+            <version>1.2.1.GA</version>
+        </dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.5.8</version>
+			<scope>runtime</scope>
+		</dependency>
+		<!-- 
+      Java Content Repository API 
+    -->
+		<dependency>
+			<groupId>javax.jcr</groupId>
+			<artifactId>jcr</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+
+		<!--  TESTING DEPENDENCIES -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit-dep</artifactId>
+			<version>4.4</version>
+			<scope>integration-test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>jaxb-api</artifactId>
+			<version>2.1</version>
+		</dependency>
+
+	</dependencies>
+</project>

Deleted: tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,347 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.jboss.dna</groupId>
-		<artifactId>dna</artifactId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<!-- The groupId and version values are inherited from parent -->
-	<artifactId>dna-web-jcr-rest-client</artifactId>
-	<packaging>jar</packaging>
-	<name>JBoss DNA JCR REST Client</name>
-	<description>JBoss DNA JCR REST client resource publishing
-	</description>
-	<url>http://labs.jboss.org/dna</url>
-	<!--
-		Define the dependencies. Note that all version and scopes default to
-		those defined in the dependencyManagement section of the parent pom.
-	-->
-	<dependencies>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-common</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-web-jcr-rest-war</artifactId>
-			<type>war</type>
-			<version>${project.version}</version>
-			<scope>integration-test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jaxrs</artifactId>
-			<version>1.2.1.GA</version>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jaxb-provider</artifactId>
-			<version>1.2.1.GA</version>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jettison-provider</artifactId>
-			<version>1.2.1.GA</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
-			<version>4.0</version>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-library</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-all</artifactId>
-		</dependency>
-		<!--
-			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
-			binding for testing)
-		-->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-		<!-- 
-        Java Concurrency in Practice annotations
-    -->
-		<dependency>
-			<groupId>net.jcip</groupId>
-			<artifactId>jcip-annotations</artifactId>
-		</dependency>
-	</dependencies>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin
-				</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-	<profiles>
-		<profile>
-			<id>cargo-1</id>
-			<activation>
-				<activeByDefault>true</activeByDefault>
-			</activation>
-			<build>
-				<pluginManagement>
-					<plugins>
-						<plugin>
-							<artifactId>maven-assembly-plugin
-							</artifactId>
-							<configuration>
-								<descriptorRefs>
-									<descriptorRef>jar-with-dependencies
-									</descriptorRef>
-								</descriptorRefs>
-							</configuration>
-							<executions>
-								<execution>
-									<id>create-project-bundle</id>
-									<phase>package</phase>
-									<goals>
-										<goal>single</goal>
-									</goals>
-								</execution>
-							</executions>
-						</plugin>
-					</plugins>
-				</pluginManagement>
-				<plugins>
-					<plugin>
-						<groupId>org.codehaus.cargo</groupId>
-						<artifactId>cargo-maven2-plugin</artifactId>
-						<!-- >version>1.0.1-SNAPSHOT</version -->
-						<executions>
-							<execution>
-								<id>start-container</id>
-								<phase>pre-integration-test</phase>
-								<goals>
-									<goal>start</goal>
-								</goals>
-							</execution>
-							<execution>
-								<id>stop-container</id>
-								<phase>post-integration-test</phase>
-								<goals>
-									<goal>stop</goal>
-								</goals>
-							</execution>
-						</executions>
-						<configuration>
-							<container>
-								<containerId>${cargo.container}</containerId>
-								<home>${cargo.container.home}</home>
-							</container>
-							<configuration>
-								<properties>
-									<cargo.logging>high</cargo.logging>
-									<cargo.servlet.users>
-										dnauser:password:connect,readwrite|unauthorized:password:bogus
-									</cargo.servlet.users>
-									<cargo.servlet.port>8080</cargo.servlet.port>
-								</properties>
-
-								<deployables>
-									<!-- application to deploy -->
-									<deployable>
-										<groupId>org.jboss.dna</groupId>
-										<artifactId>dna-web-jcr-rest-war
-										</artifactId>
-										<type>war</type>
-										<properties>
-											<context>resources</context>
-										</properties>
-									</deployable>
-								</deployables>
-							</configuration>
-							<wait>false</wait>
-						</configuration>
-					</plugin>
-					<!--
-						Override the default Surefire behavior to run during
-						integration-test phase
-					-->
-					<plugin>
-						<groupId>org.apache.maven.plugins
-						</groupId>
-						<artifactId>maven-surefire-plugin
-						</artifactId>
-						<configuration>
-							<skip>true</skip>
-						</configuration>
-						<executions>
-							<execution>
-								<id>surefire-it</id>
-								<phase>integration-test</phase>
-								<goals>
-									<goal>test</goal>
-								</goals>
-								<configuration>
-									<skip>false</skip>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-
-					<!--
-						Adding OSGI metadata to the JAR without changing the packaging
-						type.
-					-->
-					<plugin>
-						<artifactId>maven-jar-plugin</artifactId>
-						<configuration>
-							<archive>
-								<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-							</archive>
-						</configuration>
-					</plugin>
-					<plugin>
-						<groupId>org.apache.felix</groupId>
-						<artifactId>maven-bundle-plugin</artifactId>
-						<executions>
-							<execution>
-								<id>bundle-manifest</id>
-								<phase>process-classes</phase>
-								<goals>
-									<goal>manifest</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-		<profile>
-			<id>cargo-2</id>
-			<build>
-				<pluginManagement>
-					<plugins>
-						<plugin>
-							<artifactId>maven-assembly-plugin
-							</artifactId>
-							<configuration>
-								<descriptorRefs>
-									<descriptorRef>jar-with-dependencies
-									</descriptorRef>
-								</descriptorRefs>
-							</configuration>
-							<executions>
-								<execution>
-									<id>create-project-bundle</id>
-									<phase>package</phase>
-									<goals>
-										<goal>single</goal>
-									</goals>
-								</execution>
-							</executions>
-						</plugin>
-					</plugins>
-				</pluginManagement>
-				<plugins>
-					<plugin>
-						<groupId>org.codehaus.cargo</groupId>
-						<artifactId>cargo-maven2-plugin</artifactId>
-						<!-- >version>1.0.1-SNAPSHOT</version -->
-						<executions>
-							<execution>
-								<id>start-container</id>
-								<phase>pre-integration-test</phase>
-								<goals>
-									<goal>start</goal>
-								</goals>
-							</execution>
-							<execution>
-								<id>stop-container</id>
-								<phase>post-integration-test</phase>
-								<goals>
-									<goal>stop</goal>
-								</goals>
-							</execution>
-						</executions>
-						<configuration>
-							<container>
-								<containerId>${cargo.container}</containerId>
-								<home>${cargo.container.home}</home>
-							</container>
-							<configuration>
-								<properties>
-									<cargo.logging>high</cargo.logging>
-									<cargo.servlet.users>
-										dnauser2:password2:connect,readwrite|unauthorized:password:bogus
-									</cargo.servlet.users>
-									<cargo.servlet.port>8180</cargo.servlet.port>
-								</properties>
-
-								<deployables>
-									<!-- application to deploy -->
-									<deployable>
-										<groupId>org.jboss.dna</groupId>
-										<artifactId>dna-web-jcr-rest-war
-										</artifactId>
-										<type>war</type>
-										<properties>
-											<context>resources</context>
-										</properties>
-									</deployable>
-								</deployables>
-							</configuration>
-							<wait>false</wait>
-						</configuration>
-					</plugin>
-					<!--
-						Override the default Surefire behavior to run during
-						integration-test phase
-					-->
-					<plugin>
-						<groupId>org.apache.maven.plugins
-						</groupId>
-						<artifactId>maven-surefire-plugin
-						</artifactId>
-						<configuration>
-							<skip>true</skip>
-						</configuration>
-						<executions>
-							<execution>
-								<id>surefire-it</id>
-								<phase>integration-test</phase>
-								<goals>
-									<goal>test</goal>
-								</goals>
-								<configuration>
-									<skip>false</skip>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>

Copied: tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml (from rev 1593, trunk/web/dna-web-jcr-rest-client/pom.xml)
===================================================================
--- tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml	                        (rev 0)
+++ tags/dna-0.7/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,346 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.jboss.dna</groupId>
+		<artifactId>dna</artifactId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<!-- The groupId and version values are inherited from parent -->
+	<artifactId>dna-web-jcr-rest-client</artifactId>
+	<packaging>jar</packaging>
+	<name>JBoss DNA JCR REST Client</name>
+	<description>JBoss DNA JCR REST client resource publishing
+	</description>
+	<url>http://labs.jboss.org/dna</url>
+	<!--
+		Define the dependencies. Note that all version and scopes default to
+		those defined in the dependencyManagement section of the parent pom.
+	-->
+	<dependencies>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-common</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-web-jcr-rest-war</artifactId>
+			<type>war</type>
+			<version>${project.version}</version>
+			<scope>integration-test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxrs</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxb-provider</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jettison-provider</artifactId>
+			<version>1.2.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.0</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+		</dependency>
+		<!--
+			Logging (require SLF4J API for compiling, but use Log4J and its SLF4J
+			binding for testing)
+		-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+		</dependency>
+		<!-- 
+        Java Concurrency in Practice annotations
+    -->
+		<dependency>
+			<groupId>net.jcip</groupId>
+			<artifactId>jcip-annotations</artifactId>
+		</dependency>
+	</dependencies>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin
+				</artifactId>
+			</plugin>
+		</plugins>
+	</reporting>
+	<profiles>
+		<profile>
+			<id>cargo-1</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<build>
+				<pluginManagement>
+					<plugins>
+						<plugin>
+							<artifactId>maven-assembly-plugin
+							</artifactId>
+							<configuration>
+								<descriptorRefs>
+									<descriptorRef>jar-with-dependencies
+									</descriptorRef>
+								</descriptorRefs>
+							</configuration>
+							<executions>
+								<execution>
+									<id>create-project-bundle</id>
+									<phase>package</phase>
+									<goals>
+										<goal>single</goal>
+									</goals>
+								</execution>
+							</executions>
+						</plugin>
+					</plugins>
+				</pluginManagement>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.cargo</groupId>
+						<artifactId>cargo-maven2-plugin</artifactId>
+						<!-- >version>1.0.1-SNAPSHOT</version -->
+						<executions>
+							<execution>
+								<id>start-container</id>
+								<phase>pre-integration-test</phase>
+								<goals>
+									<goal>start</goal>
+								</goals>
+							</execution>
+							<execution>
+								<id>stop-container</id>
+								<phase>post-integration-test</phase>
+								<goals>
+									<goal>stop</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<container>
+								<containerId>${cargo.container}</containerId>
+								<home>${cargo.container.home}</home>
+							</container>
+							<configuration>
+								<properties>
+									<cargo.logging>high</cargo.logging>
+									<cargo.servlet.users>
+										dnauser:password:connect,readwrite|unauthorized:password:bogus
+									</cargo.servlet.users>
+									<cargo.servlet.port>8080</cargo.servlet.port>
+								</properties>
+
+								<deployables>
+									<!-- application to deploy -->
+									<deployable>
+										<groupId>org.jboss.dna</groupId>
+										<artifactId>dna-web-jcr-rest-war
+										</artifactId>
+										<type>war</type>
+										<properties>
+											<context>resources</context>
+										</properties>
+									</deployable>
+								</deployables>
+							</configuration>
+							<wait>false</wait>
+						</configuration>
+					</plugin>
+					<!--
+						Override the default Surefire behavior to run during
+						integration-test phase
+					-->
+					<plugin>
+						<groupId>org.apache.maven.plugins
+						</groupId>
+						<artifactId>maven-surefire-plugin
+						</artifactId>
+						<configuration>
+							<skip>true</skip>
+						</configuration>
+						<executions>
+							<execution>
+								<id>surefire-it</id>
+								<phase>integration-test</phase>
+								<goals>
+									<goal>test</goal>
+								</goals>
+								<configuration>
+									<skip>false</skip>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+
+					<!--
+						Adding OSGI metadata to the JAR without changing the packaging
+						type.
+					-->
+					<plugin>
+						<artifactId>maven-jar-plugin</artifactId>
+						<configuration>
+							<archive>
+								<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+							</archive>
+						</configuration>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.felix</groupId>
+						<artifactId>maven-bundle-plugin</artifactId>
+						<executions>
+							<execution>
+								<id>bundle-manifest</id>
+								<phase>process-classes</phase>
+								<goals>
+									<goal>manifest</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<id>cargo-2</id>
+			<build>
+				<pluginManagement>
+					<plugins>
+						<plugin>
+							<artifactId>maven-assembly-plugin
+							</artifactId>
+							<configuration>
+								<descriptorRefs>
+									<descriptorRef>jar-with-dependencies
+									</descriptorRef>
+								</descriptorRefs>
+							</configuration>
+							<executions>
+								<execution>
+									<id>create-project-bundle</id>
+									<phase>package</phase>
+									<goals>
+										<goal>single</goal>
+									</goals>
+								</execution>
+							</executions>
+						</plugin>
+					</plugins>
+				</pluginManagement>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.cargo</groupId>
+						<artifactId>cargo-maven2-plugin</artifactId>
+						<!-- >version>1.0.1-SNAPSHOT</version -->
+						<executions>
+							<execution>
+								<id>start-container</id>
+								<phase>pre-integration-test</phase>
+								<goals>
+									<goal>start</goal>
+								</goals>
+							</execution>
+							<execution>
+								<id>stop-container</id>
+								<phase>post-integration-test</phase>
+								<goals>
+									<goal>stop</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<container>
+								<containerId>${cargo.container}</containerId>
+								<home>${cargo.container.home}</home>
+							</container>
+							<configuration>
+								<properties>
+									<cargo.logging>high</cargo.logging>
+									<cargo.servlet.users>
+										dnauser2:password2:connect,readwrite|unauthorized:password:bogus
+									</cargo.servlet.users>
+									<cargo.servlet.port>8180</cargo.servlet.port>
+								</properties>
+
+								<deployables>
+									<!-- application to deploy -->
+									<deployable>
+										<groupId>org.jboss.dna</groupId>
+										<artifactId>dna-web-jcr-rest-war
+										</artifactId>
+										<type>war</type>
+										<properties>
+											<context>resources</context>
+										</properties>
+									</deployable>
+								</deployables>
+							</configuration>
+							<wait>false</wait>
+						</configuration>
+					</plugin>
+					<!--
+						Override the default Surefire behavior to run during
+						integration-test phase
+					-->
+					<plugin>
+						<groupId>org.apache.maven.plugins
+						</groupId>
+						<artifactId>maven-surefire-plugin
+						</artifactId>
+						<configuration>
+							<skip>true</skip>
+						</configuration>
+						<executions>
+							<execution>
+								<id>surefire-it</id>
+								<phase>integration-test</phase>
+								<goals>
+									<goal>test</goal>
+								</goals>
+								<configuration>
+									<skip>false</skip>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+</project>

Deleted: tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 03:02:19 UTC (rev 1592)
+++ tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -1,102 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>dna</artifactId>
-		<groupId>org.jboss.dna</groupId>
-		<version>0.7-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<artifactId>dna-web-jcr-rest-war</artifactId>
-	<packaging>war</packaging>
-	<name>JBoss DNA JCR REST Servlet</name>
-	<description>JBoss DNA servlet that provides RESTful access to JCR items</description>
-	<url>http://labs.jboss.org/dna</url>
-	<dependencies>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-web-jcr-rest</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-			<version>1.5.8</version>
-			<scope>runtime</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.sun.xml.bind</groupId>
-			<artifactId>jaxb-impl</artifactId>
-			<version>2.1.12</version>			
-			<scope>runtime</scope>
-		</dependency>
-
-		<!--  TESTING DEPENDENCIES -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit-dep</artifactId>
-			<version>4.4</version>
-			<scope>integration-test</scope>
-		</dependency>
-	</dependencies>
-	<build>
-		<finalName>resources</finalName>
-		<plugins>
-			<plugin>
-				<groupId>org.codehaus.cargo</groupId>
-				<artifactId>cargo-maven2-plugin</artifactId>
-				<!-- >version>1.0.1-SNAPSHOT</version -->
-				<executions>
-					<execution>
-						<id>start-container</id>
-						<phase>pre-integration-test</phase>
-						<goals>
-							<goal>start</goal>
-						</goals>
-					</execution>
-					<execution>
-						<id>stop-container</id>
-						<phase>post-integration-test</phase>
-						<goals>
-							<goal>stop</goal>
-						</goals>
-					</execution>
-				</executions>
-				<configuration>
-					<configuration>
-						<properties>
-							<cargo.logging>low</cargo.logging>
-							<cargo.servlet.users>dnauser:password:connect,readwrite|unauthorized:password:bogus</cargo.servlet.users>
-						</properties>
-					</configuration>
-					<wait>false</wait>
-				</configuration>
-			</plugin>
-			<!--
-				Override the default Surefire behavior to run during
-				integration-test phase
-			-->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-				<executions>
-					<execution>
-						<id>surefire-it</id>
-						<phase>integration-test</phase>
-						<goals>
-							<goal>test</goal>
-						</goals>
-						<configuration>
-							<skip>false</skip>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-
-	</build>
-
-</project>

Copied: tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml (from rev 1593, trunk/web/dna-web-jcr-rest-war/pom.xml)
===================================================================
--- tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml	                        (rev 0)
+++ tags/dna-0.7/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
@@ -0,0 +1,102 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>dna</artifactId>
+		<groupId>org.jboss.dna</groupId>
+		<version>0.7</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<artifactId>dna-web-jcr-rest-war</artifactId>
+	<packaging>war</packaging>
+	<name>JBoss DNA JCR REST Servlet</name>
+	<description>JBoss DNA servlet that provides RESTful access to JCR items</description>
+	<url>http://labs.jboss.org/dna</url>
+	<dependencies>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-web-jcr-rest</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.5.8</version>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-impl</artifactId>
+			<version>2.1.12</version>			
+			<scope>runtime</scope>
+		</dependency>
+
+		<!--  TESTING DEPENDENCIES -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit-dep</artifactId>
+			<version>4.4</version>
+			<scope>integration-test</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<finalName>resources</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.cargo</groupId>
+				<artifactId>cargo-maven2-plugin</artifactId>
+				<!-- >version>1.0.1-SNAPSHOT</version -->
+				<executions>
+					<execution>
+						<id>start-container</id>
+						<phase>pre-integration-test</phase>
+						<goals>
+							<goal>start</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>stop-container</id>
+						<phase>post-integration-test</phase>
+						<goals>
+							<goal>stop</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<configuration>
+						<properties>
+							<cargo.logging>low</cargo.logging>
+							<cargo.servlet.users>dnauser:password:connect,readwrite|unauthorized:password:bogus</cargo.servlet.users>
+						</properties>
+					</configuration>
+					<wait>false</wait>
+				</configuration>
+			</plugin>
+			<!--
+				Override the default Surefire behavior to run during
+				integration-test phase
+			-->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+				<executions>
+					<execution>
+						<id>surefire-it</id>
+						<phase>integration-test</phase>
+						<goals>
+							<goal>test</goal>
+						</goals>
+						<configuration>
+							<skip>false</skip>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+
+	</build>
+
+</project>


From dna-commits at lists.jboss.org  Mon Jan 11 14:11:53 2010
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 11 Jan 2010 14:11:53 -0500
Subject: [dna-commits] DNA SVN: r1595 - in trunk: dna-cnd and 35 other
	directories.
Message-ID: <201001111911.o0BJBrNU017971@svn01.web.mwc.hst.phx2.redhat.com>

Author: rhauch
Date: 2010-01-11 14:11:52 -0500 (Mon, 11 Jan 2010)
New Revision: 1595

Modified:
   trunk/dna-cnd/pom.xml
   trunk/dna-common/pom.xml
   trunk/dna-graph/pom.xml
   trunk/dna-integration-tests/pom.xml
   trunk/dna-jcr/pom.xml
   trunk/dna-repository/pom.xml
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/examples/gettingstarted/repositories/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/docs/gettingstarted/pom.xml
   trunk/docs/pom.xml
   trunk/docs/reference/pom.xml
   trunk/extensions/dna-classloader-maven/pom.xml
   trunk/extensions/dna-connector-filesystem/pom.xml
   trunk/extensions/dna-connector-infinispan/pom.xml
   trunk/extensions/dna-connector-jbosscache/pom.xml
   trunk/extensions/dna-connector-jdbc-metadata/pom.xml
   trunk/extensions/dna-connector-store-jpa/pom.xml
   trunk/extensions/dna-connector-svn/pom.xml
   trunk/extensions/dna-mimetype-detector-aperture/pom.xml
   trunk/extensions/dna-search-lucene/pom.xml
   trunk/extensions/dna-sequencer-classfile/pom.xml
   trunk/extensions/dna-sequencer-cnd/pom.xml
   trunk/extensions/dna-sequencer-ddl/pom.xml
   trunk/extensions/dna-sequencer-images/pom.xml
   trunk/extensions/dna-sequencer-java/pom.xml
   trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   trunk/extensions/dna-sequencer-mp3/pom.xml
   trunk/extensions/dna-sequencer-msoffice/pom.xml
   trunk/extensions/dna-sequencer-text/pom.xml
   trunk/extensions/dna-sequencer-xml/pom.xml
   trunk/extensions/dna-sequencer-zip/pom.xml
   trunk/pom.xml
   trunk/utils/dna-jpa-ddl-gen/pom.xml
   trunk/web/dna-web-jcr-rest-client/pom.xml
   trunk/web/dna-web-jcr-rest-war/pom.xml
   trunk/web/dna-web-jcr-rest/pom.xml
Log:
[maven-release-plugin] prepare for next development iteration

Modified: trunk/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-cnd/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna</groupId>

Modified: trunk/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-common/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
 	<artifactId>dna-common</artifactId>

Modified: trunk/dna-graph/pom.xml
===================================================================
--- trunk/dna-graph/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-graph/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-graph</artifactId>

Modified: trunk/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-integration-tests/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
 	<artifactId>dna-integration-tests</artifactId>

Modified: trunk/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-jcr/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-jcr</artifactId>

Modified: trunk/dna-repository/pom.xml
===================================================================
--- trunk/dna-repository/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/dna-repository/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-repository</artifactId>

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/examples/gettingstarted/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>getting_started</artifactId>
   <packaging>pom</packaging>
-  <version>0.7</version>
+  <version>1.0.0.Beta1-SNAPSHOT</version>
   <name>JBoss DNA Getting Started examples</name>
   <description />
 

Modified: trunk/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-repositories</artifactId>
-  <version>0.7</version>
+  <version>1.0.0.Beta1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>JBoss DNA Repositories Examples</name>
   <description>Examples that showcase how to use DNA repositories.</description>

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-sequencers</artifactId>
-  <version>0.7</version>
+  <version>1.0.0.Beta1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>JBoss DNA Sequencer Examples</name>
   <description>Examples that showcase how to use sequencers with a JCR repository.</description>

Modified: trunk/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/gettingstarted/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
     parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
   <groupId>org.jboss.dna</groupId>
   <artifactId>getting-started-en</artifactId>
-  <version>0.7</version>
+  <version>1.0.0.Beta1-SNAPSHOT</version>
   <packaging>jdocbook</packaging>
   <name>JBoss DNA Getting Started manual</name>
   <description>The JBoss DNA Getting Started manual</description>

Modified: trunk/docs/pom.xml
===================================================================
--- trunk/docs/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.docs</groupId>

Modified: trunk/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/docs/reference/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
     parent> <groupId>org.jboss</groupId> <artifactId>documentation</artifactId> <version>1.0</version> </parent -->
   <groupId>org.jboss.dna</groupId>
   <artifactId>reference-guide-en</artifactId>
-  <version>0.7</version>
+  <version>1.0.0.Beta1-SNAPSHOT</version>
   <packaging>jdocbook</packaging>
   <name>JBoss DNA Reference Guide</name>
   <description>The reference guide for JBoss DNA developers and advanced users</description>

Modified: trunk/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-filesystem/pom.xml
===================================================================
--- trunk/extensions/dna-connector-filesystem/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-filesystem/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-infinispan/pom.xml
===================================================================
--- trunk/extensions/dna-connector-infinispan/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-infinispan/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-jbosscache/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-jbosscache/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-jdbc-metadata/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-store-jpa/pom.xml
===================================================================
--- trunk/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-store-jpa/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-svn/pom.xml
===================================================================
--- trunk/extensions/dna-connector-svn/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-connector-svn/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-connector-svn</artifactId>

Modified: trunk/extensions/dna-mimetype-detector-aperture/pom.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-search-lucene/pom.xml
===================================================================
--- trunk/extensions/dna-search-lucene/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-search-lucene/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-classfile/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-classfile/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-cnd/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-cnd/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>

Modified: trunk/extensions/dna-sequencer-ddl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-ddl/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-images/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-java/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-java/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-java/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,12 +3,12 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
 	<packaging>jar</packaging>
-	<version>0.7</version>
+	<version>1.0.0.Beta1-SNAPSHOT</version>
 	<name>JBoss DNA jBPM jPDL Sequencer</name>
 	<description>
 		JBoss DNA Sequencer that processes jPDL XML document

Modified: trunk/extensions/dna-sequencer-mp3/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-mp3/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-msoffice/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-msoffice/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-text/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-text/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-text/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-xml/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-xml/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-sequencer-zip/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-zip/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/extensions/dna-sequencer-zip/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.7</version>
+    <version>1.0.0.Beta1-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.jboss.dna</groupId>
 	<artifactId>dna</artifactId>
-	<version>0.7</version>
+	<version>1.0.0.Beta1-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>JBoss DNA</name>
 	<url>http://www.jboss.org/dna</url>
@@ -11,8 +11,8 @@
 		JBoss DNA is a JCR repository implementation with support for federation and sequencing.
 	</description>
 	<scm>
-		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/tags/dna-0.7</connection>
-    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.7</developerConnection>   
+		<connection>scm:svn:https://anonsvn.jboss.org/repos/dna/trunk</connection>
+    <developerConnection>scm:svn:https://svn.jboss.org/repos/dna/trunk</developerConnection>   
 	</scm>
   <issueManagement>
     <system>jira</system>

Modified: trunk/utils/dna-jpa-ddl-gen/pom.xml
===================================================================
--- trunk/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/utils/dna-jpa-ddl-gen/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/web/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/web/dna-web-jcr-rest/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest</artifactId>

Modified: trunk/web/dna-web-jcr-rest-client/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/web/dna-web-jcr-rest-client/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->

Modified: trunk/web/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 19:10:49 UTC (rev 1594)
+++ trunk/web/dna-web-jcr-rest-war/pom.xml	2010-01-11 19:11:52 UTC (rev 1595)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.7</version>
+		<version>1.0.0.Beta1-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest-war</artifactId>


